一.主从复制
主从复制的限制
一个从服务器只能连接到一个主服务器:从服务器的复制机制是基于单个主服务器的二进制日志(binlog)来同步数据的。因此,一个从服务器不能同时从多个主服务器接收数据。
主从复制的架构(读写分离)
主服务器负责写操作(如 INSERT、UPDATE、DELETE)
从服务器负责读操作(如 SELECT)
1.保证主从服务器数据一致
1)主服务器复制备份数据
FLUSH TABLES WITH READ LOCK;
mysqldump -uroot -p --all-databases --master-data=1 --single-transaction > backup.sql
UNLOCK TABLES;
2)从服务器导入数据
SOURCE /path/to/backup.sql;
二.搭建主从复制(保证数据库一致,如:字符集一致)
1)主库配置
1.修改配置文件/etc/my.cnf(或者/etc/my.cnf.d/mysql-server.cnf)添加如下:
#mysq服务标识,保证整个集群环境中唯一,默认为1
server-id =1
#是否只读,1代表只读,0代表读写
read-only=0
#忽略的数据,指不需要同步的数据库(以下都注释掉,代表全都复制)
#binlog-ignore-db=mysql
#指定同步的数据库
#binlog-do-db=test
2.重启mysql
systemctl restart mysqld
3.登录mysql,创建远程连接的账户
create user 'cpuser'@'%' identified with mysql_native_password by '123456';
# 为用户分配主从复制权限
grant replication slave on *.* to 'cpuser'@'%';
4.通过指令,查看二进制日志坐标
show master status ;
字段含义:
file:从哪个日志文件开始推送日志文件
position:从哪个位置开始推送日志
binlog_ignore_db:指定不需要同步的数据库
2)从库配置
1.修改配置文件/etc/my.cnf
#mysq服务标识,保证整个集群环境中唯一,默认为1
server-id =2
#是否只读,1代表只读,0代表读写
read-only=1
2.重启mysql
systemctl restart mysqld
3.登录mysql,设置主库配置
# mysql 8.0.23 之后版本的语法:
CHANGE REPLICATION SOURCE TO SOURCE_HOST='xxx.xxx.xxx.xxx', SOURCE_USER='xxx', SOURCE_PASSWORD='xxx',SOURCE_LOG_FILE='xxx',SOURCE_LOG_POS=xxx;
#mysql 8.0.23 之前的版本,执行如下SQL:
CHANGE MASTER TO MASTER_HOST='xxx.xxx.xxx.xxx', MASTER_USER='xxx', MASTER_PASSWORD='xxx', MASTER_LOG_FILE='xxx', MASTER_LOG_POS=xxx;
4.开启同步操作
#8.0.22之后
start replica;
#80.22之前
start slave;
5.查看主从同步状态
#8.0.22之后
show replica status;
#8.0.22之前
show slave status;
或(列显示)
show slave status\G;
三.关闭主从复制
1.从服务器上,运行以下命令停止复制进程
STOP SLAVE;
2.确认复制已停止
SHOW SLAVE STATUS\G;
3.清理复制配置(可选)
RESET SLAVE;
4.主服务器移除从服务器(可选)
REVOKE REPLICATION SLAVE ON *.* FROM 'cpuser'@'%';
DROP USER 'cpuser'@'%';
5.关闭主服务器的二进制日志(可选)
注释掉或删除配置文件的以下行
log_bin = /var/log/mysql/mysql-bin
6.重启mysql服务后验证
#从服务器:确认复制已停止且没有错误
SHOW SLAVE STATUS\G;
#主服务器:确认复制用户已被删除
SHOW GRANTS FOR 'cpuser'@'%';