我使用以下命令每天备份我们的Postgres开发环境:
pg_dumpall -h 127.0.0.1 -U user -w | gzip blah.gz
由于9.0现在是一个发布候选版,我想每天将这个备份还原到Postgres9.0rc1环境中进行测试,但我不知道如何编写重复执行的脚本。是否有某个目录可以清空以实现此功能?
我使用以下命令每天备份我们的Postgres开发环境:
pg_dumpall -h 127.0.0.1 -U user -w | gzip blah.gz
由于9.0现在是一个发布候选版,我想每天将这个备份还原到Postgres9.0rc1环境中进行测试,但我不知道如何编写重复执行的脚本。是否有某个目录可以清空以实现此功能?
你可以使用 "drop cluster" 和 "create cluster" 命令来自动删除所有数据库。在 $PGDATA 目录下删除所有数据,然后使用以下命令重新初始化集群:
initdb -D /usr/local/pgsql/data
您可以使用:
$ 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
=集群名称
pg_createcluster
命令时添加 -e 'UTF-8'
标志,否则如果您需要 UTF-8 数据库而本地设置不是 UTF8,则以后可能需要进行更改。 - coffeemakr虽然这个问题已经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
说明:
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>
用于剥离“Pager usage is off”行
findstr /v "Pager"
或 findstr /b "drop"
grep 'drop'
| psql -U <user> -d postgres
将生成的一组 drop database
命令再次传输到psql中,然后执行它们,从而删除所有数据库。postgres
数据库。如果您不想发生这种情况,可以在 SELECT
中或 grep 中剥离它。以 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
/usr/local/pgsql/data
替换为你的$PGDATA
目录。例如,通过 Homebrew 安装的 PostgreSQL,其目录是/usr/local/var/postgres
。另外,如果你导出了$PGDATA
,那么可以直接运行initdb
而无需参数。最后需要注意的是删除$PGDATA
目录是一个单独的步骤,initdb
不会自动删除它。噢,如果你的postgres
服务器仍在运行,删除操作将无法正常执行。 - Radon Rosborough