配置主服务器
1.更改配置文件,首先检查你的主服务器上的my.cnf文件中是否已经在[mysqld]模块下配置了log-bin和server-id
注意上面的log-bin和server-id的值都是可以改为其他值的(server-id建议修改为ip地址最后一位),如果没有上面的配置,首先关闭mysql服务器,然后添加上去,接着重启服务器
2.创建用户,每一个从服务器都需要用到一个账户名和密码来连接主服务器,可以为每一个从服务器都创建一个账户,也可以让全部服务器使用同一个账户。下面就为同一个ip网段的所有从服务器创建一个只能进行主从同步的账户。
mysql> insert into mysql.user(Host,User,Password) values("%","rep",password("123456"));
这样就创建了一个名为:rep 密码为:123456的用户。
3.导入导出主从数据。
将主数据库的数据导出后导入到从数据库。
然后执行下面的语句获取二进制日志的信息
mysql > show master status;
File的值是当前使用的二进制日志的文件名,Position是该日志里面的位置信息(不需要纠结这个究竟代表什么),记住这两个值,会在下面配置从服务器时用到。
注意:如果之前的服务器并没有配置使用二进制日志,那么使用上面的sql语句会显示空,配置log-bin和server-id后重启就可以了。
配置从服务器
首先检查从服务器上的my.cnf文件中是否已经在[mysqld]模块下配置leserver-id
配置同步参数,登陆mysql,输入如下信息:
启动主从同步进程
mysql > start slave;
检查状态
mysql > show slave status \G
若执行start slave 时报告一下错误;
Slave failed to initialize relay log info structure from the repository
解决方案:
mysql> reset slave;
Query OK, 0 rows affected (0.04 sec)
mysql> start slave IO_THREAD;
Query OK, 0 rows affected (0.07 sec)
mysql> stop slave IO_THREAD;
Query OK, 0 rows affected (0.01 sec)
mysql> reset slave;
Query OK, 0 rows affected (0.10 sec)
mysql> start slave;
Query OK, 0 rows affected (0.20 sec)
mysql> show slave status\G
常见问题:
1、show slave status中Slave_IO_State: Waiting to reconnect after a failed registration on master
解决方法:
在master上执行
grant replication slave on . to ‘repl’@’%’ identified by ‘password’;
FLUSH PRIVILEGES;
然后重新stop slave 和start slave就可以
2、show slave status中Slave_IO_Running: No
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
解决办法:每个库的uuid应该是不一样的,修改auto.cnf文件(在mysql 的data目录下)的uuid:
[auto]
server-uuid=6dcee5be-8cdb-11e2-9408-90e2ba2e2ea6
按照这个16进制格式,随便改下,重启mysql即可。
3、从库中slave_sql_running为NO
一般在 Last_SQL_Error:项中可以看到报错的语句
Slave_IO_Running:连接到主库,并读取主库的日志到本地,生成本地日志文件
Slave_SQL_Running:读取本地日志文件,并执行日志里的SQL命令。
这时,网上很多会教使用SET global sql_slave_skip_counter=n; 设置,但其实执行这个语句都会报错,因为启动了gtid-mode=ON
解决方法:跳过执行报错的语句
查看show slave status的最后两行:
Retrieved_Gtid_Set表示已经从master中拉取过来的事务;
Executed_Gtid_Set表示已经执行的事务
找到Executed_Gtid_Set中与Retrieved_Gtid_Set ID一致的记录,如上图ca83d308-2ea5-11e4-b85f-00163e042f50:1-5,表示只执行到第五个事务,就是这个事务报错了,因此跳过这个事务即可。依次执行以下语句:
stop slave;
set gtid_next=‘ca83d308-2ea5-11e4-b85f-00163e042f50:6’;
begin;commit;
set gtid_next=“AUTOMATIC”;
start slave;
然后再查看show slave status\G
如果看到以下状态即可以了
PS:启动主从备份时,一定要确保主从的数据一致,因为从库遇到任何报错,即使执行update语句时,主库中的一条记录在从库中找不到,都会报导致问题2的出现,从而停止执行slave更新