pg_dump 拍一张一致的快照
pg_dump 使用事务数据的一致视图导出一个 PostgreSQL 数据库,同时允许其他会话继续提交变化。它避免了普通逐表复制的问题:前一张表和后一张表不会因为读取时间不同,就混入彼此不一致的已提交状态。但快照只是备份契约的一部分;归档还必须覆盖需要的数据范围,能被兼容工具读取,并且实际恢复成可使用的数据库。 理解快照覆盖什么 导出期间,快照可见的行构成稳定视图。后续提交不会因为某张表读得晚,就逐渐混进同一次导出。并行导出让各 worker 使用同步快照,而不是各自随时读取。并行 dump 要求 directory 格式;custom 格式支持并行恢复,但不支持并行导出。格式选择应根据导出与恢复两边的需求分别判断,不能把两个方向混为一谈。 数据库快照不会自动让整个业务流程原子化。如果应用分两个事务提交批次头和明细,一致快照完全可能合法地落在这两次提交之间。序列状态也不是普通的 MVCC 行数据,外部文件和其他服务更不在数据库快照范围内。恢复需要满足什么业务不变量,必须结合真实事务边界和所需数据源定义,不能只凭“同一快照”推断所有业务状态都完整。 计算负载和依赖 普通读取和写入通常可以在导出期间继续,但 pg_dump 仍获取 ACCESS SHARE 锁,也消耗 CPU、I/O、连接和快照存活时间。冲突的 DDL 可能等待,也可能使导出失败;长快照会阻止某些旧行版本被清理。增加并行 worker 只是用更多并发资源换时间,不会让备份开销消失。应记录事务年龄和线上负载,避免把备份的影响误认为无关故障。 使用备库可以分担读取,但要考虑恢复冲突与复制延迟,而且从备库导出会排除非日志表内容。一次 pg_dump 也不包含集群级角色和表空间。扩展、所有者、权限、排序规则行为及目标配置,都需要通过合适机制纳入恢复计划。把整个库拆成互不协调的单表 dump,可能丢失共同快照,也可能遗漏这些表依赖的对象,不能当成免费的优化。 坏掉的样子 归档目录能够列出,不代表恢复一定成功。目标缺少角色或扩展时,表数据可能只恢复了一部分。应把归档加载到隔离空库,明确处理错误,再验证业务不变量和代表性查询。pg_restore 默认遇到 SQL 错误仍会继续,最后汇总错误数量;只看到最后一条查询有输出是不够的。小型演练可使用单事务恢复获得原子性,但这个模式不能与并行 job 同用。 工具版本是另一条边界。pg_dump 客户端会拒绝比自身主版本更新的服务器,输出主要面向相同或更新的目标版本,不能保证可以加载到更旧的主版本。应核对客户端、源库、目标库、扩展和恢复选项的实际组合,而不是只说“都是 PostgreSQL 所以可以恢复”。即使语法兼容,排序规则或权限差异也可能改变应用行为。 ...