Home  >  Article  >  Database  >  实例中所有frm文件消失的幕后黑手

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

WBOY
WBOYOriginal
2016-06-07 16:35:10903browse

今天遇到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.<br> find "$dir" -type f -mtime +$retention_time -exec rm -f '{}' \;

和pt-stalk的伪代码对应起来,为清理老数据阶段:

while true; do<br> if --variable from --function is greater than --threshold; then<br> observations++<br> if observations is greater than --cycles; then<br> capture diagnostics for --run-time seconds<br> exit if --iterations is exceeded<br> sleep for --sleep seconds<br> done<br> done<br> clean up data that's older than --retention-time<br> sleep for --interval seconds<br> done

其中retention-time默认为30天,也就是说,可能有30天之前的数据被清除掉。

找到对应的代码,把rm改为echo,再在自己的测试环境运行下,果然是这个问题:

### 第一次没有sudo跑 ###<br> find: `/u01/ps5518/mysql-test/var/install.db/mtr': Permission denied<br> find: `/u01/ps5518/mysql-test/var/install.db/performance_schema': Permission denied<br> rm: cannot remove `/u01/ps5518/mysql-test/var/install.db/ibdata1': Permission denied<br> rm: cannot remove `/u01/ps5518/mysql-test/var/install.db/ib_logfile1': Permission denied<br> rm: cannot remove `/u01/ps5518/mysql-test/var/install.db/ib_logfile0': Permission denied<br> rm: cannot remove `/u01/ps5518/mysql-test/var/install.db/mysql/time_zone_transition.MYD': Permission denied<br> rm: cannot remove `/u01/ps5518/mysql-test/var/install.db/mysql/user.MYI': Permission denied<br> rm: cannot remove `/u01/ps5518/mysql-test/var/install.db/mysql/time_zone.MYI': Permission denied<br> 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故障了。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn