php 微软 centos google 开源 Android mysql 程序员 apache HTML5 Ubuntu Windows Firefox wordpress nginx linux命令 linux shell java Python

MySQL实例中所有frm文件消失的幕后黑手

今天遇到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故障了。

和 Baron and Daniel 反馈,希望他们后续能在文档中与明确的风险提示,以免发生不愉快的事情。

延伸阅读

  • 抱歉,暂无相关内容!

评论