简介
主从同步分三个步骤:
- master 将改变记录到二进制日志
binary log
中(这些记录叫做二进制日志事件,binary log events)。 - slave 将 master 的 binary log events 拷贝到它的中继日志 relay log 中。
- 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
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';
|
重启服务
查看日志情况
配置从库
修改配置文件
修改 mysql 的配置文件 my.cnf
server-id=2 master-host=192.168.80.35 master-user=repl master-password=password master-port=3306 master-connect-retry=60 //如果从服务器发现主服务器断掉,重新连接的时间差(秒)
|
重启服务
快照还原,开始同步
先将从主库生成的快照文件还原,然后在 master 主机上使用 grep 命令查找到二进制日志 binglog
的名称以及位置。
grep -i "change master" db.sql
|
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='';
|
清除失败
mysql> change master to master_host=' ';
|
参考资料