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

时间:2010-09-16 19:28:20

标签: postgresql

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

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

4 个答案:

答案 0 :(得分:16)

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

initdb -D /usr/local/pgsql/data

答案 1 :(得分:14)

您可以使用:

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

其中9.2 = cluster versionmain = cluster name

答案 2 :(得分:1)

在这一点上,问题已经存在了9年,但是它仍然是删除所有数据库的第二个Google结果。如果您只想从N个DB转到0个而不使用配置,也不想在文件系统中翻找,这是一个更好的答案:

https://stackoverflow.com/a/24548640/3499424

从答案中,以下脚本将生成N个drop database命令,每个非模板DB都会生成一个命令:

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的使用已关闭”行
    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或grep中删除它。

答案 3 :(得分:0)

将数据库数据移动到其他位置可以实现与删除相同的功能,并且您可以轻松地将其移回以防您改变主意(但在任何情况下都要小心并备份数据)。

1)在某处创建一个目录(例如/home/USERNAME/BACKUPDIR)。

2)作为超级用户访问postgresql数据目录(Fedora,例如/var/lib/pgsql/

3)将data移至备用文件夹:mv data /home/USERNAME/BACKUPDIR

4)然后使用例如重新启动新数据库。 sudo postgresql-setup --initdb --unit postgresql