尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MySQL数据库备份与恢复:从逻辑备份到binlog增量恢复的完整指南

MySQL数据库备份与恢复:从逻辑备份到binlog增量恢复的完整指南 Mysql数据库的备份与恢复做开发或运维的朋友应该都有过这种经历深夜十二点手机突然响起电话那头业务方急得声音发抖——“刚才那张表的数据被误删了能恢复吗”先别慌能不能恢复、能恢复到什么程度取决于你平时有没有做好备份以及备份方式选得对不对。我做了几年数据库相关工作踩过不少坑也总结出了一套从备份策略设计、工具选择到恢复演练都比较完整的流程。这篇就围绕 Mysql 数据库的备份与恢复把核心思路、常用工具、实操步骤和避坑经验一次讲透适合后端开发、运维人员以及正在做数据库课程设计的在校同学参考。1. 先理清备份方案逻辑备份、物理备份和增量日志1.1 逻辑备份与物理备份的选择逻辑Mysql 的备份方式按“备份出来的东西长什么样”来分主要是两大类逻辑备份和物理备份。逻辑备份最典型的工具就是 mysqldump。它会把你数据库里的表结构、数据记录、触发器等转换成一条条 SQL 语句导出成一个 .sql 文本文件。恢复的时候把这份 SQL 文件重新执行一遍数据就回来了。打个比方逻辑备份就像你把自己家的家当列了一份详细的物品清单清单上不仅写了每件东西在哪、长什么样还写清楚了如何原样摆回去。好处是这份“清单”拿到哪台新电脑上都能照着还原跨版本、跨平台都能用坏处是数据量一大导出和导入都慢而且生成 SQL 和执行 SQL 的过程本身都会占用不少资源。物理备份则完全不同它是直接拷贝 Mysql 的数据目录也就是那些底层的 ibdata1、.ibd、frm 之类的物理文件。你可以先停掉数据库做冷备份也可以用工具做在线热备。物理备份相当于把你整个家连家具带装修整体拍照、打包搬走恢复的时候直接放到原位置。它的优势是速度极快数据量达到几十 GB、几百 GB 级别时逻辑备份可能导出要几个小时而物理备份可能十几分钟就完成了缺点是你拷贝下来的物理文件对数据库版本、存储引擎甚至操作系统都有依赖跨版本迁移时兼容性要求比较严格。那到底怎么选我的经验是数据量小、偶尔做一次备份、希望备份文件能方便地在不同环境间迁移优先考虑逻辑备份数据量大、对备份和恢复时间敏感、生产环境每天要做全量备份的物理备份更可靠。当然很多团队的最终方案是两者结合——日常用物理备份保证恢复速度关键小表再做逻辑备份方便精细化操作。1.2 全量备份、增量备份与 binlog 的分工备份策略里还有一个绕不开的概念全量备份和增量备份。全量备份就是把 Mysql 里所有数据完整导出一份。优点是做完之后你手里有了一份无法再完整的“底稿”恢复时只需要恢复这一份缺点也很明显——如果每天都做全量备份不仅备份耗时长生成的备份文件也会占用大量磁盘空间。比如一个 100 GB 的库每天导一次一周就是 700 GB 的历史备份文件。增量备份则聪明一些它只记录从上次备份之后发生变化的数据。Mysql 的增量备份核心依赖就是 binlog二进制日志。你可以把 binlog 理解成数据库的“行车记录仪”每一个会改变数据的操作INSERT、UPDATE、DELETE 等都会被记录下来。所以只要你有了一次全量备份再加上之后产生的所有 binlog理论上你就可以把数据库恢复到任意一个时间点——只要这段时间的 binlog 没有丢、没有损坏。实践中最常见的组合拳是每天凌晨做一次全量备份平时开启 binlog 并定期归档等到要恢复的时候先恢复最近一次全量备份再重放从那次备份以来产生的 binlog 增量就能把数据推到故障发生前的状态。这套方案兼顾了备份成本与恢复粒度是目前大多数生产环境采用的标准做法。另外提一个概念叫差异备份它介于全量和增量之间备份的是“自上次全量备份以来所有变化的数据”。和增量备份的区别在于增量备份是基于上次任意类型的备份全量或增量做的而差异备份永远基于最近一次全量。差异备份的恢复比增量简单只需全量最近一次差异但备份文件往往比增量大。在我实际接触过的团队里日志型业务多用“全量增量”金融类对恢复时间敏感的系统偶尔会加差异备份来缩短重放日志的时间。2. mysqldump 逻辑备份实操参数、命令与细节2.1 一条靠谱的 mysqldump 命令长什么样mysqldump 是 Mysql 自带的逻辑备份工具几乎所有 Mysql 发行版都包含了它。它的用法本身不算复杂难的是把参数组合用对否则备份出来的数据可能不一致甚至恢复时报错。先看我平时最常用的一条命令mysqldump -u root -p --single-transaction --master-data2 \ --routines --triggers --events --set-gtid-purgedOFF \ your_db_name /backup/your_db_$(date %Y%m%d_%H%M%S).sql这里每个参数都有讲究。--single-transaction 是最关键的一个参数它利用 InnoDB 的 MVCC多版本并发控制机制在备份开始时开启一个一致性的读事务。这样备份过程中其他连接依然可以正常读写数据不会被锁住而且导出的数据是一致性快照不会出现“备份到一半数据变了导致逻辑矛盾”的情况。注意这个参数只对 InnoDB 表有效MyISAM 表不支持事务想要一致性还是得加 --lock-tables 把表锁住。--master-data2 会在导出的 SQL 文件头部注释掉一行 CHANGE MASTER TO 语句里面记录了备份时刻的 binlog 文件名和位置比如 MASTER_LOG_FILEmysql-bin.000014, MASTER_LOG_POS2564。这行信息是后续做时间点恢复的关键线索相当于备份文件的“时间坐标”。值设为 2 表示以注释形式记录如果你设成 1恢复时可能会触发从库同步的额外行为所以日常备份我建议用 2。--routines、--triggers、--events 分别表示把存储过程、触发器、事件调度器一起备份出来。很多新手只导了表数据恢复后才发现存储过程全丢了再补导非常麻烦所以这三个参数我每次必加。--set-gtid-purgedOFF 是在 GTID 模式下5.6 以后引入的主从复制模式用来控制是否导出 GTID 信息。如果你只是做单机备份恢复不涉及主从环境加上这个参数可以避免恢复时报 GTID 相关的错误。如果你的备份要用来搭建新的从库那就需要保留 GTID 信息这个参数就要根据实际情况调整了。备份文件的路径和命名也建议规范。我用的是按日期时间命名的方式这样备份文件自然形成了时间序列后面做定期清理也很方便。2.2 单库、多库、单表的备份与恢复差异mysqldump 备份作用范围越大命令选项也越不同。日常工作中最常见的三种粒度是整库、多个指定库、指定表。整库备份备份的是某个库里的所有对象。命令很直接mysqldump -u root -p --single-transaction --routines --triggers --events db1 db1.sql如果要备份多个库可以加 --databases 参数比如mysqldump -u root -p --single-transaction --databases db1 db2 dbs.sql这里有个坑要提醒新手加了 --databases 之后导出的 SQL 文件里会自动包含 CREATE DATABASE 和 USE 语句。恢复时哪怕目标库里没有这个 database也会自动创建。如果不加 --databases导出的文件里只有 CREATE TABLE 和 INSERT默认恢复到当前 USE 的库中。只备份指定表就更灵活了mysqldump -u root -p --single-transaction db1 t_user t_order tables.sql这种方式的典型场景是某个表误删了数据但整个库恢复成本太高于是单独导出这张表如果之前有这张表的单独备份来恢复。不过说实话指定表的备份一般只在做数据归档或调试时用作为生产备份策略的主力还是有点单薄。恢复操作本身不复杂比如把备份文件导回数据库mysql -u root -p db1 /backup/db1.sql或者先登录 mysql 再用 source 命令SOURCE /backup/db1.sql;需要注意的是如果备份文件包含 CREATE DATABASE 语句恢复时不需要指定库名直接执行即可如果备份时没加 --databases恢复前要先确保目标库存在否则会报 Unknown database 的错误。2.3 大表备份太慢试试压缩与分库分表导出单表数据量大到一定程度mysqldump 的导出速度会明显下降生成的 SQL 文件动不动就是几个 GB传输、存储都是问题。这时候两个简单有效的优化手段管道压缩和并行备份。管道压缩很简单就是把 mysqldump 的标准输出直接交给 gzip 处理mysqldump -u root -p --single-transaction your_db | gzip /backup/your_db.sql.gz恢复时先解压再导入gunzip -c /backup/your_db.sql.gz | mysql -u root -p your_db实测下来压缩比通常在 5:1 到 10:1 之间对以字符串为主的表效果尤其明显。代价是备份和恢复时 CPU 会升高一些但和磁盘 I/O 节省的收益相比完全值得。并行备份则是把一个大库拆成多个库、多张表分别同时导出。严格来说 mysqldump 本身不支持并发导出同一个库但你可以写脚本把多个库分给多个后台进程for db in db1 db2 db3 db4; do mysqldump -u root -p --single-transaction $db /backup/${db}.sql done wait如果你用的是 Percona 分支的 Mysql自带了一个 xtrabackup 工具做物理热备的效率远高于 mysqldump大数据量场景我更推荐你优先了解它。后面我会专门讲物理备份方案。3. binlog 增量恢复从全量备份精确恢复到任意时间点3.1 先搞懂 binlog 的三种格式binlog 是 Mysql 实现数据复制和增量恢复的核心它记录了对数据库有变更的操作。很多朋友都听说过 binlog但对其三种格式的区别不一定清楚STATEMENT、ROW 和 MIXED。STATEMENT 格式记录的是 SQL 语句本身比如 DELETE FROM t_user WHERE age 18。优点是日志量小、可读性强缺点是在某些场景下回放结果可能和原始执行不一致比如语句里用了 NOW() 函数或者依赖了当前会话的变量重放时得到的数据就会走样。ROW 格式则记录每一行数据的具体变化。比如你 UPDATE 了 1000 行binlog 里会记录这 1000 行每一行的旧值和新值。优点是恢复结果绝对精确任何函数调用、并发环境都不会影响回放结果代价是日志量暴涨尤其是大批量 UPDATE 或 DELETE 的场景。MIXED 格式则是 Mysql 自动判断默认用 STATEMENT遇到可能产生歧义的语句时自动切换为 ROW。从恢复角度我强烈建议在生产环境把 binlog 格式设为 ROWbinlog_format row理由很简单备份恢复和误操作回滚最重要的就是“精确”二字。ROW 格式虽然日志文件大一些但它能让你知道某条数据事前长什么样、事后长什么样配合 mysqlbinlog 做闪回分析时异常好用。检查当前 binlog 配置SHOW VARIABLES LIKE log_bin; SHOW VARIABLES LIKE binlog_format;如果 log_bin 是 OFF那 binlog 压根没开启增量恢复也就无从谈起了。开启 binlog 需要在配置文件 my.cnf 的 [mysqld] 段加一行log_bin /var/log/mysql/mysql-bin改完后重启 Mysql 服务生效。3.2 mysqlbinlog 工具实操基于时间和位置的精确回放mysqlbinlog 是 Mysql 自带的 binlog 解析工具它能把二进制日志翻译成可读的 SQL 语句还能按时间范围或日志位置提取特定片段。先要看懂当前有哪些 binlog 文件SHOW BINARY LOGS;查询某个 binlog 文件中的事件列表SHOW BINLOG EVENTS IN mysql-bin.000014 LIMIT 20;这个命令输出里会有每个事件的 Log_name、Pos位置、Event_type、Info 等列Info 列会显示具体执行的 SQL。恢复操作中我们通常用 mysqlbinlog 工具把 binlog 内容重放给 mysql 客户端基于时间点恢复比如回放 2024-06-20 09:00:00 到 10:00:00 之间的日志mysqlbinlog --start-datetime2024-06-20 09:00:00 \ --stop-datetime2024-06-20 10:00:00 \ mysql-bin.000014 | mysql -u root -p基于日志位置恢复更精确不会因为同一秒内多条语句而误伤mysqlbinlog --start-position2564 --stop-position89732 mysql-bin.000014 | mysql -u root -p为什么要按位置而不是完全按时间因为时间过滤其实比较“粗”同一秒内可能有多条操作你只想恢复某一条之前的数据时用位置是最可靠的。位置信息的查询方式就是前面讲的 SHOW BINLOG EVENTS。实战中一个更常见的场景是某条 DELETE 误删了大量数据你想跳过这条 DELETE只回放它之前的 binlog。这时你先把 binlog 导成文本找到那条 DELETE 语句的位置然后:mysqlbinlog --stop-position误删语句的起始位置 mysql-bin.000014 | mysql -u root -p这样就恢复了删除前的所有状态那条误删语句及其之后的操作暂时不执行然后再根据业务情况把后续正常操作筛选出来重新执行。3.3 全量备份加 binlog 的组合恢复全流程真正到位的恢复是把全量备份和 binlog 增量串成一条链。假设每天凌晨 2:00 做全量备份今天上午 10:00 有人误删了核心表数据。恢复步骤如下先恢复最近一次全量备份文件mysql -u root -p your_db /backup/your_db_前一天.sql找到全量备份文件头部记录的 binlog 文件名和位置。因为我们之前备份用了 --master-data2直接看备份文件的头部注释即可grep CHANGE MASTER TO /backup/your_db_前一天.sql假设输出显示 MASTER_LOG_FILEmysql-bin.000020, MASTER_LOG_POS154。这意味着从 binlog 的 154 位置开始就是备份完成之后产生的新变更。接下来确认误删操作发生在哪个 binlog、哪个位置然后把从 154 到误删操作之前的日志重放进去mysqlbinlog --start-position154 --stop-position误删操作的起始位置 \ mysql-bin.000020 mysql-bin.000021 | mysql -u root -p your_db执行完这一串命令你的数据库就已经恢复到了误删操作前的那一刻。注意如果 binlog 有多个文件把它们按顺序都传给 mysqlbinlog 即可工具会自动衔接。这套流程我在面试和实际故障处理中碰到过无数次核心要点就两个一是全量备份文件的 binlog 位置要清晰记录二是误删操作在 binlog 里的位置要精确定位。位置定错了恢复出来的数据就会多走一步或少走一步。4. 物理备份、冷备份与跨服务器迁移4.1 冷备份实操与适用场景冷备份简单说就是停库、拷贝数据文件、再启库。虽然听起来“土”但在特定场景下它是非常高效的方案尤其是数据量特别大、或者你只想快速做一次服务器迁移时。冷备份的大致步骤# 1. 优雅关闭数据库服务 mysqladmin -u root -p shutdown # 或者 systemctl stop mysqld # 2. 确认进程已停止 ps -ef | grep mysqld # 3. 拷贝整个数据目录 cp -a /var/lib/mysql /backup/mysql_cold_backup_$(date %Y%m%d) # 4. 重启数据库服务如果需要 systemctl start mysqld恢复时更加暴力停库把原来的数据目录备份一份防止操作失误再把之前拷贝的数据目录整个放回去启动数据库就完事。冷备份最大的优点是简单、可靠、恢复极快。缺点也好理解停机时间内的数据无法写入业务必须接受一段时间的不可用。所以冷备份一般适合维护窗口期内的数据迁移、测试环境初始化、或者作为“最后一张底牌”定期做一次。线上核心业务不太可能用冷备份作为唯一的备份策略大多还是和热备工具配合。4.2 用 Percona XtraBackup 做物理热备如果既想走物理备份的速度又不希望停机Percona XtraBackup 是绕不开的工具。它能在数据库运行状态下完成 InnoDB 表的物理备份是目前很多团队做大数据量备份的首选。XtraBackup 备份的核心步骤# 1. 执行完整备份 xtrabackup --backup --target-dir/backup/xtra_full_$(date %Y%m%d) \ --userroot --passwordyour_password # 2. 对备份文件进行恢复准备 xtrabackup --prepare --target-dir/backup/xtra_full_20240620第一步是把当前数据文件复制到备份目录第二步是让备份文件进入一致可用的状态。这个过程会把备份期间产生的事务日志也合并到数据文件中所以 prepare 是必须的。恢复到目标实例时先停库把目标数据目录清空或者移到临时位置然后把备份文件内容全部拷贝回数据目录再启动服务。和 mysqldump 的对比很直观对比项mysqldump 逻辑备份XtraBackup 物理备份备份速度慢逐条生成 SQL快直接复制文件恢复速度慢逐条执行 SQL快整体文件就位备份文件大小小压缩后更小大基本等同数据量在线备份支持InnoDB支持跨版本兼容较灵活有限制适用数据量适合小中型库适合大中大型库数据量在 50 GB 以下mysqldump 压力不大超过 100 GB我一般直接上 XtraBackup。4.3 使用 Navicat 和 dbx 工具做图形化备份写完命令行工具再提两个图形化工具。Navicat 是很流行的数据库管理客户端连接上 Mysql 后右键数据库选择“备份”或“转储 SQL 文件”就能完成逻辑备份。它的优点是操作门槛低适合不熟悉命令行的同学缺点是自动化能力有限难以纳入定时任务和脚本体系。另外它本身的备份功能在不同版本之间差异不小建议优先用 mysqldump 而非依赖 Navicat 的备份模块。dbx 是一款新兴的数据库桌面工具因为轻量、跨平台在开发者圈子里热度上升很快。它同样支持连接 Mysql 并执行导出导入操作。这类工具我更愿意定位成“日常调试和临时备份的补充”真正定时、批量、核心的备份任务还是交给命令行脚本更踏实。图形化工具偶尔会碰到大表导出超时、内存溢出之类的问题命令行工具反而没这些毛病。5. 备份策略规划与自动化别让备份停在“口头承诺”上5.1 备份周期、保留策略与 RTO/RPO 评估备份策略设计的核心其实不是技术而是两个业务指标RTO恢复时间目标和 RPO恢复点目标。RTO 指故障发生后你需要多久把业务拉起来RPO 指你能容忍丢失多长时间的数据。这俩数值直接决定你的备份频率和恢复方式。举个例子某交易系统要求 RPO 不超过 10 分钟那就意味着 binlog 归档周期不能超过 10 分钟否则一旦故障最多会丢 10 分钟的数据如果要求 RTO 不超过 1 小时那全量备份的恢复和 binlog 重放速度必须在 1 小时内完成备份存储在本地磁盘还是云对象存储、网络带宽多少都会成为瓶颈。制定备份周期时我一般给团队建议这样组合每日凌晨 01:00 做一次全量备份XtraBackup 或 mysqldump根据数据量选择。每日凌晨 01:30 把备份文件同步到异地存储OSS、云盘、另一台服务器均可。binlog 实时开启每 10 分钟或每 100 MB 切换一次并自动归档。全量备份保留最近 7 天异地备份保留最近 30 天月度归档保留一年。备份文件保留策略要结合磁盘成本和合规要求权衡不是越多越好。但有一条铁律备份文件至少有一个副本存放在和源数据库不同的物理位置上防止机房断电、磁盘阵列损坏这类单点故障。5.2 写一个自动备份清理的 Shell 脚本自动化是备份落地的基础手动备份注定会漏。我提供一个可以“拿来就改”的 Shell 脚本骨架#!/bin/bash # 功能Mysql 全量备份 binlog 归档 过期清理 # 建议配合 crontab 使用 BACKUP_DIR/backup/mysql DATE$(date %Y%m%d_%H%M%S) DB_USERbackup_user DB_PASSbackup_password DB_NAMEyour_db MYSQL_CMDmysql -u${DB_USER} -p${DB_PASS} MYSQLDUMP_CMDmysqldump -u${DB_USER} -p${DB_PASS} --single-transaction --master-data2 --routines --triggers --events # 1. 创建当日备份目录 mkdir -p ${BACKUP_DIR}/${DATE} # 2. 逻辑备份并压缩 ${MYSQLDUMP_CMD} ${DB_NAME} | gzip ${BACKUP_DIR}/${DATE}/${DB_NAME}.sql.gz # 3. 检查备份文件大小为 0 则报警退出 if [ ! -s ${BACKUP_DIR}/${DATE}/${DB_NAME}.sql.gz ]; then echo Backup file is empty! | mail -s Mysql backup failed youremail.com exit 1 fi # 4. 记录备份后的 binlog 位置 cat ${BACKUP_DIR}/${DATE}/${DB_NAME}.sql.gz | gunzip | grep CHANGE MASTER TO ${BACKUP_DIR}/backup_position.log # 5. 删除 7 天前的本地备份 find ${BACKUP_DIR} -type d -mtime 7 -name 20* -exec rm -rf {} \; echo Backup done at $(date) ${BACKUP_DIR}/backup.log然后配置 crontab0 1 * * * /usr/local/bin/mysql_backup.sh /var/log/mysql_backup.log 21脚本里的邮件报警只是示意生产环境我更推荐接入钉钉、企业微信或短信告警。一个报警机制缺失的备份系统和没有备份在本质上差别不大。5.3 恢复演练备份是否可用只有试过才知道说句不好听的不少团队做了多年备份一次都没恢复过直到故障来了才发现备份文件一直在报错或者压根不完整。备份做得好不好检验的唯一标准是“能不能顺利恢复”。恢复演练应该定期做建议每季度至少演练一次。演练方式有两种一种是临时搭建一个测试实例把最新的全量备份和部分 binlog 恢复到测试库占用的资源不多但能覆盖 90% 的流程另一种是模拟故障把生产库拉到备机上做完整恢复顺便评估 RTO 是否达标。演练时需要重点验证的事项备份文件是否完整、非空、文件大小在正常范围。恢复到新实例后数据行数是否和源库一致。存储过程、触发器、事件是否完整恢复。binlog 路径和时间点恢复是否可用能否精确恢复到最后一次操作。备份脚本中的报警机制是否真的能触发。我自己的习惯是把演练结果记录成文档包括恢复耗时、遇到的问题、调整项逐步优化备份脚本和恢复流程。这比故障发生时再来翻资料高效得多。5.4 常见恢复报错速查表最后分享一份踩坑汇总都是实操中容易碰到的问题直接对照排查会快很多报错现象可能原因处理建议ERROR 1049 (42000): Unknown database xxx恢复时目标库不存在先执行 CREATE DATABASE xxx或备份时加 --databasesERROR 1449: The user specified as a definer does not exist备份文件里包含视图/存储过程definer 账户在目标库不存在重建相应账号或恢复时用 sed 替换 definer 再导入ERROR 1064: You have an error in your SQL syntax备份或 binlog 文件在传输、解压中被截断损坏检查源文件 md5重新传输用 mysqlbinlog 时注意版本匹配ERROR 1418: This function has none of DETERMINISTIC...导入自定义函数时未满足二进制日志安全条件设置 log_bin_trust_function_creators1mysqldump: Got error: 1045: Access denied备份账号权限不足至少赋予 SELECT、LOCK TABLES、SHOW VIEW、TRIGGER 权限mysqlbinlog: unknown option --ssl工具版本和服务端不匹配统一 Mysql 客户端和数据库大版本关于权限我习惯单独建一个备份专用账号不使用 root 备份既安全又方便权限收敛CREATE USER backup_userlocalhost IDENTIFIED BY strong_password; GRANT SELECT, LOCK TABLES, SHOW VIEW, TRIGGER, PROCESS, RELOAD, EVENT ON *.* TO backup_userlocalhost; FLUSH PRIVILEGES;6. 真实故障复现一次误删表后的完整恢复纸上谈兵再多不如亲手跑一遍。我模拟一个常见的故障场景业务表 t_order 在上午 10:32 被误执行了 DELETE 操作整表数据被清空好在当天凌晨 01:00 有过全量备份binlog 也完整。下面是从零开始恢复的全过程。先看全量备份文件里记录的 binlog 位置grep CHANGE MASTER TO /backup/mysql/20240620/t_order.sql输出CHANGE MASTER TO MASTER_LOG_FILEmysql-bin.000028, MASTER_LOG_POS1284。登录数据库确认 binlog 文件和错误位置SHOW BINARY LOGS; SHOW BINLOG EVENTS IN mysql-bin.000028;假设最后一条 DELETE 语句的开始位置是 45912。那么恢复命令分两步走第一步恢复全量备份mysql -u root -p business_db /backup/mysql/20240620/t_order.sql第二步回放从 1284 到 45912 的所有 binlogmysqlbinlog --start-position1284 --stop-position45912 \ mysql-bin.000028 mysql-bin.000029 | mysql -u root -p business_db等待执行完毕查询表数据SELECT COUNT(*) FROM t_order;如果数字和业务方给出的正常值一致表示恢复成功。如果只差了一点点多半是 stop-position 定位偏了再往上调整一下重新回放即可。整个过程看起来不复杂但真正考验人的是在压力下冷静定位 binlog 位置。所以我强烈建议每个团队都自己动手做几遍模拟演练把常用命令熟记于心真出问题时才能从容应对。另外回放 binlog 前务必先备份一份当前状态防止回放出错造成二次破坏。写到这里我想起自己刚开始维护数据库时也是第一次遇到误删数据的情况当时手忙脚乱地翻文档、试命令最后用了快两个小时才恢复成功。后来我养成了两个习惯一个是备份脚本里每次备份后自动记录 binlog 位置另一个是每季度拉一个测试实例做恢复演练。这两个习惯让我在后面再遇到类似故障时基本二十分钟内就能完成恢复。数据库备份与恢复看起来是偏底层的运维工作但它直接决定了业务出问题时的“逃生通道”有多宽。希望这篇内容能帮你把这条通道修得又宽又稳。
返回列表