如何在MySQL中启用复制启停操作的历史记录功能
MySQL从库复制启停操作记录方案
方案1:直接利用错误日志(最轻量,无额外开销)
MySQL默认会将复制线程的启停事件输出到错误日志中,仅需要调整错误日志输出等级即可覆盖需求,资源开销可忽略:
- 执行如下配置(可写入my.cnf持久化生效):
-- 临时生效 SET GLOBAL log_error_verbosity = 2; -- 永久生效写入my.cnf的[mysqld]段 -- log_error_verbosity = 2
- 错误日志中会自动生成对应事件,可直接提取得到需要的记录:
- 执行
STOP SLAVE后,日志会先后打印Slave I/O thread stopped、Slave SQL thread stopped,取首次出现的时间即为STOP SLAVE的执行时间 - 执行
START SLAVE后,日志会先后打印Slave I/O thread starts、Slave SQL thread starts,取首次出现的时间即为START SLAVE的执行时间
- 执行
- 可通过简单的Shell脚本定期提取日志,输出你需要的格式:
Operation | <time> STOP SLAVE | 2024-05-20 14:32:11 START SLAVE | 2024-05-20 14:35:09
方案2:使用审计插件实现精准语句记录
如果需要直接记录执行的语句本体而非线程状态,可使用审计插件配置过滤规则,仅记录复制相关操作,开销远低于通用查询日志:
- MySQL官方企业版可开启自带审计插件,配置过滤规则仅匹配
START SLAVE、STOP SLAVE、RESET SLAVE三类语句 - 社区版MySQL或MariaDB可安装开源
audit_log插件,同样配置语句过滤规则,仅记录你关注的复制启停操作,无需记录其他所有查询。
方案3:自定义状态监控表(适合需要结构化存储的场景)
你可以在从库创建一张自定义的复制状态记录表,再写一个轻量定时脚本(比如crontab每分钟执行一次,或后台进程每秒轮询一次),每次查询SHOW SLAVE STATUS的运行状态,和上一次存储的状态对比,如果发生变化就写入新的记录到表中,自动记录启停时间。
- 建表参考语句:
CREATE TABLE replication_op_log ( id INT AUTO_INCREMENT PRIMARY KEY, operation VARCHAR(20) NOT NULL, op_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
内容的提问来源于stack exchange,提问作者Barath Sankar
相关产品推荐
相关产品推荐

