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

cho*_*hki 21 postgresql

我每天都使用以下命令开发postgres开发框:pg_dumpall -h 127.0.0.1 -U user -w | gzip blah.gz

由于9.0现在是候选版本,我想每天将这个每日备份恢复到postgres9.0rc1框进行测试,但是我不知道如何反复编写脚本.有一些我可以用来做这个的目录吗?

hal*_*dan 18

您可以执行"drop cluster"和"create cluster",它将自动擦除所有数据库.擦除$ PGDATA目录中的所有数据并使用以下命令重新启动集群:

initdb -D /usr/local/pgsql/data
Run Code Online (Sandbox Code Playgroud)

  • 要清楚,你应该用`$ PGDATA`目录替换`/ usr/local/pgsql/data`.例如,对于通过Homebrew安装的PostgreSQL,它是`/ usr/local/var/postgres`.另外,如果你导出`$ PGDATA`,那么你可以运行没有参数的`initdb`.最后,请注意删除`$ PGDATA`目录是一个单独的步骤.`initdb`不适合你.哦,如果你的`postgres`服务器仍在运行,删除将无法正常工作. (3认同)

Fer*_*ida 14

您可以使用:

$ pg_dropcluster 9.2 main
$ pg_createcluster 9.2 main
$ pg_ctlcluster 9.2 main start
$ pg_restore -f your_dump_file
Run Code Online (Sandbox Code Playgroud)

其中9.2= cluster versionmain=cluster name

  • 警告:这也会破坏你的 postgres 配置——我真的只是想要一个 CLEAN 数据库,而不是清除以前优化的配置...... *抱怨*至少它是非生产服务器。 (3认同)

Joh*_*aus 10

诚然,这个问题此时已有 9 年历史,但它仍然是删除所有数据库的第二个谷歌结果。如果您只想从 N 个 DB 转到 0,而无需使用您的配置,也不想翻阅文件系统,这是一个更好的答案:

/sf/answers/1718404831/

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

select 'drop database "'||datname||'";'
from pg_database
where datistemplate=false;
Run Code Online (Sandbox Code Playgroud)

从那里,您可以手动编辑和运行,或进一步传输到脚本中。这是一个有点冗长的单行:

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> 用于去除“寻呼机使用已关闭”行
    1. Windows 用户可以使用findstr /v "Pager"findstr /b "drop"
    2. *nix 用户可以使用 grep 'drop'
  5. | psql -U <user> -d postgres将生成的drop database命令集再次通过管道传输到 psql 中,由 psql 执行它们,从而删除所有数据库
  6. 警告:如果没有任何额外的过滤,这也会删除postgres数据库。SELECT如果您不希望发生这种情况,您可以在 the或 grep 中删除它。