mysql--Failed toopen log--datadir物理迁移报错

1.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上的mysql

service mysql stop

2)   对机器A上mysql的datadir(路径pathA)和my.cnf做打包,传输到机器B,并把datadir解压到pathB

3)   在机器B上安装percona mysql 5.6.14

4)   使用机器A传输过来的my.cnf覆盖机器B的/etc/my.cnf

5)   修改机器B的/etc/my.cnf中datadir路径为pathB

6)   在机器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 file

2014-04-25 22:26:47 27048 [ERROR] Can‘tinit tc log

2014-04-25 22:26:47 27048 [ERROR] Aborting

2014-04-25 22:26:47 27048 [Note] Binlog end

2014-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-bin

log-bin-index= /home/mysql_3306/bin-index

mysql会在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”的二进制索引文件,并且文件中只包含在启动时重新生成的二进制文件路径信息。

此时,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.000004

mysql-bin.000001

mysql-bin.000002

mysql-bin.000003

mysql-bin.000005

mysql-bin.000007

mysql-bin.000008

mysql已经彻底删除了编号000006的二进制日志文件。

接下来,我们尝试欺骗mysql,配置一个指向虚机路径的二进制日志文件:

#cat mysql-bin.index

/tmp/mysql-bin.0000005

/home/mysql_3306_bak/mysql-bin.000007

/home/mysql_3306_bak/mysql-bin.000008

在mysql中尝试删除编号000007之前的日志:

>purge binary logs to ‘mysql-bin.000007‘;

ERROR 29 (HY000): File ‘/tmp/mysql-bin.0000005‘ not found (Errcode:2 - No such file or directory)

mysql在读取log-bin-index日志索引文件删除日志的时候发现日志文件不存在,报错;

我们在尝试重启mysql,来判断它是如何读取和加载log-bin-index日志索引文件 以及索引文件中指定的二进制日志文件的:

# service mysql stop

Shutting down MySQL (PerconaServer)...                    [  OK  ]

# service mysql start

Starting MySQL (PerconaServer)....                        [ OK  ]

查看error.log日志:

2014-04-2600:53:28 7f752cddc700 InnoDB: Buffer pool(s) load completed at 140426  0:53:28

^G/usr/sbin/mysqld:File ‘/tmp/mysql-bin.0000005‘ not found (Errcode: 2 - No such file or          directory)

2014-04-2600:53:28 16723 [ERROR] Failed to open log (file ‘/tmp/mysql-bin.0000005‘, errno2)

2014-04-2600:53:28 16723 [ERROR] Could not open log file

【总结】

虽然mysql的error日志中有error信息,但是mysql仍然成功启动了,也就是说mysql在启动过程会读取log-bin-index文件,然后也会判断索引指定的log-bin文件是否存在,结合本案例中遇到的情况,可以知道只有当最后一个路径指定的log-bin不存在时,mysql服务才会中断启动操作,即启动失败。

【Sum Up】

1)   如果mysql没有开启binlog,则不会遇到这个问题;

2)   如果mysql开启了binlog,并且在Datadir物理迁移的过程中,修改了datadir的路径,就会遇到这个问题,此时,可以编辑log-bin-index文件修复log-bin文件的路径或者直接删除,然后启动mysql服务;

3)   为了避免遇到这个问题,在进行datadir迁移的时候,尽量不要改变datadir的路径;

时间: 2024-11-18 10:58:31

mysql--Failed toopen log--datadir物理迁移报错的相关文章

十二、MySQL从入门到高可用架构报错解决

1) 报错原因:MySQL的socket文件目录不存在. 解决方法:创建MySQL的socket文件目录 mkdir /application/mysql-5.6.38/tmp 2) 报错原因:socket文件目录没有权限 解决方法:给socket文件目录授权mysql用户的权限 chown -R mysql.mysql /application/mysql-5.6.38/ 3) 报错原因:没有做初始化 解决方法:做初始化 ./mysql_install_db --user=mysql --ba

java数据库执行迁移报错Error creating bean with name 'flywayInitializer' defined in class path resource

报错原因 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocati

编译mysql时,到一半的时候报错,c++死掉

编译mysql时,到一半的时候报错,c++死掉,因为内存太小导致,创建交换分区或者增加内存重新编译. 设置2G交换分区来用下 : # dd if=/dev/zeroof=/swapfile bs=1k count=2048000 --获取要增加的2G的SWAP文件块 # mkswap/swapfile     -- 创建SWAP文件 # swapon/swapfile     -- 激活SWAP文件 # swapon -s            -- 查看SWAP信息是否正确 # echo"/v

MySQL执行外部sql脚本文件命令报错:unknown command '\'

由于编码不一致导致的 虽然大部分导出是没有问题的 但是数据表中存储包含一些脚本(富文本内容)会出现该问题,强制指定编码即可解决. mysql导入时指定编码: mysql -u root -p --default-character-set=utf8 或者在导出时后显式指定编码就不存在这个问题了: mysqldump -uroot -p --default-character-set=utf8 mydb > E://xxxx.sql MySQL执行外部sql脚本文件命令报错:unknown com

exchange跨林邮箱迁移报错问题

最近在做一个跨林迁移的POC测试,在迁移邮箱时遇到了问题,下面我将遇到的问题及排错过程分享出来,希望对大家有所帮助. 所有的前期工作准备好后,在通过以下命令New-MoveRequest -Identity test01 -Remote -TargetDeliveryDomain wtaik.com -RemoteHostName source-exch2013.source.com -TargetDatabase BXDB01 -RemoteCredential $RemoteCredenti

mysql迁移报错

将mysql目录直接拷贝迁移,过程不详述,数据库正常启动,但是不能正常使用,select查表报表不存在,然后发现日志报错如下 InnoDB: Doing recovery: scanned up to log sequence number 265335480935 170504 15:56:39  InnoDB: Error: page 311313 log sequence number 265338125392 InnoDB: is in the future! Current syste

最终章·MySQL从入门到高可用架构报错解决

1. 报错原因:MySQL的socket文件目录不存在. 解决方法:创建MySQL的socket文件目录 mkdir /application/mysql-5.6.38/tmp 2. 报错原因:socket文件目录没有权限 解决方法:给socket文件目录授权mysql用户的权限 chown -R mysql.mysql /application/mysql-5.6.38/ 3. 报错原因:没有做初始化 解决方法:做初始化 ./mysql_install_db --user=mysql --ba

Windows下mysql无法启动1067错误 以及 登录报错Access denied for user ‘root’@‘localhost’ (using password:YES)

Windows下mysql无法启动1067错误解决: 解决步骤: 1.  找到自己的mysql安装目录,比如,我的是D:\MySQL\MySQL Server 5.5 2.  打开my.ini文件 3.  找到 #Path to the database root这一行,将 datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"    修改为自己mysql安装目录下的  datadir="D:/MySQL/MySQL Ser

MySQL分段统计SQL写法 与 Mybatis 报错:java.math.BigDecimal cannot be cast to java.lang.Integer

mysql> select -> sum(case when score<60 then 1 else 0 end) as '<60', -> sum(case when score>=60 and score<=69 then 1 else 0 end) as '60~69', -> sum(case when score>=70 and score<=79 then 1 else 0 end) as '70~79', -> sum(ca