如何排查MariaDB插入数据后自动删除全部行的原因
执行以下语句将2500万行数据从一个库复制到另一个同结构表:
INSERT INTO db122.link_table SELECT * FROM db119.link_table插入耗时约8小时,过程正常完成,但之后2-3天内数据会缓慢自动删除,最终
db119.link_table变为空表。环境:MariaDB 10,InnoDB存储引擎,自动提交开启,目标库/表无触发器,通过phpMyAdmin执行语句。
已排查:通用日志仅记录初始插入语句,通用日志和错误日志中无删除语句或报错信息,无法定位原因。
排查步骤
开启二进制日志(binlog)
通用日志可能未捕获所有数据变更操作,开启binlog可以记录所有DDL和DML语句。修改my.cnf/my.ini配置:log_bin = /var/log/mysql/mysql-bin.log binlog_format = ROW重启MariaDB后,后续所有数据变更都会被记录,通过
mysqlbinlog工具解析日志,可定位删除操作的来源、时间点和具体语句。检查事件调度器状态
排查是否存在定时事件执行删除逻辑,执行以下语句:SHOW VARIABLES LIKE 'event_scheduler'; SHOW EVENTS;若
event_scheduler为ON,逐一检查事件定义,确认是否有针对db119.link_table的定时清理规则。排查应用端操作
确认是否有应用程序连接数据库执行批量删除:- 实时查看当前连接进程:
SHOW PROCESSLIST; - 检查应用代码逻辑,是否存在误删、定时清理逻辑,或异常的批量数据操作。
- 实时查看当前连接进程:
检查外键级联删除
即使目标表无触发器,若db119.link_table存在外键关联,关联表数据删除可能触发ON DELETE CASCADE级联删除。执行以下语句查看外键配置:SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = 'db119' AND TABLE_NAME = 'link_table' AND REFERENCED_TABLE_NAME IS NOT NULL;监控表行数变化
定时执行SELECT COUNT(*) FROM db119.link_table;,记录行数随时间的变化规律,判断删除是匀速持续进行还是阶段性批量操作,帮助缩小排查范围。检查备份/同步机制
确认是否存在主从同步、定时备份恢复等操作,可能误将空表数据覆盖到db119.link_table:- 查看主从状态:
SHOW SLAVE STATUS\G; - 检查备份脚本,确认是否有覆盖该表的逻辑。
- 查看主从状态:
内容的提问来源于stack exchange,提问作者Ian Kinsey

