[trouble] Neither --relay-log nor --relay-log-index were used;

在错误日志有这么一个问题

[root@centos6 data]# ls -l
total 1986636
-rwxrwx---. 1 mysql mysql      13933 Feb  4 06:58 centos6.err
-rw-rw----. 1 mysql mysql          5 Feb  3 21:31 centos6.pid
-rw-rw----. 1 mysql mysql        107 Feb  4 06:00 centos6-relay-bin.000001
-rw-rw----. 1 mysql mysql         27 Feb  4 06:00 centos6-relay-bin.index
-rwxrwx---. 1 root  mysql       5481 Jan  8 13:42 Centos_MySQL.err
-rwxrwx---. 1 root  mysql        107 Jan  5 14:29 export_user.sql
-rwxrwx---. 1 root  mysql        110 Jan  5 13:34 export_user.txt
-rwxrwx---. 1 root  mysql 2023751680 Feb  2 22:21 ibdata1
-rwxrwx---. 1 root  mysql    5242880 Feb  3 21:31 ib_logfile0
-rwxrwx---. 1 root  mysql    5242880 Feb  3 21:31 ib_logfile1
-rw-rw----. 1 mysql mysql         71 Feb  4 06:00 master.info
drwxrwx---. 2 root  mysql       4096 Dec 23 14:36 mysql
-rwxrwx---. 1 root  mysql        286 Jan 10 16:27 OFF
-rwxrwx---. 1 root  mysql        581 Jan 10 16:28 on
drwxrwx---. 2 root  mysql       4096 Dec 23 14:36 performance_schema
-rw-rw----. 1 mysql mysql         50 Feb  4 06:00 relay-log.info
drwxrwx---. 2 root  mysql       4096 Jan 12 16:24 test

 

160204  6:00:56 [Warning] Neither --relay-log nor --relay-log-index were used; so replication may break when this MySQL server acts as a slave and has his hostname changed!! Please use '--relay-log=centos6-relay-bin' to avoid this problem.

意思是正在使用的relay log名字,是数据库根据system的hostname来取的,一旦system的hostname改变了,那么会影响relay log的名字,同时可能会中断整个replication

 

地址:http://dev.mysql.com/doc/refman/5.5/en/replication-howto-additionalslaves.html

 

千万要指定slave的relay log日志和index的名字,在/etc/my.cnf文件上,也就是这两个参数

1.--relay-log=file_name

2.--relay-log-index=file_name

 

如果不特别指定的话,relay-log-index的名字是跟relay-log的名字是一致的,如果在/etc/my.cnf文件上写了--relay-log这个entry但没有在后面加上值的话,会报错的,relay log file有一大堆,后缀是序列号,但并不是每一个relay log file都在使用,有些正在用,有些已经用完了,至于哪些正在用,记录在relay log index文件里头

 

 

正在使用的relay-log名字可以通过slave status看到

因为在/etc/my.cnf文件里面修改,所以stop slave 之后再 start slave 对于slave使用的relay-log并没有任何影响,MySQL只会在启动的时候使用/my.cnf这个配置文件,但是当我重启MySQL再start slave时却报错

160204 11:39:11 [ERROR] Failed to open the relay log './centos6-relay-bin.000001' (relay_log_pos 4)
160204 11:39:11 [ERROR] Could not find target log during relay log initialization
160204 11:39:11 [ERROR] Failed to initialize the master info structure
160204 11:39:11 [Note] Event Scheduler: Loaded 0 events
160204 11:39:11 [Note] /usr/local/mysql/bin/mysqld: ready for connections.
Version: '5.5.47'  socket: '/tmp/mysql.sock'  port: 3306  MySQL Community Server (GPL)
160204 11:42:14 [ERROR] Failed to open the relay log './centos6-relay-bin.000001' (relay_log_pos 4)
160204 11:42:14 [ERROR] Could not find target log during relay log initialization

为什么已经在my.cnf文件设置了relay log 它还会去查找旧的relay-log名字呢?

查找到其中一个错误是,relay-log-index文件把relay-log文件给覆盖了,因为他们使用都是同一个文件名字

 应该是这样子的

它其实跟master的binary-log和index是刚好对应关系,当我修改以后,报错还是依然

虽然relay日志和索引都存在了,不过日志只用了192这个前缀,估计是因为.的关系,以后起名字尽量不要使用.了

这个就是我的错误

 

在slave上有两个文件

1.master.info,这个文件记录change master to的语句

2.relay-log.info,这个文件记录relay log的信息

虽然在my.cnf已经修改了relay log的名字,但这个relay-log.info文件依然没有改变,估计这是报错的原因了!!!而在mysql里面的show slave status语句就是读取这个文件,还有读取master.info文件,所以可以断定,show slave status 所显示的 relay-log-file一定是centos6-relay-bin.000001而不是192.169.1.107了

 当然也有可能show slave status语句所看到的东西,和relay-log.info master.info两个文件的内容是不一致的,这是因为在内存上的信息没有被flush到本地磁盘上面去,最一致的状态时在mysqld停止时所看到的结果

 

如果要让 relay-log.info 和 master.info这两个文件发生改变,就使用change master to 语句,记得document有说,change master to 语句的所有选项都可以在 /etc/my.cnf文件中使用到响应的option,但最好还是使用change master to语句

但这里有一个问题,原本slave在使用旧的relay log做复制,现在换成了新的relay log,那新的relay log上面没有应该执行的events呢?不过relay log只是一个过渡而已,它叫什么名字,上面有没有event没有关系,只要清楚的知道master binary log 的坐标就可以了

还是同样的错误,改不了

 

很神奇的是,当我尝试reset slave,再重启slave之后,slave status就改变了,而且是按照 /etc/my.cnf进行了

 

记得曾奇峰说,很多对于人性的讨论,如果不能落实到力比多和攻击性,那么都不算深刻,换到这里来说,如果在内存显示的东西,不能落实到磁盘上的物理文件那么都不算深刻,reset salve的作用,就是清除master.info和relay-log.info这两个文件,这两个文件被清除,show slave status就无法显示相关信息了,在这个时候start slave虽然会告诉你没有配置好slave,但它会根据/my.cnf文件中关于slave的配置去生成master.info和relay-log.info两个文件,change master to是继续往这两个文件里面填写内容

这个结果可能需要重启之后才能看到

 

【问题】

如果配置了新的relay log,虽然知道master 的binary log的坐标,但是relay log已经执行到一半断掉,这时候怎么办呢?看来得重新把master的数据库迁移到slave身上去了 

 

posted @ 2016-02-05 02:58  lawrence.li  阅读(2771)  评论(0编辑  收藏  举报