复制功能可将来自一台MySQL数据库服务器(主服务器)的数据复制到一台或多台MySQL数据库服务器(从服务器)。
默认情况下复制是异步的; SLAVE不需要永久连接以接收来自Master的更新。根据配置,您可以复制数据库中的所有数据库,选定数据库或甚至选定的表。
一、细节说明
1.1、设定复制的数据
每个SLAVE都会收到MASTER二进制日志的全部内容的副本。
SLAVE可以决定执行二进制日志中的哪些语句。如特定的数据库或者选定的数据表。您无法配置MASTER仅记录特定事件的二进制日志。
1.2、管理复制的线程
每个SLAVE都保存二进制日志坐标的记录:文件名称和它从MASTER读取并处理的文件内的位置。
这意味着可以将多个SLAVE连接到MASTER并执行相同二进制日志的不同部分。
由于SLAVE控制此过程,因此各个SLAVE与MASTER连接或断开连接,都不会影响MASTER的运行。
另外,由于每个SLAVE都记录二进制日志中的当前位置,因此SLAVE可能会断开连接,重新连接并恢复处理。
1.3、复制机制要求
主站和每个从站必须配置一个唯一的ID(使用该server-id选项)。
另外,每个从站都必须配置有关主站名称,日志文件名以及该文件中的位置的信息。
这些细节可以使用从机上的CHANGE MASTER TO语句在MySQL会话中进行控制。
二、主从复制服务概述
有一些通用任务对所有设置都是通用的:
主从复制配置过程中需要做的工作
1、Master 启动二进制日志记录并配置唯一服务标识;需要重启服务。
2、Slave 服务配置唯一服务标识;需要重启服务。
3、为Slave 服务创建独立的用户,用于连接Master时做认证。
4、Master创建数据快照和Slave启动复制过程之前,要确认Master二进制日志的记录位置Pos。
5、如果Master服务已经记录了数据,需要对数据创建快照并复制到Slave服务中。不同的存储引擎创建快照方式不同。
6、在Slave服务设置连接Master的参数:user\password\logfile\logpos
三、Master 服务端配置
3.1、Master 配置文件
主服务器配置为使用基于二进制日志文件位置的复制,您必须启用二进制日志记录并建立唯一的服务器ID。
[mysqld]
log-bin=mysql-bin
server-id=1
如果你省略server-id(或明确地将其设置为其默认值0),Master 服务将拒绝来自Slave服务的任何连接。
3.2、设定Binary log记录的库
binlog-do-db= 记录的库(多个库,用逗号分开)
binlog-ignore-db=mysql,performance_schema,infomation_schema 忽略的数据库
3.3、创建复制用户
每个Slave都使用MySQL用户名和密码连接到Master,因此Master上必须有一个用户帐户,以便Slav可以使用该帐户进行连接。
任何帐户都可以用于此操作,只要它已被授予 REPLICATION SLAVE特权即可。您可以选择为每个Slave创建一个不同的帐户,或者使每个Slave使用相同的帐户连接到Master。
CREATE USER 'repl'@'%.example.com' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.example.com';
3.4、Master 二进制日志位置
获取二进制日志的位置前,需要对Master 服务的表加共享锁(读锁)。
MySQL> FLUSH TABLES WITH READ LOCK;
需要确保对数据表添加共享锁的客户端保持运行状态,以便共享锁持续生效。如果此客户端退出,则锁定被释放。
显示的日志文件名称和位置值
SHOW MASTER STATUS
mysqldump --master-data
3.5、Master 创建数据快照
MyISAM 存储引擎的表,可以直接备份同步至Slave库。
InnoDB 存储引擎的表,需要使用逻辑备份功能mysqldump。
在获取到Master库的数据快照后,记得要释放之前设置的共享锁。
四、Slave 服务端配置
4.1、Slave 配置文件
每个Slave都必须具有唯一的服务器标识。
如果您要设置多个Slave,则每个Slave的server-id必须与主站和其他Slave不同。
如果您省略server-id(或将其明确设置为默认值0),则从站拒绝连接到主站。
在Slave服务上是否启动二进制日志,更加情况而定。
4.2、设定复制的库或者表
replication-do-db=设定复制的库(多个库,用逗号分开)
replicate-ignore-db=设定要忽略的数据库
replicate-do-table=设定要复制的表
replicate-wild-do-table 复制的表,可以使用通配符
replicate-wild-ignore-table 忽略的表,可以使用通配符
4.3、连接Master服务
要设置Slave与Master进行通信以进行复制,请使用必要的连接信息配置Slave.
CHANGE MASTER TO MASTER_HOST='master_host_name',MASTER_USER='replication_user_name',MASTER_PASSWORD='replication_password',MASTER_LOG_FILE='recorded_log_file_name',MASTER_LOG_POS=recorded_log_position;
复制不能使用Unix套接字文件。您必须能够使用TCP / IP连接到主MySQL服务器。
4.4、启动复制线程
将Master数据快照导入到Slave库后,并配置好Master服务连接。就可以开启复制线程了。
MySQL> START SLAVE;
五、基于全局事务标识符GTID复制
全局事务标识符(GTID)是创建的唯一标识符,并与源(主)服务器上提交的每个事务相关联。此标识符不仅是其源自的服务器唯一的,而且在给定的复制设置中的所有服务器上都是唯一的。所有交易和所有GTID之间都有一对一的映射关系。
后续在补充更新
六、主从复制任务管理
6.1、检测复制状态
show slave status;
6.2、Slave暂停复制过程
Slave 服务中的复制过程包括两个线程:I/O线程和SQL线程。
I/O线程:从Master二进制日志读取时间并将它们写入中继日志。
SQL线程:从中继日志中读取事件并执行它们。
MYSQL > STOP SLAVE I0_THREAD;
MYSQL > START SLAVE IO_THREAD;
暂停I/O线程,使SQL线程执行完中继日志中的事件。
MYSQL > STOP SLAVE SQL_THREAD;
MYSQL > START SLAVE SQL_THREAD;
I/O线程继续读取事件并写入中继日志;SQL线程不读取和执行。