MySQL 主从同步

简介

主从同步分三个步骤:

  1. master 将改变记录到二进制日志 binary log 中(这些记录叫做二进制日志事件,binary log events)。
  2. slave 将 master 的 binary log events 拷贝到它的中继日志 relay log 中。
  3. slave 重做中继日志中的事件,将改变反映它自己的数据。

原理图

配置主库

生成快照

如果数据库是 MYISAM 或者既有 MYISAM 又有 INNODB 的话使用如下命令导出一个快照:

mysqldump -uroot -p --lock-tables --events --triggers --routines --flush-logs --master-data=2 --databases test > db.sql
--locl-tables导出数据时锁表
--events会把创建的所有事件也导出来
--triggers会把创建的事务也导出来
--routines这个是存储过程和存储方法
--flush-log导出时先刷新下 binglog 日志
--master-data=2导出的文件里 change master 是被注释掉的 ,等于1时不是注释的,这个根据自己的要求改,一般都会选择2因为在从服务器上需要 change 一下 主服务器的ip,端口 ,账号 ,密码

如果数据库只有 INNODB,可以使用如下命令:

mysqldump -uroot -p --single-transaction --events --triggers --routines --flush-logs --master-data=2 --databases test > db.sql
--single-transaction这个参数只对 innodb 适用
--databases后面跟除 mysql 以后的其他所有数据库的库名,我这里只有一个 test 库
--master-data参数会记录导出快照时候的 mysql 二进制日志位置,下面会用到
修改配置文件

修改 mysql 的配置文件 my.cnf

# 在 [mysqld] 配置段下添加如下字段
server-id=1
log-bin=log
binlog-do-db=database_name //需要同步的数据库,如果没有这一行那么表示同步所有的数据库
binlog-ignore-db=mysql //被忽略的数据库
新建同步账号
grant replication slave on *.*  to repl@192.168.80.35 identified by 'password';
重启服务
service mysqld restart
查看日志情况
show master status

配置从库

修改配置文件

修改 mysql 的配置文件 my.cnf

# 在 [mysqld] 配置段下添加如下字段
server-id=2
master-host=192.168.80.35
master-user=repl
master-password=password
master-port=3306
master-connect-retry=60 //如果从服务器发现主服务器断掉,重新连接的时间差(秒)
#replicate-ignore-db=mysql //忽略的数据库
#replicate-do-db=repl //同步的数据库(需要备份的数据库名),不写本行代表需要同步所有的数据库
重启服务
service mysqld restart
快照还原,开始同步

先将从主库生成的快照文件还原,然后在 master 主机上使用 grep 命令查找到二进制日志 binglog 的名称以及位置。

grep -i "change master" db.sql
# -- CHANGE MASTER TO MASTER_LOG_FILE='log.xxxx', MASTER_LOG_POS=98;

change master

stop slave;
change master to master_host='192.168.80.35', master_user='repl', master_password='password', master_log_file='log.xxxx', master_log_pos=98;
start slave;

如果 Slave_IO_Running 、 Slave_SQL_Running 状态为 Yes,则表明设置成功。

可能出现的问题

start slave 报错
错误提示

ERROR 1200 (HY000): The server is not configured as slave; fix in config file or with CHANGE MASTER TO

分析
执行 show slave status 提示 Empty set
原因:slave 已经默认开启,要先关闭再开启
解决
1. 先执行 slave stop
2. 再执行 change master to master_host='192.168.80.35',master_user='repl',master_password='password', master_log_file='log.000003' ,master_log_pos=98;
3. 再执行 slave start
4. 最后查看状态 show slave status\G

测试主从同步

在我们配置的主从同步的数据库下建测试表,对数据进行操作,然后在另一边查看是否同步。

清除主从同步配置信息

mysql> slave stop;
mysql> reset slave;
mysql> change master to master_user='', master_host='', master_password='';
清除失败
# 可能报错:ERROR 1210 (HY000): Incorrect arguments to MASTER_HOST 。解决办法如下:

mysql> change master to master_host=' ';

# 上面的命令报错的原因,为 master_host=' ' 里面必须有内容,即使为空,也应该用空格代替,而不能什么都不写。

参考资料