如何在Postgres上删除所有数据库?

30

我使用以下命令每天备份我们的Postgres开发环境:

pg_dumpall -h 127.0.0.1 -U user -w | gzip blah.gz

由于9.0现在是一个发布候选版,我想每天将这个备份还原到Postgres9.0rc1环境中进行测试,但我不知道如何编写重复执行的脚本。是否有某个目录可以清空以实现此功能?

5个回答

22

你可以使用 "drop cluster" 和 "create cluster" 命令来自动删除所有数据库。在 $PGDATA 目录下删除所有数据,然后使用以下命令重新初始化集群:

initdb -D /usr/local/pgsql/data

3
要明确一点,你应该将 /usr/local/pgsql/data 替换为你的 $PGDATA 目录。例如,通过 Homebrew 安装的 PostgreSQL,其目录是 /usr/local/var/postgres。另外,如果你导出了 $PGDATA,那么可以直接运行 initdb 而无需参数。最后需要注意的是删除 $PGDATA 目录是一个单独的步骤,initdb 不会自动删除它。噢,如果你的 postgres 服务器仍在运行,删除操作将无法正常执行。 - Radon Rosborough

22

您可以使用:

$ pg_dropcluster 9.2 main
$ pg_createcluster 9.2 main
$ pg_ctlcluster 9.2 main start
$ pg_restore -f your_dump_file

其中9.2=集群版本main=集群名称


1
如果我没记错的话,那些不是标准的Postgres工具。 - user330315
1
这些是Debian脚本。 - Russ
1
我建议在使用 pg_createcluster 命令时添加 -e 'UTF-8' 标志,否则如果您需要 UTF-8 数据库而本地设置不是 UTF8,则以后可能需要进行更改。 - coffeemakr
4
警告:这也会清除你的postgres配置——我只是想要一个干净的数据库,而不是还清之前优化过的配置……咕噜咕噜嘟囔至少这不是生产服务器。 - Michael J. Evans

17

虽然这个问题已经9年了,但它仍然是删除所有数据库的第二个谷歌搜索结果。如果您只想从N个数据库转移到0个,而不干扰配置并且无需在文件系统中查找,那么这是一个更好的答案:

https://dev59.com/nWAf5IYBdhLWcg3wizEE#24548640

根据此答案,以下脚本将生成N个drop database命令,每个命令针对一个非模板数据库:

select 'drop database "'||datname||'";'
from pg_database
where datistemplate=false;

从那里开始,您可以手动编辑和运行,或将其进一步传递到脚本中。下面是一个有点冗长的一行命令:

echo \pset pager off \copy (select 'drop database "'||datname||'";' from pg_database where datistemplate=false) to STDOUT; | psql -U <user> -d postgres | <appropriate grep> | psql -U <user> -d postgres

说明:

  1. 这是一系列的管道命令。
  2. echo \pset pager off \copy (select 'drop database "'||datname||'";' from pg_database where datistemplate=false) to STDOUT; 生成一个字符串给psql执行。
    1. \pset pager off 确保您获取所有记录而不是那些(54 行)废话
    2. \copy (select 'drop database "'||datname||'";' from pg_database where datistemplate=false) to STDOUT; 执行上述查询,并将结果发送到STDOUT。由于我们以 \pset 开头,所以必须这样做。
  3. | psql -U <user> -d postgres 将该字符串传输到psql,然后执行它。用您想要使用的用户名代替 <user>
  4. | <appropriate grep> 用于剥离“Pager usage is off”行
    1. Windows 用户可以使用 findstr /v "Pager"findstr /b "drop"
    2. *nix 用户可以使用 grep 'drop'
  5. | psql -U <user> -d postgres 将生成的一组 drop database 命令再次传输到psql中,然后执行它们,从而删除所有数据库。
  6. 警告:如果没有任何其他过滤,这将会删除所有数据库,包括 postgres 数据库。如果您不想发生这种情况,可以在 SELECT 中或 grep 中剥离它。

1
更新已接受的答案以跟上时代的步伐。 - chotchki
酷爽的帮助来了。非常有效。 - Otieno Rowland

1
将数据库数据移动到其他地方可以达到删除的效果,如果你改变主意,你可以轻松地把它移回来(但一定要小心并备份你的数据)。
1) 创建一个目录(例如:/home/USERNAME/BACKUPDIR)。
2) 作为超级用户进入postgresql数据目录(Fedora例如:/var/lib/pgsql/)。
3) 将data移动到备份文件夹中:mv data /home/USERNAME/BACKUPDIR
4) 然后使用sudo postgresql-setup --initdb --unit postgresql重新初始化新的数据库。

-1

以 root 身份运行此命令:

cd /var/lib/postgresql/ && sudo -u postgres psql -c "SELECT 'dropdb '||datname||'' FROM pg_database WHERE datistemplate = false AND datallowconn = true And datname NOT IN ('postgres')" |grep ' dropdb ' |  sudo -u postgres /bin/bash ; cd

你的回答可以通过添加更多支持信息来改进。请[编辑]以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Ethan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接