面试题答案
一键面试文件损坏导致的问题
- 数据不一致:
- 主库二进制日志损坏时,从库无法获取完整准确的事件信息。若从库基于不完整的日志进行数据更新,可能导致从库数据与主库数据不一致。例如,主库执行了一系列事务操作并记录在二进制日志中,但日志损坏部分事务记录丢失,从库按损坏日志同步后,就会缺少这部分数据更新,与主库产生差异。
- 从库中继日志损坏,同样会使从库在应用日志事件时出现错误,导致从库数据更新不完整,与主库数据不一致。
- 复制中断:
- MySQL复制依赖于主库二进制日志和从库中继日志的连续性。当主库二进制日志损坏,从库在读取主库日志时会遇到错误,导致I/O线程无法正常获取日志,从而使复制中断。
- 从库中继日志损坏,SQL线程在应用日志事件时会失败,因为无法解析损坏的日志内容,进而导致复制中断。
- 数据丢失风险:
- 如果损坏的日志包含未完全同步到从库的重要数据变更,且未进行适当备份和恢复,可能会导致这部分数据丢失。例如,主库刚执行了一条重要的插入操作并记录在二进制日志中,还未来得及同步到从库,此时二进制日志损坏,这一插入数据就可能丢失。
针对不同类型文件损坏的修复措施和恢复复制步骤
- 主库二进制日志损坏:
- 使用备份恢复:
- 前提是有主库的全量备份和二进制日志备份。首先恢复主库的全量备份,例如使用
mysqlpump
或mysqldump
工具进行全量备份恢复。 - 然后应用备份的二进制日志,通过
mysqlbinlog
工具解析二进制日志,并将其应用到恢复的主库数据上。例如,假设备份文件为full_backup.sql
,二进制日志备份文件为binlog.000001
到binlog.000003
,可以先执行mysql -u root -p < full_backup.sql
恢复全量数据,再依次执行mysqlbinlog binlog.000001 | mysql -u root -p
,mysqlbinlog binlog.000002 | mysql -u root -p
,mysqlbinlog binlog.000003 | mysql -u root -p
来应用二进制日志。
- 前提是有主库的全量备份和二进制日志备份。首先恢复主库的全量备份,例如使用
- 跳过损坏部分(谨慎使用):
- 可以尝试在从库上使用
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
语句,让从库跳过一个主库日志事件,这在某些情况下(如损坏部分仅涉及一个可跳过的事件)可以恢复复制,但可能会导致数据不一致,所以要谨慎评估。 - 还可以修改从库的复制配置,通过
CHANGE MASTER TO
语句指定从库从主库的下一个有效的日志位置开始同步。例如CHANGE MASTER TO MASTER_LOG_FILE = 'binlog.000002', MASTER_LOG_POS = 1234;
(其中binlog.000002
为下一个有效日志文件,1234
为起始位置)。
- 可以尝试在从库上使用
- 使用备份恢复:
- 从库中继日志损坏:
- 重新获取日志:
- 停止从库复制,执行
STOP SLAVE;
。 - 删除损坏的中继日志文件,默认情况下中继日志文件位于从库的数据目录下,文件名为
relay - log.00000*
,可以删除损坏的文件。 - 重启从库的I/O线程,执行
START SLAVE IO_THREAD;
,I/O线程会从主库重新获取二进制日志并生成新的中继日志,然后启动SQL线程应用新的中继日志,执行START SLAVE SQL_THREAD;
,恢复复制。
- 停止从库复制,执行
- 使用备份恢复(若有从库备份):
- 恢复从库的全量备份(如果有)。
- 重新配置从库复制,指向主库,使用
CHANGE MASTER TO
语句配置主库的连接信息和起始日志位置,然后启动从库复制START SLAVE;
。
- 重新获取日志: