MySQL主从复制是一种用于实现数据备份、读写分离和扩展性的技术。它基于二进制日志(Binary Log)来将主数据库上的更改操作同步到一个或多个从数据库。
MySQL主从复制的基本原理如下:
主从复制可以实现以下功能:
主服务容器的部署工作大体分为以下 5 步 :
/root/mysql/conf
目录下新建my.cnf
首先依旧得部署数据卷,具体流程工作如下:
mkdir -p /root/mysql/conf
mkdir -p /root/mysql/log
mkdir -p /root/mysql/data
docker run -d -p 3307:3306 --privileged=true -v /root/mysql/log:/var/log/mysql -v /root/mysql/data:/var/lib/mysql -v /root/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=8888 --name mysql mysql:5.7
然后在/root/mysql/conf
下编辑文件my.cnf
,将如下内容写入后重启主容器
[mysqld]
## 设置serverid,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
##开启二进制日志功能
log-bin=mall-mysql-bin
##设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
##设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间按,默认为0,表示不自动清理
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免从slave端复制中断
## 1062错误是指一些主键重复,1032错误是因为主从数据库不一致
slave_skip_errors=1062
然后我们需要在主容器内创建数据同步用户,创作用户代码如下:
#首先链接mysql服务器
mysql -uroot -p
# 代码将创建一个名为replication_user的用户,并授予其在所有数据库和表上进行复制操作的权限。
CREATE USER 'replication_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
# 执行以上SQL语句后,刷新MySQL权限以使更改生效:
FLUSH PRIVILEGES;
从服务容器的部署工作大体分为以下 5 步 :
/root/mysql-salve/conf
目录下新建my.cnf
首先依旧得部署数据卷,具体流程工作如下:
mkdir -p /root/mysql-slave/cnf
mkdir -p /root/mysql-slave/log
mkdir -p /root/mysql-slave/data
docker run -d -p 3308:3306 --privileged=true -v /root/mysql-slave/log:/var/log/mysql -v /root/mysql-slave/data:/var/lib/mysql -v /root/mysql-slave/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=8888 --name mysql-2 mysql:5.7
然后在/root/mysql-slave/conf
下编辑文件my.cnf
,将如下内容写入后重启从 容器
[mysqld]
## 设置serverid,同一局域网中需要唯一,主机101,从机202
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
##开启二进制日志功能
log-bin=mall-mysql-bin
##设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
##设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间按,默认为0,表示不自动清理
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免从slave端复制中断
## 1062错误是指一些主键重复,1032错误是因为主从数据库不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
##log_slave_updates表示slave讲复制时间写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super用户权限除外)
read_only=1
继而进入mysql-slave
容器中,开始在从数据库中配置主从复制。
CHANGE MASTER TO MASTER_HOST='<主服务器IP地址>',
MASTER_USER='<主服务器复制用户>',
MASTER_PASSWORD='<主服务器复制用户密码>',
MASTER_PORT=<主服务器端口>,
MASTER_LOG_FILE='<主服务器二进制日志文件>',
MASTER_LOG_POS=<主服务器日志位置>;
实际操作中需要注意更多的东西,比如我的实际操作内容是:
CHANGE MASTER TO MASTER_HOST='192.168.254.128',MASTER_USER='slave',MASTER_PASSWORD='king1977',MASTER_PORT=3307,MASTER_LOG_FILE='mall-mysgl-bin.000001',MASTER_LOG_POS=749,MASTER_CONNECT_RETRY=30;
然后我们需要在从数据中查看主从同步状态:**show slave status \G;**
,此时可以看到主从状态并未开启,我们需要开启主从同步状态。
在从数据库中开启主从数据同步命令如下:
start slave;
# 然后重新检查主从同步状态,如果两个状态未同时为YES,可以执行以下内容
# 在备库执行
stop slave;
reset slave;
start slave;
主服务器上创建新的数据库和数据表,输入内容如下:
create database db_01;
use db_01;
crate table tb_01(id int,name varchar(20));
此时主服务器和从服务器数据库内容如下:
主服务器数据库
从服务器数据库
至此一主一从的主从复制顺利完成,在后续的学习实战中,我想要实现一主多从的自动化部署,这点后续可以作为学习的重点。