悲翠的发现复制中断,原因是没有找到表。登录上去看,只有库,没有任何表!
再看看/u01/mysql/data/db下,只有ibd文件,frm文件全部消失了!
下午只是对mysqld进行了升级,并且只是重启了第一个实例,觉得与下午打的补丁没有半毛关系。
此时怀疑是脚本做的,因为上千个frm文件,包括mysql/bin, mysql/scripts全部没了。
无奈只好重做,从主库拷贝frm文件和对应的bin到对应的目录,重启搞定。
晚上10多时,发现实例2和实例3全部同事遇难,发现同样的问题,泪奔。先恢复再思考。
仔细思考,下午除了升级mysqld外,就是用了pt-stalk。pt-stalk之前也用过,没有啥问题。
三个实例都加了监控,都出了问题,唯独第四个实例没有加监控,好好的运行着,让我不能不怀疑pt-stalk。
先在pt-stalk找到可疑的代码:
# Delete collect files which more than --retention-time days old.
find "$dir" -type f -mtime +$retention_time -exec rm -f '{}' \;
和pt-stalk的伪代码对应起来,为清理老数据阶段:
while true; do
if --variable from --function is greater than --threshold; then
observations++
if observations is greater than --cycles; then
capture diagnostics for --run-time seconds
exit if --iterations is exceeded
sleep for --sleep seconds
done
done
clean up data that's older than --retention-time
sleep for --interval seconds
done
其中retention-time默认为30天,也就是说,可能有30天之前的数据被清除掉。
找到对应的代码,把rm改为echo,再在自己的测试环境运行下,果然是这个问题:
### 第一次没有sudo跑 ###
find: `/u01/ps5518/mysql-test/var/install.db/mtr': Permission denied
find: `/u01/ps5518/mysql-test/var/install.db/performance_schema': Permission denied
rm: cannot remove `/u01/ps5518/mysql-test/var/install.db/ibdata1': Permission denied
rm: cannot remove `/u01/ps5518/mysql-test/var/install.db/ib_logfile1': Permission denied
rm: cannot remove `/u01/ps5518/mysql-test/var/install.db/ib_logfile0': Permission denied
rm: cannot remove `/u01/ps5518/mysql-test/var/install.db/mysql/time_zone_transition.MYD': Permission denied
rm: cannot remove `/u01/ps5518/mysql-test/var/install.db/mysql/user.MYI': Permission denied
rm: cannot remove `/u01/ps5518/mysql-test/var/install.db/mysql/time_zone.MYI': Permission denied
rm: cannot remove `/u01/ps5518/mysql-test/var/install.db/mysql/help_relation.frm': Permission denied
### 第二次sudo跑 但把rm 替换长 echo ###
find: `/u01/ps5518/data/sbtest’: Permission denied
find: `/u01/ps5518/data/test’: Permission denied
问题到此验证。
真的好庆幸,这个备库是交易核心库,还好没有提供业务访问,否则肯定是P0故障了。
原文地址:实例中所有frm文件消失的幕后黑手, 感谢原作者分享。