数据库备份恢复性能MySQLPostgreSQLSRE
场景
您的生产 MySQL 或 PostgreSQL 数据库崩溃。您从备份开始恢复,但恢复时间比预期长得多,导致停机时间延长和收入损失。当备份策略未针对性能进行优化时,此场景很常见。
症状
- 恢复吞吐量低于预期磁盘吞吐量。
- 恢复期间 I/O 等待高。
- 数据库日志显示检查点或 WAL 回放缓慢。
- CPU 利用率低但 I/O 饱和。
诊断
MySQL
- 使用
SHOW PROCESSLIST识别正在运行的查询。 - 检查 InnoDB 状态:
SHOW ENGINE INNODB STATUS\G查看历史列表长度、日志序列号。 - 使用
iostat -x 1监控 I/O。 - 通过慢查询日志分析恢复期间的慢查询。
PostgreSQL
- 查询
pg_stat_activity获取活动恢复进程。 - 使用
pg_stat_bgwriter和pg_stat_wal跟踪检查点和 WAL 活动。 - 检查
pg_current_wal_lsn和复制延迟(如果适用)。 - 如果启用
pg_stat_statements,识别开销大的查询。
命令
MySQL
- 备份:
xtrabackup --backup --target-dir=/backup - 恢复:
xtrabackup --prepare --target-dir=/backup然后xtrabackup --copy-back --target-dir=/backup - 调优 InnoDB:
SET GLOBAL innodb_buffer_pool_size = RAM的80%;SET GLOBAL innodb_log_file_size = 4G; - 并行恢复:使用
mysqlpump的--parallel-schemas或带线程的mydumper。
PostgreSQL
- 备份:
pg_dump -Fc -d dbname > db.dump - 恢复:
pg_restore -d dbname -j 4 db.dump(并行作业) - 调优:
ALTER SYSTEM SET maintenance_work_mem = '2GB';ALTER SYSTEM SET max_parallel_maintenance_workers = 4; - 检查点:
CHECKPOINT;和pg_switch_wal();
风险控制
- 始终在预演环境测试恢复。
- 使用压缩和加密的备份以减少 I/O,但要管理 CPU 开销。
- 监控磁盘性能,考虑使用 SSD。
- 对于大型数据库,使用增量备份以减少恢复时间。
- 实施时间点恢复(PITR),使用 MySQL 的二进制日志和 PostgreSQL 的 WAL。
- 设置适当的
innodb_buffer_pool_size或shared_buffers,避免磁盘抖动。
回滚
如果恢复失败或超时: 1. 停止恢复进程。 2. 验证备份文件完整性。 3. 如果可用,从其他备份点恢复。 4. 如果检测到损坏,从完整备份恢复并应用日志。 5. 通知团队并考虑升级到 OpsGlobal。
验证
- 在 MySQL 中运行
CHECKSUM TABLE,或在 PostgreSQL 中使用pg_checksums。 - 比较行数和预期值。
- 运行几个查询验证应用程序功能。
- 如果使用副本,检查复制状态。
何时提交 OpsGlobal 工单
- 您的备份/恢复始终超过 RTO 的 50% 以上。
- 恢复期间出现无法解释的性能下降。
- 需要调整数据库参数以优化恢复。
- 需要全面的备份策略审查。
适用场景
适合正在处理 Database、数据库, 备份, 恢复, 性能 相关问题的团队,用于快速建立排查路径和交付标准。
问题背景
了解如何诊断和改进 MySQL 和 PostgreSQL 数据库的备份恢复性能。本文涵盖恢复缓慢的常见场景、诊断步骤、命令、风险控制、回滚过程和验证技术,以最大程度减少停机时间。
排查步骤
先确认影响范围和最近变更,再收集日志、配置、指标和链路数据,最后按风险从低到高执行修复。
命令示例
示例命令请替换为你的真实资源名,并使用环境变量保存账号、密码、token 等敏感信息。
风险说明
生产环境操作前需要确认备份、权限边界、变更窗口和回滚路径,避免扩大故障影响。
回滚方案
保留原配置和发布版本;如修复后指标异常,立即回退配置、镜像或数据库变更并复核日志。
交付清单
问题定位记录、关键命令、修复步骤、验证结果、后续优化建议。
遇到类似技术问题?
如果你的服务器、K8s、Docker、CI/CD、数据库或监控系统出现类似问题,可以提交日志和配置文件,我们帮你远程诊断。