首页 / 数据库 / MySQL / mysql中Failed toopen log--datadir物理迁移报错的案例
mysql中Failed toopen log--datadir物理迁移报错的案例2014-10-281.1.1. mysql5.6.14的datadir迁移时遇到报错【环境描述】在机器A上安装了perconamysql 5.6.14,数据库停启正常,datadir路径为pathA,并且已经做了应用数据库的初始化工作,然后关闭了这个数据库实例,把它的datadir和/etc/my.cnf迁移到另外一台机器B上的percona mysql 5.6.14,迁移后的datadir路径修改成路径pathB,在启动mysql服务的时候遇到问题,启动失败。操作步骤:1) 停掉机器A上的mysqlservice mysql stop2) 对机器A上mysql的datadir(路径pathA)和my.cnf做打包,传输到机器B,并把datadir解压到pathB3) 在机器B上安装percona mysql 5.6.144) 使用机器A传输过来的my.cnf覆盖机器B的/etc/my.cnf5) 修改机器B的/etc/my.cnf中datadir路径为pathB6) 在机器B上执行service mysql start启动mysql服务7) 启动失败,发生报错【mysql报错】启动时的报错servicemysql start:Starting MySQL(Percona Server)......Theserver quit without[FAILED]ng PID file(/home/mysql_3306_bak/mysql.pid).错误日志中的报错:/usr/sbin/mysqld: File "/home/mysql_3306/mysql-bin.000003"not found (Errcode: 2 - No such file or directory)2014-04-25 22:26:47 27048 [ERROR] Failed toopen log (file "/home/mysql_3306/mysql-bin.000003", errno 2)2014-04-25 22:26:47 27048 [ERROR] Could notopen log file2014-04-25 22:26:47 27048 [ERROR] Can"tinit tc log2014-04-25 22:26:47 27048 [ERROR] Aborting2014-04-25 22:26:47 27048 [Note] Binlog end2014-04-25 22:26:47 27048 [Note] Shuttingdown plugin "partition"已经修改了my.cnf配置文件中所有的路径,但是Mysql仍然说找不到"/home/mysql_3306/mysql-bin.000003"路径的文件,从报错看上去很诡异。【问题原因】Mysql报错提示找不到binlog,是由于my.cnf中配置了:log-bin= /home/mysql_3306/mysql-binlog-bin-index= /home/mysql_3306/bin-indexmysql会在log-bin-index参数指定的文件中维护log-bin的索引列表,并且它是以绝对路径的方式记录的:/home/mysql_3306?mysql-bin.000001/home/mysql_3306?mysql-bin.000002/home/mysql_3306?mysql-bin.000003虽然已经把/etc/my.cnf中的所有路径都修改正确了,但是mysql服务在启动时,是通过读取log-bin-index来查找log-bin日志文件的,查找的文件还是在机器A上指定的位置,所以mysql服务启动失败。【解决方法】手动修改log-bin-index指定的二进制日志索引文件,修改里面所有log-bin的路径,指定到当前datadir下的二进制日志,然后尝试启动mysql服务,启动成功,问题解决。【问题思考】Whatis log-bin-index paramter ?Mysql官方手册中说明“如果没有在my.cnf中配置log-bin-index参数指定,mysql会自动创建一个以host_name-bin.index命名的二进制索引文件(实验证明是mysql-bin.index)”。所以,尝试去掉my.cnf中配置的log-bin-index参数,然后启动mysql服务,此时mysql服务正常启动,查看log-bin-index文件:#cat mysql-bin.index/home/mysql_3306_bak/mysql-bin.000006我们发现mysql自动创建了名为“mysql-bin.index”的二进制索引文件,并且文件中只包含在启动时重新生成的二进制文件路径信息。本栏目更多精彩内容:http://www.bianceng.cn/database/MySQL/此时,mysql只知道此次启动时生成的二进制文件路径信息,那么也就意味着此时mysql丢失了编号000006之前的所有日志文件,我们进行如下的测试:执行flush logs命令,让mysql再刷出来几个二进制日志;#cat mysql-bin.index/home/mysql_3306_bak/mysql-bin.000006/home/mysql_3306_bak/mysql-bin.000007/home/mysql_3306_bak/mysql-bin.000008然后,执行purgebinary logs to "mysql-bin.000004" 命令:>purge binary logs to "mysql-bin.000004";ERROR1373 (HY000): Target log not found in binlog index此时,mysql提示无法找到000004号二进制日志文件,接下来尝试删除000006号二进制日志文件:> purge binary logs to"mysql-bin.000007";QueryOK, 0 rows affected (0.03 sec)查看mysql-bin.index二进制日志索引文件:#cat mysql-bin.index/home/mysql_3306_bak/mysql-bin.000007/home/mysql_3306_bak/mysql-bin.000008查看二进制日志文件:#ls -ltr mysql-bin.00000*mysql-bin.000004mysql-bin.000001mysql-bin.000002