使用pgAdmin III,我可以在postgresql服务器上列出所有数据库。
但是使用pgAdmin,我当时只能删除1个数据库。例如,删除30个数据库需要花费大量时间......
那么,您的删除方法是什么,例如,所有名称中包含“june”一词的数据库?
我可能需要构建一个Bash脚本。没问题。但是你会在这个脚本中使用哪个命令?
我已经在网上搜索了好几个小时而没有成功解决这个问题...
感谢您的帮助。
答案 0 :(得分:5)
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
实用程序,您可能需要提供连接选项(see documentation)
答案 1 :(得分:1)
非常感谢Abelisto。
真的很高兴有他的剧本!
这是我们最后一个运作良好的剧本。绝对棒极了!经过几个月的搜索。
#!/bin/bash
clear
export PGPASSWORD="ssadas"
PATTERN=$1
echo "Le paramètre passé est : $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 odoo "$line"
done
echo
echo "Les bases de données ayant $PATTERN dans leur nom on été effacées!"
echo
exit
答案 2 :(得分:0)
我认为一种更优雅的方法是使用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