实例中所有frm文件消失的幕后黑手
今天遇到MySQL实例中frm文件无缘无故消失,而ibd文件仍然存在。晚上终于把问题定位到,罪魁祸首是pt-stalk. 长话短说,使用pt-stalk时,有个选项很重要,一定要注意,dest 千万不要指定为 MySQL的数据目录,或是其它重要的目录,因为指定的这个目录中的文件
今天遇到MySQL实例中frm文件无缘无故消失,而ibd文件仍然存在。晚上终于把问题定位到,罪魁祸首是pt-stalk.
长话短说,使用pt-stalk时,有个选项很重要,一定要注意,–dest 千万不要指定为 MySQL的数据目录,或是其它重要的目录,因为指定的这个目录中的文件有可能被删除的风险。
我今天使用的pt-stalk 命令在3个实例上运行,第一个实例的命令为:
pt-stalk --log /u01/mysql/pt-stalk.log --dest /u01/mysql --pid /u01/mysql/pt-stalk.pid --daemonize --collect-gdb --sleep 1 --iterations 20 --function status --variable Slave_trx_pending --threshold 100 -- --user=root --port=3306 --host=127.0.0.1
悲翠的发现复制中断,原因是没有找到表。登录上去看,只有库,没有任何表!
再看看/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文件消失的幕后黑手, 感谢原作者分享。
上一篇: php采用curl实现伪造IP来源的方法
下一篇: PHP5中的引用