MySQL 的复制
主服务器将更新写入二进制文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
MySQL 支持的复制类型:
- 基于语句的复制(逻辑复制):在主服务器上执行的 SQL 语句,在从服务器上执行同样的语句。MySQL 默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时,会自动选择基于行的复制。
 - 基于行的复制:把改变的内容复制过去,而不是把命令再从服务器上执行一遍。
 - 混合类型的复制:默认采用基于语句的复制,一旦发现基于语句无法精确复制时,会自动选择基于行的复制。
 
复制主要有三个步骤:
- 在主库上把数据更改记录到二进制日志 (Binary Log) 中
 - 从库将主库上的日志复制到自己的中继日志 (Relay Log) 中
 - 从库读取中继日志中的事件,并将其重放到从库中
 
具体操作
配置主库 /etc/my.cnf, 需要重启 MySQL 服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15[mysqld]
server-id = 1
# 唯一 ID,master/slave 集群中不能重复
log-bin = mysql-bin
# master 开启二进制日志,默认记录所有库所有表的操作。
# 不同步哪些数据库
binlog-ignore-db = mysql
binlog-ignore-db = test
binlog-ignore-db = information_schema
# 只同步哪些数据库,除此之外,其他不同步
binlog-do-db = game
# 保留指定日期范围内的 bin log 历史日志。默认为 0,保留所有日志
expire_logs_days=7
# bin log 日志每达到设定大小后,会使用新的 bin log 日志。默认为 1073741824,1GB
max_binlog_size=1073741824主库创建用于同步的账号
1
grant replication slave on *.* to 'username'@'192.168.1.%'IDENTIFIED BY 'password';
其中 192.168.1.% 使用通配符,例如 192.168.1.% 表 192.168.1.0-192.168.1.255 这个网段所有 slave 都可以能通过该户来访问 master。
备份主库
锁定主库为只读状态,防止在备份数据库时外部程序对数据修改
1
flush tables with read lock;
查看 master 的状态,同时记录 File 和 Position
1
show master status;
备份数据库
1
mysqldump -uroot -p dbname > db.sql
主库恢复写操作
1
unlock tables;
导入数据到从库
1
mysql -uroot -p dbname < db.sql
配置从库 /etc/my.cnf
1
2[mysqld]
server-id=2 # 设置 server-id, 必须唯一配置后启动 MySQL
1
service mysql start --skip-slave-start
从库启动主从同步
执行同步 SQL 语句
1
CHANGE MASTER TO MASTER_HOST=' 主库 IP',MASTER_USER='username',MASTER_PASSWORD='password',MASTER_LOG_FILE=' 第三布记录的 File',MASTER_LOG_POS=第三步记录的 Position;
启动 slave 同步进程
1
start slave;
查看主从同步状态
1
show slave status\G
如下两行显示 Yes 即为正在运行
1
2Slave_IO_Running: Yes
Slave_SQL_Running: Yes
show slave status 参数
| 参数 | 值 | 说明 | 
|---|---|---|
| Slave_IO_State | Waiting | for master to send event | 
| Master_Host | 192.168.1.80 | |
| Master_User | repl | |
| Master_Port | 3306 | |
| Connect_Retry | 60 | |
| Master_Log_File | mysql-bin.000083 | |
| Read_Master_Log_Pos | 393099157 | |
| Relay_Log_File | ecs-bb76-0006-relay-bin.000235 | |
| Relay_Log_Pos | 300045860 | |
| Relay_Master_Log_File | mysql-bin.000083 | |
| Slave_IO_Running | Yes | |
| Slave_SQL_Running | Yes | |
| Replicate_Do_DB | ||
| Replicate_Ignore_DB | ||
| Replicate_Do_Table | ||
| Replicate_Ignore_Table | ||
| Replicate_Wild_Do_Table | ||
| Replicate_Wild_Ignore_Table | ||
| Last_Errno | 0 | |
| Last_Error | ||
| Skip_Counter | 0 | |
| Exec_Master_Log_Pos | 393099157 | |
| Relay_Log_Space | 300322434 | |
| Until_Condition | None | |
| Until_Log_File | ||
| Until_Log_Pos | 0 | |
| Master_SSL_Allowed | No | |
| Master_SSL_CA_File | ||
| Master_SSL_CA_Path | ||
| Master_SSL_Cert | ||
| Master_SSL_Cipher | ||
| Master_SSL_Key | ||
| Seconds_Behind_Master | 0 | |
| Master_SSL_Verify_Server_Cert | No | |
| Last_IO_Errno | 0 | |
| Last_IO_Error | ||
| Last_SQL_Errno | 0 | |
| Last_SQL_Error | ||
| Replicate_Ignore_Server_Ids | ||
| Master_Server_Id | 80 | |
| Master_UUID | d2c28dea-8939-11e9-a1af-fa163eea46ba | |
| Master_Info_File | /var/lib/mysql/master.info | |
| SQL_Delay | 0 | |
| SQL_Remaining_Delay | NULL | |
| Slave_SQL_Running_State | Slave has read all relay log; waiting for more updates | |
| Master_Retry_Count | 86400 | |
| Master_Bind | ||
| Last_IO_Error_Timestamp | ||
| Last_SQL_Error_Timestamp | ||
| Master_SSL_Crl | ||
| Master_SSL_Crlpath | ||
| Retrieved_Gtid_Set | ||
| Executed_Gtid_Set | ||
| Auto_Position | 0 | |
| Replicate_Rewrite_DB | ||
| Channel_Name | ||
| Master_TLS_Version | 
常用命令
show relaylog events in "Relay_Log_File" from Relay_Log_Pos limit n;:查看 relaylog eventsset GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;:跳过为一个 Binlog event group,也就是跳过一个事务