通过pgAdmin III,我可以列出PostgreSQL服务器上的所有数据库。
但是在pgAdmin中,我每次只能删除一个数据库。要删除30个数据库就需要一次次地删除,非常耗时。
那么,如果我想删除所有名称中包含“june”单词的数据库,你会怎么做?
也许我需要编写一个Bash脚本来处理这个问题。这也不是问题。但是在该脚本中,你会使用哪个命令?
我在网上搜索了很多小时,但没有找到解决方案……
感谢您的帮助。
通过pgAdmin III,我可以列出PostgreSQL服务器上的所有数据库。
但是在pgAdmin中,我每次只能删除一个数据库。要删除30个数据库就需要一次次地删除,非常耗时。
那么,如果我想删除所有名称中包含“june”单词的数据库,你会怎么做?
也许我需要编写一个Bash脚本来处理这个问题。这也不是问题。但是在该脚本中,你会使用哪个命令?
我在网上搜索了很多小时,但没有找到解决方案……
感谢您的帮助。
psql -c "copy (select datname from pg_database where datname like '%june%') to stdout" | while read line; do
echo "$line"
#dropdb -i "$line"
done
或者使用for
循环更可靠(while
块在父上下文中执行,因此需要对其主体进行一些额外的移动):
for dbname in $(psql -c "copy (select datname from pg_database where datname like '%june%') to stdout") ; do
echo "$dbname"
#dropdb -i "$dbname"
done
还有一个选项-X
可用于psql
(不使用~/.psqlrc
文件),以避免不必要的输出。
对于psql
和dropdb
工具,您可能需要提供连接选项(请查看文档)。
非常感谢Abelisto。
以下是我们经过多个月的搜索后得到的最终脚本,目前运行良好。
#!/bin/bash
clear
export PGPASSWORD="xxxxx"
PATTERN=$1
echo "Pattern parameter: $PATTERN"
/usr/bin/psql -U odoo -d postgres -c "copy (select datname from pg_database where datname like '%$PATTERN%') to stdout" | while read line; do
echo "$line"
dropdb -U xxxx "$line"
done
echo
echo "Databases which names matches pattern $PATTERN were deleted!"
echo
exit
有很多好的、强大的解决方案;但这里有一个bash单行命令,可以保存在老魔法书中:
psql -Atqc "SELECT 'DROP DATABASE ' || quote_ident(datname) || ';' FROM pg_database WHERE datname like '%june%';" | psql
这里使用了一个 SELECT
语句,它在对 pg_database
表进行查询时,围绕返回的 datname
构建了一些字符串。
SELECT 'DROP DATABASE ' || quote_ident(datname) || ';'
FROM pg_database WHERE datname like '%june%';
这是通过在shell中使用psql
参数直接执行的:
-A
打印表元素时关闭填充对齐功能。
-t
关闭打印列名和结果行计数。这对于与shell脚本中的-c选项一起使用很有用。
-q
指定psql应安静地工作。默认情况下,它会打印欢迎和退出消息,并提示每个查询。如果使用此选项,则不会发生任何这些情况。这对于使用-c选项很有用。
-c query
指定psql要执行一个查询字符串、查询,然后退出。这对于shell脚本特别是与shell脚本中的-q选项一起使用时很有用。
然后将所有这些管道传递到另一个调用psql
中,并使用| psql
执行DROP DATABASE
查询。
我认为更优雅的方法是使用for循环。
请注意,选项-t
和-A
使psql仅返回数据(无标题或额外空格)。这使您可以直接从psql创建bash数组。
# drop all molnet* databases
sql="select datname from pg_database where datname like '%june%'"
dbDelNames=`psql -U postgres -t -A -c "$sql"`
for dbName in ${dbDelNames[@]}
do
echo -e "\n\n[INFO] Drop $dbName.\n"
psql -U postgres -c "DROP DATABASE IF EXISTS ${dbName};"
done
for dbname in $(psql -c "copy (select datname from pg_database where datname like 'test%') to stdout"); do echo "$dbname"; dropdb "$dbname"; done;
- Cees Timmerman