概述
PostgreSQL 提供了多种备份和恢复策略,旨在满足不同规模和需求的数据库环境。以下是 PostgreSQL 备份和恢复的主要方法概览:
1. SQL 转储
SQL 转储 是一种逻辑备份方法,使用 pg_dump 和 pg_dumpall 工具将数据库或整个集群的状态导出为 SQL 语句流。这种方法非常适合小型到中型数据库,易于迁移和恢复。
1.1. 恢复转储
使用 pg_restore 命令可以从 SQL 转储文件中恢复数据库,可以选择性地恢复特定的表、模式或数据序列。
1.2. 使用 pg_dumpall
pg_dumpall 用于备份 PostgreSQL 集群的全局信息,如用户账户、角色、数据库列表等,通常与 pg_dump 结合使用以实现整个集群的备份。
1.3. 处理大型数据库
对于大型数据库,SQL 转储可能耗时且占用大量磁盘空间。此时,可以采用以下两种物理备份方法之一。
2. 文件系统级备份
文件系统级备份 是一种物理备份技术,涉及在数据库停止服务时(或在某些情况下,使用 pg_start_backup 和 pg_stop_backup 命令在 PostgreSQL 运行时)直接复制数据目录。这种方法适用于数据库大小超出 SQL 转储能力的情况,但要求在备份期间数据库不可用。
3. 连续存档和时间点恢复(PITR)
连续存档 和 时间点恢复 (PITR) 提供了更高级别的数据保护和恢复灵活性。这种方法通过归档写前日志 (WAL) 来实现,允许数据库恢复到故障发生前的任意时间点。
3.1. 设置 WAL 归档
要启用 PITR,必须配置 PostgreSQL 以归档 WAL 文件。这通常涉及设置 archive_mode 和 archive_command 参数,并确保有足够的存储空间来保存 WAL 文件。
3.2. 进行基础备份
在启用连续归档后,需要创建一个基础备份,这是数据库在某个时间点的完整快照。基础备份可以使用 pg_basebackup 工具创建。
3.3. 使用低级 API 进行基础备份
除了使用 pg_basebackup,还可以通过调用 pg_start_backup 和 pg_stop_backup 函数来创建基础备份,这提供了更多的控制和灵活性。
3.4. 使用连续归档备份进行恢复
恢复时,将基础备份恢复到一个新的数据目录,并应用自备份时刻以来归档的 WAL 文件,以恢复到所需的点。
3.5. 时间线
PostgreSQL 使用时间线来追踪数据库的历史状态,这在 PITR 中特别重要,因为每个时间点恢复都可能创建一个新的时间线分支。
3.6. 提示和示例
在实施 PITR 时,有几个关键点需要注意,例如正确配置归档存储位置、确保 WAL 文件的完整性以及理解时间线的概念。
3.7. 注意事项
使用 PITR 时,需要考虑数据一致性和事务的隔离级别,以避免潜在的数据不一致。
1. SQL 转储
以下是pg_dump的一些关键特性和用法:
1、基本用法:
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -d mydb >dumpfile
是最简单的用法,其中dbname是要备份的数据库名,dumpfile是生成的转储文件。
2、输出格式:
3、远程备份:
4、权限需求:
5、连接参数:
6、跨版本和架构兼容性:
7、一致性保证:
8、高级选项:
1.1 恢复转储
恢复pg_dump创建的数据库转储通常涉及以下步骤和注意事项:
1、恢复命令:
psql -U postgres -h 127.0.0.1 -p 5432 -W --set ON_ERROR_STOP=on mydb < dumpfile
非文本格式的转储文件(如tar或directory格式)需要使用pg_restore命令进行恢复。
2、数据库先决条件:
createdb -T template0 dbname
3、用户权限:
4、错误处理:
psql -U postgres -h 127.0.0.1 -p 5432 -W --set ON_ERROR_STOP=on mydb <dumpfile
5、事务模式:
6、跨服务器转储:
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -d mydb | psql -U postgres -h 127.0.0.1 -p 5432 -W --set ON_ERROR_STOP=on mydb
7、转储上下文:
8、分析统计信息:
9、批量数据加载:
1.2. 使用 pg_dumpall
pg_dumpall是一个用于备份整个PostgreSQL数据库集群的工具,包括所有数据库以及集群范围内的信息,如角色和表空间定义。下面是使用pg_dumpall进行备份和恢复的主要要点:
1、备份整个集群:
pg_dumpall -U postgres -h 127.0.0.1 -p 5432 -W >dumpfile
2、恢复集群:
psql -U postgres -h 127.0.0.1 -p 5432 -W -f dumpfile postgres
3、超级用户权限:
4、表空间路径:
5、工作原理:
6、仅备份集群范围数据:
pg_dumpall --globals-only -U postgres -h 127.0.0.1 -p 5432 -W > dumpfile
1.3. 处理大型数据库
处理大型数据库备份时,确实会遇到操作系统文件大小限制的问题,特别是当数据库规模庞大到单个文件无法容纳整个备份的情况下。以下是处理大型数据库备份的一些策略:
1、使用压缩转储:
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -d mydb | gzip > filename.gz
gunzip -c filename.gz | psql -U postgres -h 127.0.0.1 -p 5432 -W -d mydb
2、使用拆分:
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -d mydb | split -b 2G - filename
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -d mydb | split -b 2G --filter='gzip > $FILE.gz'
cat filename* |psql -U postgres -h 127.0.0.1 -p 5432 -W -d mydb
3、使用自定义转储格式(Custom Dump Format):
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -Fc mydb > filename
pg_restore -U postgres -h 127.0.0.1 -p 5432 -W -d mydb filename
4、使用并行转储和恢复:
pg_dump -U postgres -h 127.0.0.1 -p 5432 -W -j 3 -F d -f pgsqlbackup-dir mydb
2. 文件系统级备份
文件系统级备份是一种直接复制PostgreSQL数据库存储数据的文件的方法,这种方法虽然直观,但存在一些重要的局限性:
1、服务器停机需求:
2、整体备份限制:
tar -cf backup.tar /usr/local/pgsql/data
3、一致快照:
4、多文件系统限制:
5、使用rsync进行备份:
6、文件系统备份与SQL转储比较:
3. 连续存档和时间点恢复 (PITR)
PostgreSQL 使用预写日志(WAL)来记录所有对数据库数据文件的更改,这不仅对于崩溃后的恢复至关重要,还允许了一种被称为连续存档(或在线备份)的高级备份策略。以下是这种备份方法的关键特点和步骤:
1、WAL 日志:
2、结合文件系统备份与 WAL 备份:
3、连续备份与时间点恢复:
4、暖备用系统:
5、限制与要求:
6、工具与兼容性:
为了有效利用连续存档策略,必须确保WAL文件的归档流程可靠,以便在需要时能够进行完整的数据库恢复。这种方法虽然管理上更复杂,但在需要高可用性和灾难恢复能力的场景中非常有价值。
3.1. 设置 WAL 归档
在PostgreSQL中设置WAL(Write-Ahead Logging)归档涉及以下几个关键步骤和注意事项:
1、配置参数:
将/var/lib/pgsql/16/data/pg_wal目录下的文件cp到/var/lib/pgsql/16/archivedir/目录中
archive_mode = on
wal_level = replica
archive_command = 'test ! -f /var/lib/pgsql/16/archivedir/%f && cp %p /var/lib/pgsql/16/archivedir/%f'
新建目录记得授权
chmod 700 ./archivedir/
chown -R postgres:postgres ./archivedir/
2、档案命令:
3、安全和权限:
4、错误处理和监控:
5、自定义归档模块:
6、配置文件的备份:
7、WAL段切换和优化:
8、SQL命令的WAL优化:
3.2. 进行基础备份
在PostgreSQL中,pg_basebackup工具用于创建基础备份,这是数据库恢复的基础。以下是使用pg_basebackup进行基础备份的关键点:
1、创建备份:
2、备份模式与性能:
3、WAL归档:
4、备份历史记录:
5、WAL文件保留:
6、多备份集:
3.3 使用低级 API 进行基础备份
使用PostgreSQL的低级API进行基础备份是一种更精细控制备份流程的方法,虽然比使用pg_basebackup复杂,但它提供了更多的定制选项。以下是使用低级API进行基础备份的主要步骤:
1、开启备份:
postgres=# SELECT pg_backup_start(label => 'label', fast => false);
2、执行文件系统备份:
3、终止备份:
postgres=# SELECT * FROM pg_backup_stop(wait_for_archive => true);
4、记录备份元数据:
5、WAL段归档:
6、监控归档过程:
3.3.1 备份数据目录
在进行PostgreSQL数据库备份时,重要的是要确保备份策略能够有效地捕获所有必要的数据,同时避免不必要的元素。以下是从提供的文档中总结的关键点:
1、备份数据目录:确保备份包含数据库集群目录下的所有文件。如果使用了外部表空间,记得也备份它们,并确保备份工具能正确处理符号链接。
2、排除特定文件:从备份中排除以下文件和目录:
3、备份标签和表空间映射:备份标签文件包含了关于备份会话的重要元数据,如标签字符串、运行时间和起始WAL文件名。表空间映射文件记录了表空间符号链接的信息,这对于恢复过程至关重要。
4、在服务器停止时备份:虽然推荐在服务器运行时进行备份以利用PostgreSQL的流复制和热备份特性,但在服务器停止时进行备份也是可能的。在这种情况下,你需要手动跟踪每个备份及其相关联的WAL文件位置。
5、备份工具兼容性:使用如rsync或GNU tar等文件系统备份工具时,注意它们如何处理文件更改的情况。某些版本的这些工具可以配置以忽略文件更改的警告,或者区分更改文件和致命错误的退出代码。
3.4 使用连续归档备份进行恢复
当你需要使用连续归档备份(Continuous Archiving Backup)来恢复PostgreSQL数据库时,以下是详细的恢复步骤:
停止运行中的数据库服务器,以确保数据的一致性。
备份当前数据目录,如果空间允许,将整个数据目录和表空间复制到一个安全的地方。如果空间不足,至少备份pg_wal目录,以保留未归档的WAL文件。
清空数据目录,删除数据目录下的所有文件和子目录,包括所有表空间目录。
从备份恢复数据,使用文件系统备份恢复数据文件至数据目录,确保文件的所有权和权限正确。
处理WAL目录,清空pg_wal目录,如果之前保存了未归档的WAL文件,将其复制回pg_wal目录。
配置恢复参数,在postgresql.conf中设置恢复配置,包括restore_command来定义如何检索归档的WAL文件。在数据目录下创建recovery.signal文件,表明即将进行恢复。
restore_command = 'cp /var/lib/pgsql/16/archivedir/%f %p'
修改访问控制,可能需要临时修改pg_hba.conf以限制用户访问,直到确认恢复成功。
启动服务器,服务器将自动进入恢复模式,读取并应用归档的WAL文件。如果恢复中断,重启服务器可以继续恢复。
监控恢复过程,一旦恢复完成,服务器会删除recovery.signal文件,然后开始正常运行。检查数据库内容,确保数据恢复无误。
调整访问权限,确认恢复成功后,调整pg_hba.conf以允许用户正常连接。
关键配置点是restore_command,它告诉PostgreSQL如何从归档中恢复WAL文件。如果要恢复到特定的时间点或事务状态,需要设置相应的恢复目标。恢复目标必须在基本备份结束时间之后,以保证数据一致性。
如果在恢复过程中遇到损坏的WAL数据,恢复会停止,这时需要重新开始恢复流程,可能需要指定一个在损坏点之前的恢复目标。如果恢复因外部原因失败,可以重新启动恢复,从失败点继续。
3.5 时间线
在PostgreSQL中,时间线(Timeline)概念是用来处理数据库的时间点恢复(Point-in-Time Recovery, PITR)的复杂性。当你需要将数据库恢复到过去某个时刻的状态时,例如因为你意外删除了一个关键表,你可能需要使用备份的数据并结合写前日志(WAL, Write-Ahead Logging)文件来还原数据库。
当你从WAL归档中恢复数据时,PostgreSQL会在恢复完成后创建一个新的时间线。这个新时间线生成的WAL记录会被标记,以区别于原始历史记录中的记录。这是因为如果在恢复后继续操作数据库,可能会覆盖掉原本可能需要的WAL段文件,从而阻止你再次恢复到更早的状态。
WAL文件名中包含了时间线ID,这是为了确保新时间线的WAL数据不会覆盖旧时间线的数据。时间线ID在文件名中是以十六进制形式出现的,而在日志和其他输出中则常以十进制形式出现。
在处理不确定恢复时间点的情况下,你可能需要多次尝试不同的时间点恢复,这时多个时间线就显得非常有用。你可以保存多个时间线的历史,这样即使你之前放弃了某个时间线,你仍然可以从它的状态恢复。
每次创建新时间线时,PostgreSQL还会创建一个时间线历史记录文件,记录新时间线是从哪个时间线分支出来的,以及分支的时间。这些历史记录文件对于从包含多个时间线的归档中恢复数据时选择正确的WAL段文件至关重要。尽管这些文件很小,但是它们非常重要,应该被妥善保存。
在恢复过程中,PostgreSQL默认会选择归档中最新的时间线进行恢复。如果你想恢复到基本备份时的时间线或其后代时间线,你需要在recovery_target_timeline 参数中指定目标时间线ID。然而,你不能恢复到早于基本备份创建的时间线。
恢复目标设置
# 仅在执行有针对性的恢复时设置这些选项。#recovery_target = '' # 设置为 'immediate' 可以在达到一致状态后立即结束恢复(更改需重启)
#recovery_target_name = '' # 恢复到指定的命名恢复点 (更改需重启)
#recovery_target_time = '' # 恢复到指定的时间戳 (更改需重启)
#recovery_target_xid = '' # 恢复到指定的事务ID(更改需重启)
#recovery_target_lsn = '' # 恢复到指定的WAL LSN (更改需重启)
#recovery_target_inclusive = on # 指定停止的方式:
# 在指定恢复目标之后(on)
# 在指定恢复目标之前(off) (更改需重启)
#recovery_target_timeline = 'latest' # 恢复到特定的时间线: 'current', 'latest' 或时间线ID (更改需重启)
#recovery_target_action = 'pause' # 恢复目标后应执行的操作: 'pause', 'promote', 'shutdown' (更改需重启)
3.6. 提示和示例
在PostgreSQL中,连续归档(Continuous Archiving)是确保数据安全和实现时间点恢复的关键策略之一。以下是一些关于如何配置和优化连续归档的提示和示例:
3.6.1. 独立热备份
3.6.2. 压缩的归档日志
archive_command = 'gzip < %p > /mnt/server/archivedir/%f.gz'
restore_command = 'gunzip < /mnt/server/archivedir/%f.gz > %p'
3.6.3. 脚本化的archive_command
archive_command = 'local_backup_script.sh "%p" "%f"'
提示
这些提示和示例帮助你更好地理解和配置PostgreSQL的连续归档策略,从而提高数据的安全性和恢复效率。通过适当的规划和实施,你可以确保在数据丢失或损坏的情况下能够迅速恢复到预期的状态。
3.7 注意事项
在PostgreSQL中使用连续归档时,有几点重要的注意事项需要考虑,以确保数据的一致性和完整性:
创建数据库与模板数据库的修改
表空间的绝对路径问题
WAL格式与页面快照
遵循这些注意事项和建议,可以帮助你更安全、高效地利用PostgreSQL的连续归档功能,确保数据在各种情况下的完整性和可恢复性。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有