【发布时间】:2019-11-07 01:21:17
【问题描述】:
我每天使用以下方式回顾我们的 postgres 开发箱: pg_dumpall -h 127.0.0.1 -U 用户 -w | gzip blah.gz
由于 9.0 现在是候选版本,我想每天将此每日备份恢复到 postgres9.0rc1 盒子以进行测试,但我不确定如何重复编写脚本。是否有一些目录可以让我执行此操作?
【问题讨论】:
标签: postgresql
我每天使用以下方式回顾我们的 postgres 开发箱: pg_dumpall -h 127.0.0.1 -U 用户 -w | gzip blah.gz
由于 9.0 现在是候选版本,我想每天将此每日备份恢复到 postgres9.0rc1 盒子以进行测试,但我不确定如何重复编写脚本。是否有一些目录可以让我执行此操作?
【问题讨论】:
标签: postgresql
您可以执行“删除集群”和“创建集群”,这将自动清除所有数据库。擦除 $PGDATA 目录中的所有数据并使用以下命令重新初始化集群:
initdb -D /usr/local/pgsql/data
【讨论】:
/usr/local/pgsql/data 替换为您的$PGDATA 目录。例如,对于通过 Homebrew 安装的 PostgreSQL,它是 /usr/local/var/postgres。此外,如果您导出$PGDATA,那么您可以不带参数运行initdb。最后,请注意删除您的$PGDATA 目录是一个单独的步骤。 initdb 不是为你做的。哦,如果您的 postgres 服务器仍在运行,则删除将无法正常工作。
你可以使用:
$ 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 version 和main = cluster name
【讨论】:
-e 'UTF-8' 标志 pg_createcluster 否则如果您想要 UTF-8 数据库并且区域设置未设置为 UTF8,您可能需要稍后进行更改。
在这一点上,这个问题已经 9 年了,但它仍然是删除所有数据库的第二个谷歌结果。如果您只是想从 N DBs 转到 0 而不使用您的配置并且还需要翻阅文件系统,这是一个更好的答案:
https://stackoverflow.com/a/24548640/3499424
从答案来看,以下脚本将生成 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
解释:
echo \pset pager off \copy (select 'drop database "'||datname||'";' from pg_database where datistemplate=false) to STDOUT; 生成一个字符串供 psql 执行
\pset pager off 确保您获得所有记录,而不是那些(54 行)废话\copy (select 'drop database "'||datname||'";' from pg_database where datistemplate=false) to STDOUT; 执行上述查询,将结果发送到 STDOUT。我们必须这样做,因为我们以\pset 为首。| psql -U <user> -d postgres 管道将字符串输入 psql 执行它。将<user> 替换为您要使用的用户| <appropriate grep> 用于剥离“寻呼机使用已关闭”行
findstr /v "Pager" 或findstr /b "drop"
grep 'drop'
| psql -U <user> -d postgres 将生成的 drop database 命令集再次通过管道传输到 psql 中,psql 执行它们,从而删除所有数据库postgres 数据库。如果您不希望发生这种情况,可以在 SELECT 或 grep 中删除它。【讨论】:
将数据库数据移动到其他地方可以达到与删除相同的效果,并且您可以轻松地将其移回以防您改变主意(但请务必小心并在任何情况下备份您的数据)。
1) 在某处创建一个目录(例如/home/USERNAME/BACKUPDIR)。
2) 以超级用户身份进入 postgresql 数据目录(Fedora 例如/var/lib/pgsql/)
3) 将data 移动到您的备份文件夹:mv data /home/USERNAME/BACKUPDIR
4) 然后使用例如重新初始化一个新数据库。 sudo postgresql-setup --initdb --unit postgresql
【讨论】: