3.6. 使用 SQL 转储备份 PostgreSQL 数据
SQL 转储方法基于使用 SQL 命令生成转储文件。当转储上传回数据库服务器时,它会按与转储时相同的状态重新创建数据库。
以下 PostgreSQL 客户端应用程序为 SQL 转储提供了保证:
-
pg_dump
转储单个数据库,而没有集群范围的有关角色或表空间的信息 -
pg_dumpall
转储给定集群中的每个数据库,并保留集群范围的数据,如角色和表空间定义。
默认情况下,pg_dump
和 pg_dumpall
命令将它的们结果写入标准输出。要将转储保存到文件中,请将输出重定向到 SQL 文件。生成的 SQL 文件可以是文本格式,也可以是允许并行且可以更详细地控制对象恢复的其他格式。
您可以在任何可访问数据库的远程主机中执行 SQL 转储。
3.6.1. SQL 转储的优点和缺陷 复制链接链接已复制到粘贴板!
与其他 PostgreSQL 备份方法相比,SQL 转储具有以下优点:
-
SQL 转储是唯一一个不是特定于服务器版本的 PostgreSQL 备份方法。
pg_dump
工具的输出可以重新加载到 PostgreSQL 的后续版本中,这不适用于文件系统级备份或持续归档。 - SQL 转储是将数据库传输到不同计算机架构(比如从 32 位服务器传输到 64 位服务器)的唯一方法。
-
SQL 转储提供内部一致的转储。转储表示
pg_dump
开始运行时的数据库的快照。 -
pg_dump
工具在运行时不会阻止对数据库的其他操作。
SQL 转储的一个缺点是,与文件系统级备份相比,它需要更长的时间。
3.6.2. 使用 pg_dump 执行 SQL 转储 复制链接链接已复制到粘贴板!
要转储没有集群范围信息的单个数据库,请使用 pg_dump
工具。
先决条件
-
您必须对要转储的所有表具有读的权限。若要转储整个数据库,您必须以
postgres
超级用户或具有数据库管理员特权的用户身份运行命令。
流程
转储没有集群范围信息的数据库:
pg_dump <db_name> > <dump_file>
$ pg_dump <db_name> > <dump_file>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要指定
pg_dump
将联系哪个数据库服务器,请使用以下命令行选项:-h
选项用来定义主机的。默认主机要么是本地主机,要么是
PGHOST
环境变量所指定的主机。-p
选项用来定义端口 。默认端口是由
PGPORT
环境变量或编译后的默认值指明的。
3.6.3. 使用 pg_dumpall 执行 SQL 转储 复制链接链接已复制到粘贴板!
要转储给定数据库集群中的每个数据库,并保留集群范围的数据,请使用 pg_dumpall
工具。
先决条件
-
您必须以
postgres
超级用户或具有数据库管理员特权的用户身份运行命令。
流程
转储数据库集群中的所有数据库,并保留集群范围的数据:
pg_dumpall > <dump_file>
$ pg_dumpall > <dump_file>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要指定 pg_dumpall 将联系哪个数据库服务器,请使用以下命令行选项:
-h
选项用来定义主机的。默认主机要么是本地主机,要么是
PGHOST
环境变量所指定的主机。-p
选项用来定义端口 。默认端口是由
PGPORT
环境变量或编译后的默认值指明的。-l
选项用来定义默认数据库。这个选项使您能够选择一个与初始化过程中自动创建的
postgres
数据库不同的默认数据库。
3.6.4. 使用 pg_dump 恢复转储的数据库 复制链接链接已复制到粘贴板!
要从使用 pg_dump
工具转储的 SQL 转储中恢复数据库,请按照以下步骤操作。
先决条件
-
您必须以
postgres
超级用户或具有数据库管理员特权的用户身份运行命令。
流程
创建新数据库:
createdb <db_name>
$ createdb <db_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 验证在转储数据库中拥有对象或被赋予了对象权限的所有用户是否已存在。如果这样的用户不存在,恢复将无法重新创建具有原始所有权和权限的对象。
运行
psql
工具来恢复pg_dump
工具创建的文本文件转储:psql <db_name> < <dump_file>
$ psql <db_name> < <dump_file>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中
<dump_file>
是pg_dump
命令的输出。要恢复非文本文件转储,请使用pg_restore
工具:pg_restore <non-plain_text_file>
$ pg_restore <non-plain_text_file>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.6.5. 使用 pg_dumpall 恢复转储的数据库 复制链接链接已复制到粘贴板!
要从使用 pg_dumpall
工具转储的数据库集群中恢复数据,请按照以下步骤操作。
先决条件
-
您必须以
postgres
超级用户或具有数据库管理员特权的用户身份运行命令。
流程
- 确保在转储数据库中拥有对象或已被赋予了对象权限的所有用户已存在。如果这样的用户不存在,恢复将无法重新创建具有原始所有权和权限的对象。
运行
psql
工具来恢复pg_dumpall
工具创建的文本文件转储:psql < <dump_file>
$ psql < <dump_file>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中
<dump_file>
是pg_dumpall
命令的输出。
3.6.6. 在另一服务器上执行数据库的 SQL 转储 复制链接链接已复制到粘贴板!
可以直接从一台服务器转储到另一台服务器,因为 pg_dump
和 psql
可以写入管道并从管道读取。
流程
要从一个服务器到另一个服务器转储数据库,请运行:
pg_dump -h <host_1> <db_name> | psql -h <host_2> <db_name>
$ pg_dump -h <host_1> <db_name> | psql -h <host_2> <db_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.6.7. 在恢复过程中处理 SQL 错误 复制链接链接已复制到粘贴板!
默认情况下,如果出现 SQL 错误,psql
会继续执行,从而导致数据库只部分恢复。
要修改默认行为,在恢复转储时使用以下任一方法:
先决条件
-
您必须以
postgres
超级用户或具有数据库管理员特权的用户身份运行命令。
流程
设置
ON_ERROR_STOP
变量,使psql
在发生 SQL 错误时退出,且退出状态为 3:psql --set ON_ERROR_STOP=on <db_name> < <dump_file>
$ psql --set ON_ERROR_STOP=on <db_name> < <dump_file>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 指定整个转储作为一个事务来恢复,以便要么全部完成,要么全部取消。
当使用
psql
工具恢复文本文件转储时:psql -1
$ psql -1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当使用
pg_restore
工具恢复非文本文件转储时:pg_restore -e
$ pg_restore -e
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
请注意,当您使用此方法时,即使是小的错误也可能会取消已运行了数小时的恢复操作。