如何在 Ubuntu VPS 上备份 PostgreSQL 数据库
什么是 PostgreSQL?
PostgreSQL 是一个现代数据库管理系统。它经常用于存储和操作与网站和应用程序相关的信息。
与任何类型的有价值数据一样,实施备份方案以防止数据丢失非常重要。本指南将介绍一些备份 PostgreSQL 数据的实用方法。
我们将使用 Ubuntu 12.04 VPS 和 PostgreSQL 9.1。大多数现代发行版和最新版本的 PostgreSQL 将以类似的方式运行。
如何使用 pg_dump 备份 PostgreSQL 数据库
PostgreSQL 包含一个名为“pg_dump”的实用程序,可用于将数据库信息转储到文件中以供备份。
pg_dump 实用程序从 Linux 命令行运行。该命令的基本语法是:
pg_dump name_of_database > name_of_backup_file
该命令必须由具有读取所有数据库信息权限的用户运行,因此大部分时间以超级用户身份运行。
对于真实世界的示例,我们可以登录到 \postgres\ 用户并在默认数据库(也称为 \postgres\)上执行命令:
sudo su - postgres
pg_dump postgres > postgres_db.bak
这个命令实际上是一个 PostgreSQL 客户端程序,所以它可以从远程系统运行,只要该系统可以访问数据库。
如果你想备份一个远程系统,你可以传递指定远程主机的“-h”标志,以及指定远程端口的“-p”标志:
pg_dump -h remote_host -p remote_port name_of_database > name_of_backup_file
如有必要,您还可以使用“-U”选项指定不同的用户。语法是:
pg_dump -U user_name -h remote_host -p remote_port name_of_database > name_of_backup_file
请记住,pg_dump 存在与任何其他客户端程序相同的身份验证要求。这意味着您必须确保您的登录凭据对您尝试备份的系统有效。
如何使用 PostgreSQL 从 pg_dump 恢复数据转储
要恢复由 pg_dump 创建的备份,您可以将文件重定向到 psql 标准输入:
psql empty_database < backup_file
注意:此重定向操作不会创建有问题的数据库。这必须在运行命令之前在单独的步骤中完成。
例如,我们可以创建一个名为 \restored_database\ 的新数据库,然后通过发出以下命令重定向一个名为 \database.bak\ 的转储:
createdb -T template0 restored_database
psql restored_database < database.bak
应使用 \template0\ 作为基础创建空数据库。
为了正确恢复,必须执行的另一个步骤是重新创建拥有或授予数据库中对象权限的任何用户。
例如,如果您的数据库有一个由用户 \test_user\ 拥有的表,您必须在导入之前在恢复系统上创建它:
createuser test_user
psql restored_database < database.bak
处理恢复错误
默认情况下,PostgreSQL 将尝试继续恢复数据库,即使在此过程中遇到错误。
在许多情况下,由于显而易见的原因,这是不可取的。尝试找出将数据库恢复到正确状态所需的操作可能会很痛苦。
我们可以通过键入以下命令告诉 PostgreSQL 在出现任何错误时停止:
psql --set ON_ERROR_STOP=on restored_database < backup_file
这将导致 PostgreSQL 恢复操作在遇到错误时立即停止。
这仍然会给您留下一个尚未完全恢复的残缺数据库,但您现在可以在错误出现时对其进行处理,而不是在最后处理错误列表。
在许多情况下,更好的选择可以是“-1”(第一)或“--单笔交易”选项:
psql -1 restored_database < backup_file
此选项在单个事务中执行所有恢复细节。
此选项与 \ON_ERROR_STOP\ 设置之间的区别在于,这将完全成功或不导入任何内容。
对于较大的恢复来说,这可能是一个代价高昂的权衡,但在许多情况下,不给您留下部分恢复的数据库的好处大大超过了该成本。
如何备份和恢复 PostgreSQL 中的所有数据库
为了节省时间,如果您想备份系统中的所有数据库,可以使用名为“pg_dumpall”的实用程序。
它们的命令语法与常规的 pg_dump 命令非常相似,但它不指定数据库。相反,该命令会备份每个可用的数据库:
pg_dumpall > backup_file
您可以通过使用默认数据库将文件传递给 psql 来恢复数据库:
psql -f backup_file postgres
结论
备份是任何类型的数据存储计划中必不可少的组成部分。幸运的是,PostgreSQL 为您提供了有效备份重要信息所需的实用程序。
与任何类型的备份一样,定期测试备份以确保可以正确还原创建的副本非常重要。您创建的备份只有在实际可用于恢复系统时才有用。