主从复制简介
主从复制即将一台MySQL实例(Master)的数据复制到一个或多个MySQL实例(Slave)。默认情况下,复制是异步的;Slave不需要持久连接来接收来自Master的更新。根据配置,可以自定义复制的对象是实例中的所有数据库,或指定的数据库甚至某几张指定的表。
首先master把数据变化作为事件记录到binlog中,然后slave通过I/O线程读取master上的binlog,并且把它写入到slave的中继日志中,接着SQL线程读取中继日志,并且在slave本地库上重放,从而实现MySQL复制。下例介绍是基于主库binlog的name及应用的position来配置的。
配置主库
主库必须启用二进制日志并有唯一的server ID,设置后需要重启mysql服务生效。主从数据传输同步是根据binlog实现的,如果未启用binlog,复制是不可能的。复制组内每个服务器都必须有一个唯一的server ID,此ID用来标识各个服务器,且范围在1
-power(2,32)-1
之间的整数,如不设置将如法配置复制。
[mysqld]
log-bin=mysql-bin
server-id=1
innodb_flush_log_at_trx_commit=1
sync_binlog=1
创建复制用户
从库需要帐号来连接主库,帐号需要具有REPLICATION SLAVE权限,一般会单独创建一个仅具有REPLICATION SLAVE权限的用户用于复制。
[master]
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.141.8.174' IDENTIFIED BY 'p4word';
Query OK, 0 rows affected (0.02 sec)
获取主库二进制日志执行位置并同步数据
配置复制需要指定从库开始执行主库的二进制日志的起始执行位置,因此当从库同步主库现有数据时,需要停止在主库上执行更新语句,然后获得主库的当前二进制日志坐标并基于此位置备份数据。如果主库继续执行更新操作,可能导致主从数据不一致。
获取主库二进制日志坐标的方式:
- 主库执行FLUSH TABLES WITH READ LOCK 语句:
mysql> FLUSH TABLES WITH READ LOCK;
mysql> show master status;
该语句刷新所有表及块写入语句,对于InnoDB表还会阻塞Commit。非正常退出该session,FLUSH TABLES仍会生效,如使用exit退出该会话,锁会被释放。
- 获取主库数据快照
如果新配置的主从复制可忽略本步骤,如果创建的主库已存在数据,需要创建一个主库的数据快照并在从库中恢复。获取数据快照的方式很多,可使用备份工具如:mysqldump、xtrabackup等,也可直接拷贝主库数据文件。
- 释放读锁
备份完成后,释放主库锁定
mysql> UNLOCK TABLES;
如果配置表都是InnoDB等支持事务的表,可以跳过手工设定锁定的操作,mysqldump --single-transaction --master-data
来确保快照一致性。
配置从库
如果有多个slave,各从库也必须有唯一的server ID,不能省略,否则拒绝连接。
[mysqld]
server-id=2
启动生效后,从库执行CHANGE MASTER TO语句,启动复制,change master 语法。
mysql> change master to master_user='repl',
master_password='p4word',
master_host='10.141.8.173',
master_log_file='mysql-bin.000007',
master_log_pos=120;
Query OK, 0 rows affected, 2 warnings (0.11 sec)
导入主库快照数据后,启动复制线程,同步主从数据
mysql> start slave; ## 启动复制线程
Query OK, 0 rows affected (0.06 sec)
查看主从复制状态
mysql> show slave status \G;
当slave_IO_Running、Slave_SQL_Running
均为Yes,则表示复制可以正常运行。如复制不能正常进行,状态及错误日志将会出现错误信息,一般常见的错误的原因有:操作系统防火墙,Selinux,主库信息错误,server_id未设置或重复,server_uuid重复及主从数据问题。
验证同步效果
[master]
mysql> create table test.sysc (
> id int primary key,
-> name varchar(10)
-> );
Query OK, 0 rows affected (0.04 sec)
mysql> insert into test.sysc values(1001,'1001');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test.sysc values(1002,'1002');
Query OK, 1 row affected (0.03 sec)
[slave]
mysql> use test;
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| sysc |
+----------------+
1 row in set (0.00 sec)
mysql> select * from sysc;
+------+------+
| id | name |
+------+------+
| 1001 | 1001 |
| 1002 | 1002 |
+------+------+
2 rows in set (0.00 sec)
以下几种状态对判断主从复制延迟及处理主从复制故障很重要。
- Master_Log_File & Read_Master_Log_Pos:IO线程读取的当前主库binlog位置信息。
- Relay_Master_Log_File & Exec_Master_Log_Pos:SQL线程当前读取执行的主库binlog位置信息。
- Relay_Log_File & Relay_Log_Pos:SQL线程当前读取执行的中继日志位置信息。
- Slave_IO_Running & Slave_SQL_Running:当前复制状态是否正常