我是小白,今天刚刚配置好主从机,我觉得我主从机配置好了,因为主从机配置好的标准是这样的:
主机:10.140.133.47
从机:10.210.139.77
在主机上:
证明配置从机的这条语句成功。
在从机上我进行了相应的操作配置好主机之后,我执行了start slave
验证一下是否配置成功:
我在主机上对数据库进行一些操作然后看此时的结果:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.140.133.47
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000031
Read_Master_Log_Pos: 1075
Relay_Log_File: relay-log.000002
Relay_Log_Pos: 250
Relay_Master_Log_File: binlog.000031
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB: mysql
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table: mysql.%
Last_Errno: 1146
Last_Error: Error 'Table 'data1.t1' doesn't exist' on query. Default database: 'data1'. Query: 'insert into t1 value(1)'
Skip_Counter: 0
Exec_Master_Log_Pos: 892
Relay_Log_Space: 1169
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 1146
Last_SQL_Error: Error 'Table 'data1.t1' doesn't exist' on query. Default database: 'data1'. Query: 'insert into t1 value(1)'
Replicate_Ignore_Server_Ids:
Master_Server_Id: 224811
1 row in set (0.00 sec)
证明已经连上的,数据不同步是因为出现了错误,既然已经配上了会不会是数据发送有问题呢?
根据mysql主从同步的原理,master发送二进制日志内容,二进制日志名称以及当前事件发生的起点给slave,通过I/O传输到slave,slave会将收到的二进制日志内容写进中继日志尾部,然后从机调用SQL线程安装中继日志执行,似的主从同步,并且将收到的二进制日志名称以及当前事件发生的起点写进master info,然后定期坚持从机里中继日志尾部的信息和主机的二进制日志是否一致,如果不一致将会更新,主机会重新发送二进制日志内容,二进制日志名称以及当前事件发生的起点给slave。
我们可以看到,因为slave status里是有主机信息的那么证明发送的二进制日志名称以及当前事件发生的起点是没有错的,那么我们查看是否是发送的二进制日志内容出现错误。
回到主机:根据从机读取的起点来查看日志
mysql> show binlog events in 'binlog.000031' from 892 \G
*************************** 1. row ***************************
Log_name: binlog.000031
Pos: 892
Event_type: Query
Server_id: 224811
End_log_pos: 961
Info: BEGIN
*************************** 2. row ***************************
Log_name: binlog.000031
Pos: 961
Event_type: Query
Server_id: 224811
End_log_pos: 1048
Info: use `data1`; insert into t1 value(1)
*************************** 3. row ***************************
Log_name: binlog.000031
Pos: 1048
Event_type: Xid
Server_id: 224811
End_log_pos: 1075
Info: COMMIT /* xid=50 */
3 rows in set (0.00 sec)
mysql> show processlist\G
*************************** 1. row ***************************
Id: 52
User: repl
Host: 10.210.139.77:35146
db: NULL
Command: Binlog Dump
Time: 1196
State: Master has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
*************************** 2. row ***************************
Id: 53
User: root
Host: localhost
db: NULL
Command: Query
Time: 0
State: NULL
Info: show processlist
2 rows in set (0.00 sec)
发现一切正常啊,数据很好的发送出去了。
突然我又发现
好像我有一个重要的参数
Slave_SQL_Running没有设为yes,当然同步不了啦(我其实是没设定成功,,,,囧~)
那么我们回到从机看从机的中继日志怎么样
用mysqlbinlog解析发现好像少了一部分,没有建库和表的过程。。。。。。。。
这到底是什么原因呢?
是我误操作起点设定错了?
还是Slave_SQL_Running没有设定为YES造成的呢?
问题解决:去问水哥,水哥好棒,没错就是那个DBA大神水哥,waterbin,我现在是他小弟,不要羡慕我哈哈哈~,水哥让我去新建data1和t1,照做之后问题解决,我才恍然大悟,我是起点设定错了,问题的原因应该是我误操作:在主机上执行了操作后又重新show master status。然后回从机改的最新的起点,当然会有问题啦,在生产环境中一定要切记起点不能随便改的。
还有哦,Slave_SQL_Running是状态量,是改不了的,它是yes的时候表明主从同步成功哦。
下面附上主从配置的步骤:
主机:10.140.133.47
从机:10.210.139.77
第一步骤:记得在/etc/my.cnf改主机和从机的server-id改得不同
然后记得在从机的配置文件里开启relay-log
第二步骤:
配置文件后记得重启mysqld服务器哦,这样才会生效,然后在主机里执行这条语句:
Grant replication slave on ‘取个名字最好是repl’@’从机的ip’ identified by ‘密码1’;
然后执行show master status;
查看bin-log文件名以及postion;
在从机里:
执行
Change master to master_host=’主机ip绝对不是localhost或者127.0.0.1哦’,master_user=’repl(上面说过最好是repl哦)’,master_password=’密码1’,master_log_file=’ 主机里show master status显示的’,master_log_pos=’和前面一项一起显示的,很重要!’;
然后
Start slave;
Show processlist;看一下
记得开启之后要slave stop 哦。