主从复制(Replication)
1.介绍
两台或以上数据库实例,通过二进制日志,实现数据的“同步”关系。
2.主从复制前提(搭建过程)
# 时间同步
#至少2台以上实例,要有角色划分
#主库开binlog
#网络通畅
#开启专用复制线程
#专门开启一个复制用户
#"补课"
#确认复制起点
#总结
1.需要两台以上数据库实例,网络通畅,时间同步,server_id不同,区分不同角色(主库,从库)
2.主库开启binlog,建立专用复制用户。
3.从库需要提前补课
4.从库:主库的链接信息,确认复制起点
5.从库: 需要专用的复制线程
3.搭建
实例准备
[root@later03 ~]# systemctl start mysqld3308
[root@later03 ~]# systemctl start mysqld3308
[root@later03 ~]# systemctl start mysqld3309
检查server_id
[root@later03 tmp]# mysql -S /tmp/mysql3307.sock -e "select @@server_id";
+-------------+
| @@server_id |
+-------------+
| 7 |
+-------------+
[root@later03 tmp]# mysql -S /tmp/mysql3308.sock -e "select @@server_id";
+-------------+
| @@server_id |
+-------------+
| 8 |
+-------------+
[root@later03 tmp]# mysql -S /tmp/mysql3309.sock -e "select @@server_id";
+-------------+
| @@server_id |
+-------------+
| 9 |
+-------------+
3.3 检查主库的binlog
[root@later03 tmp]# mysql -S /tmp/mysql3307.sock -e "select @@log_bin";
+-----------+
| @@log_bin |
+-----------+
| 1 |
+-----------+
3.4建立复制用户
mysql -S /tmp/mysql3307.sock -e "grant replication slave on *.* to repl@'localhost' identified by '123'";
grant replication slave on *.* to 'repl'@''
3.5 主库备份恢复到从库
主库备份:
mysqldump -S /tmp/mysql3307.sock -A --master-data=2 --single-transaction > /tmp/all.sql
从库恢复:mysql -S /tmp/mysql3308.sock < /tmp/all.sql
从库恢复: mysql -S /tmp/mysql3309.sock < /tmp/all.sql
3.6告知从库复制信息
查看binlog复制起点
[root@later03 ~]# grep "\-- CHANGE MASTER " /tmp/all.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=849;
3308,3309 执行:
CHANGE MASTER TO
MASTER_HOST='39.101.199.159',
MASTER_USER='repl',
MASTER_PASSWORD='luobiao123',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000005',
MASTER_LOG_POS=194,
MASTER_CONNECT_RETRY=10;
3.7 从库中开启专用复制线程
mysql> start slave;
3.8 验证主从状态
show slave status ;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3.9 重置从库,如果主库重启,或者发生变化,可以重置主从关系,重新设置
1.停止从库 stop slave;
2.重置 reset slave all;
主从复制原理
4.1 主从中涉及到的资源
文件:
主库:binlog文件
从库:
relay-log文件:存储接受的binlog
later03-relay-bin.000001
手工定义方法: vi /etc/my.cnf
relay_log_basename=/relay_log/later03-relay-bin
master.info :连接主库的信息,已经接受到的binlog位置信息。
默认存储在从库的数据路径下。
手工定义:
master_info_repository=FILE/TABLE
relay-log.info
作用:
记录从库回放到的relay-log的位置点。
默认在从库的数据路径下。
手工定义:
relay_log_info_repository=FILE/TABLE
4.1.2线程:
(1)主库:
Binlog_dump_Thread
作用:用来接b收从库请求,并且投递binlog给从库。
show processlist;
(2)从库:
IO线程,请求日志,接收日志
SQL线程,回放日志:
4.2 主从复制原理
画图说明:
文字说明:
1.S: change master to IP,Port,User,Password,binlog位置点信息
,执行start slave 启动IO和SQL线程。
2.S:连上主库
3.M:分配Dump_T,专门和S_IO通信。
show processlist;
4.S:IO线程,根据master.info记录的日志点信息,请求新日志
5.M:DUMP_T 接收请求,截取日志,返回给S_IO
6.S: IO线程接收到binlog,日志放在TCP/IP,此时网络层面返回
ACK给主库,主库工作完成。
7:S:IO将binlog最终写入到relay-log ,并跟新master.info ,IO线程工作结束.
8:S:SQL线程读R.info,获取上次执行到的位置点
9.S:SQL线程向后执行新的relay-log,再次跟新R.info
小细节:
1.S:relay-log 参数:relay_log_purge=ON 定期自动删除应用过的relay-log
2.M Dump线程实时监控主库的binlog变化,如果有新变化发信号给从库。
5.主从监控
5.1主库监控
show processlist; 查看主库dump进程
show slave hosts;查看从库的情况
5.2从库监控
show slave status;
主从相关信息,来自于Master.info
Master_Host: 39.101.199.159
Master_User: repl
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 1461
从库的relay-log的执行情况,来自于Relay.info 一般用作判断主从延时
Relay_Log_File: later03-relay-bin.000002
Relay_Log_Pos: 932
Relay_Master_Log_File: mysql-bin.000002
Exec_Master_Log_Pos: 1461
Seconds_Behind_Master: 0
从库线程状态,具体报错信息
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
过滤复制相关信息
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
延时从库的配置信息
SQL_Delay: 0
SQL_Remaining_Delay: NULL
GTID相关复制信息
Retrieved_Gtid_Set: 2ade123b-73aa-11ea-b05d-00163e082e57:4-6
Executed_Gtid_Set: 205e7212-736e-11ea-bfde-00163e0477d5:1-123