MySQL复制.md

主从复制简介

主从复制即将一台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:当前复制状态是否正常

你可能感兴趣的:(MySQL复制.md)