主从复制原理:
在每个事务更新数据完成之前,Master 在二进制日志(Binary loq)记录这些改变。写入二进制日志完成后,Master通知存储引擎提交事务。
slave 将Master的复制到其中继日志(Relay log)。首先salave开始一个工作线程(I/0) ,I/0线程在Master上打开一个普通的连接,然后开始Binlog dump process. Binlog. dump process 从Master的二进制日志中读取事件,如果已经跟上Master,它会睡眠并等待Master产生新的事件,I/0线程将这些事件写入中继日志。
SQL slave. thread ( SQL从线程)处理该过程的最后一步,SQL线程从中继日志读取事件,并重放其中的事件而更新slave数据,使其与Master 中的数据一致,只要该线程与I/O 线程保持一致,中继日志通常会位于OS缓存中,所以中继日志的开销很小。复制过程有一个很重要的限制,即复制在slave上是串行化的, 也就是说Master上的并行更新操作不能在Slave上并行操作。
MySQL主从复制(一主两从)
环境需要:
- docker
- 防火墙关闭
#关闭docker systemctl stop docker #关闭防火墙 systemctl stop firewalld #启动docker systemctl start docker
1.主库配置:
设置server-id值并开启binlog参数
bin - log = mysql - bin
sever_id = 137
重启数据库:
[root@localhost ~]# systemctl restart mysqld
建立同步账号:
锁表设置只读,测试锁表后是否可以创建数据库:
mysql> flush tables with read lock:
mysql> show variables like '%timeout%:
查看主库状态:
mysql> show master status;
备份数据库数据:
[root@localhost ~]# mysqldump -uroot -p -A -B |gzip > /backup/mysql_bak.$(date +%F).sql.gz
解锁:
mysql> unlock tables;
主库备份数据上传到从库
[root@localhost ~]# scp /backup/mysql_bak.$(date +%F).sql.gz 192.168.118.148:/backup/
2.从库配置
设置server-id并关闭binlog参数,重启数据库
# log_bin
server_id = 148
还原主库备份数据并检查:
[root@localhost ~]# mkdir /backup/mysql_bak -p
[root@localhost ~]# cd /backup/
[root@localhost backup~]# zcat /backup/mysql_bak.2023-03-31.sql.gz | mysql -uroot -pABCabc123! -S /date/3307/mysql.sock
查看:
[root@localhost ~]# mysql -uroot -pABCabc123! -S /date/3307/mysql.sock
设置主从同步:
开启从库同步开关: