
MySQL 复制过程分成三步:
master 将改变记录到二进制日志(binary log)。这些记录过程叫做二进制日志事件,binary log events;
slave 将 master 的 binary log events 拷贝到它的中继日志(relay log);
slave 重做中继日志中的事件,将改变应用到自己的数据库中。 MySQL 复制是异步的且串行化的
搭建一个一主一从的Mysql环境
| 从属关系 | 容器名称 | 服务器 | 端口 |
|---|---|---|---|
| 主 | mysql-master | 192.168.56.100 | 3306 |
| 从 | mysql-slave1 | 192.168.56.101 | 3306 |
主从都需要执行
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-all
systemctl restart docker
mkdir -p /home/scsdm/services/mysql
vi /home/scsdm/services/mysql/docker-compose.yml
version: '3'
services:
node1:
image: mysql:5.7.23
hostname: mysql-master
container_name: mysql-master
restart: always
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=hancloud1234!
- TZ=Asia/Shanghai
volumes:
- /home/scsdm/services/mysql/mysql_master/slowSql:/data/mysql
- /home/scsdm/services/mysql/mysql_master/data:/var/lib/mysql
- /home/scsdm/services/mysql/mysql_master/logs:/var/log/mysql
- /home/scsdm/services/mysql/mysql_master/conf/my.cnf:/etc/mysql/my.cnf
privileged: true
command: ['mysqld','--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci','--default-time-zone=+08:00']
entrypoint: bash -c "chown -R mysql:mysql /var/log/mysql && exec /entrypoint.sh mysqld"
mkdir -p /home/scsdm/services/mysql/mysql_master/conf
vi /home/scsdm/services/mysql/mysql_master/conf/my.cnf
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-time-zone=+08:00
max_connections=1000
# 开启binlog
log-bin=mysql-bin
log-bin-index=mysql-bin.index
# 服务器唯一id,默认值1
server-id=1
max_binlog_size=1G
max_binlog_cache_size=1G
# 设置日志格式,默认值ROW
binlog_format=mixed
expire_logs_days=7
# 开启慢查询
slow_query_log=1
long_query_time=2
slow_query_log_file=/data/mysql/slow.log
# 错误日志
log_error=/var/log/mysql/error.log
# 设置需要复制的数据库,默认复制全部数据库
binlog-do-db=mcp_manager
# 设置不需要复制的数据库
#binlog-ignore-db=mysql
#binlog-ignore-db=infomation_schema
cd /home/scsdm/services/mysql
# my.cnf 权限不能是777,会被忽略
chmod 644 /home/scsdm/services/mysql/mysql_master/conf/my.cnf
docker-compose up -d
#进入容器:env LANG=C.UTF-8 避免容器中显示中文乱码
docker exec -it mysql-master env LANG=C.UTF-8 /bin/bash
#进入容器内的mysql命令行
mysql -uroot -p

-- 创建slave用户
CREATE USER 'slave'@'%';
-- 设置密码
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'hancloud@1234';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
查看创建的用户信息
select host,user from mysql.user;

执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化
SHOW MASTER STATUS;
记下File和Position的值。
执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化。

mkdir -p /home/scsdm/services/mysql
vi /home/scsdm/services/mysql/docker-compose.yml
version: '3'
services:
node1:
image: mysql:5.7.23
hostname: mysql-slave1
container_name: mysql-slave1
restart: always
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=hancloud1234!
- TZ=Asia/Shanghai
volumes:
- /home/scsdm/services/mysql/mysql_slave1/slowSql:/data/mysql
- /home/scsdm/services/mysql/mysql_slave1/data:/var/lib/mysql
- /home/scsdm/services/mysql/mysql_slave1/logs:/var/log/mysql
- /home/scsdm/services/mysql/mysql_slave1/conf/my.cnf:/etc/mysql/my.cnf
privileged: true
command: ['mysqld','--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci','--default-time-zone=+08:00']
entrypoint: bash -c "chown -R mysql:mysql /var/log/mysql && exec /entrypoint.sh mysqld"
mkdir -p /home/scsdm/services/mysql/mysql_slave1/conf
vi /home/scsdm/services/mysql/mysql_slave1/conf/my.cnf
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-time-zone=+08:00
max_connections=1000
# 开启binlog
log-bin=mysql-bin
log-bin-index=mysql-bin.index
# 服务器唯一id,默认值1
server-id=2
max_binlog_size=1G
max_binlog_cache_size=1G
# 设置日志格式,默认值ROW
binlog_format=mixed
expire_logs_days=7
# 开启慢查询
slow_query_log=1
long_query_time=2
slow_query_log_file=/data/mysql/slow.log
# 错误日志
log_error=/var/log/mysql/error.log
cd /home/scsdm/services/mysql
# my.cnf 权限不能是777,会被忽略
chmod 644 /home/scsdm/services/mysql/mysql_slave1/conf/my.cnf
docker-compose up -d
#进入容器:env LANG=C.UTF-8 避免容器中显示中文乱码
docker exec -it mysql-slave1 env LANG=C.UTF-8 /bin/bash
#进入容器内的mysql命令行
mysql -uroot -p
照片。,
# 配置主Mysql地址
CHANGE MASTER TO MASTER_HOST='192.168.56.100',
# 配置主Mssql创建的用于备份的用户名和密码和端口
MASTER_USER='slave',MASTER_PASSWORD='hancloud@1234', MASTER_PORT=3306,
# 配置主Mssql的binlog日志名称和当前所在位置(上面记录的位置)
MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=939;
START SLAVE;
-- 查看状态(不需要分号)
SHOW SLAVE STATUS\G

-- 在从机上执行。功能说明:停止I/O 线程和SQL线程的操作。
stop slave;
-- 在从机上执行。功能说明:用于删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件。
reset slave;
-- 在主机上执行。功能说明:删除所有的binglog日志文件,并将日志索引文件清空,重新开始所有新的日志文件。
-- 用于第一次进行搭建主从库时,进行主库binlog初始化工作;
reset master;
CREATE DATABASE mcp_manager;
USE mcp_manager;
CREATE TABLE t_user (
id BIGINT AUTO_INCREMENT,
uname VARCHAR(30),
PRIMARY KEY (id)
);
INSERT INTO t_user(uname) VALUES('xiaohong');
INSERT INTO t_user(uname) VALUES('xiaoming');

将mysqlPackge分别拷贝到主从服务器下的mkdir -p /home/scsdm/services/mysql
mkdir -p /home/scsdm/services/mysql
cd /home/scsdm/services/mysql
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-all
systemctl restart docker
cd /home/scsdm/services/mysql
docker load -i /home/scsdm/services/mysql/mysqlPackage/mysql_5_7_23.tar.gz
cp -r /home/scsdm/services/mysql/mysqlPackage/master/docker-compose.yml /home/scsdm/services/mysql/docker-compose.yml
mkdir -p /home/scsdm/services/mysql/mysql_master/conf
cp -r /home/scsdm/services/mysql/mysqlPackage/master/my.cnf /home/scsdm/services/mysql/mysql_master/conf/my.cnf
# my.cnf 权限不能是777,会被忽略
chmod 644 /home/scsdm/services/mysql/mysql_master/conf/my.cnf
docker-compose up -d
docker logs -f mysql-master

#进入容器:env LANG=C.UTF-8 避免容器中显示中文乱码
docker exec -it mysql-master env LANG=C.UTF-8 /bin/bash
#进入容器内的mysql命令行
mysql -uroot -phancloud1234!
-- 创建slave用户
CREATE USER 'slave'@'%';
-- 设置密码
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'hancloud@1234';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
SHOW MASTER STATUS;

firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-all
systemctl restart docker
cd /home/scsdm/services/mysql
docker load -i /home/scsdm/services/mysql/mysqlPackage/mysql_5_7_23.tar.gz
\cp -r /home/scsdm/services/mysql/mysqlPackage/slave/docker-compose.yml /home/scsdm/services/mysql/docker-compose.yml
mkdir -p /home/scsdm/services/mysql/mysql_slave1/conf
\cp -r /home/scsdm/services/mysql/mysqlPackage/slave/my.cnf /home/scsdm/services/mysql/mysql_slave1/conf/my.cnf
# my.cnf 权限不能是777,会被忽略
chmod 644 /home/scsdm/services/mysql/mysql_slave1/conf/my.cnf
docker-compose up -d
docker logs -f mysql-slave1

#进入容器:env LANG=C.UTF-8 避免容器中显示中文乱码
docker exec -it mysql-slave1 env LANG=C.UTF-8 /bin/bash
#进入容器内的mysql命令行
mysql -uroot -phancloud1234!
# 配置主Mysql地址
CHANGE MASTER TO MASTER_HOST='192.168.56.100',
# 配置主Mssql创建的用于备份的用户名和密码和端口
MASTER_USER='slave',MASTER_PASSWORD='hancloud@1234', MASTER_PORT=3306,
# 配置主Mssql的binlog日志名称和当前所在位置(上面记录的位置)
MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=939;
START SLAVE;
-- 查看状态(不需要分号)
SHOW SLAVE STATUS\G

tar -zcvf mysqlPackage.tar.gz ./mysqlPackage
脚本文件地址 :
链接:https://pan.baidu.com/s/1ecuOZ1VsTP2ephkGEObfqQ
提取码:1234
前提:
将文件mysqlPackage.tar.gz上传到服务器上
tar -xzvf mysqlPackage.tar.gz
修改mysqlPackage文件夹里面的install.conf配置
#安装之前需要配置如下信息
masterIp="192.168.56.100"
salveIp="192.168.56.101"
base_dir="/home/scsdm/services/mysql"
cd mysqlPackage
chmod +x install.sh
./install.sh
安装过程中如有停顿等待输入,输入yes即可
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lmQfK62C-1667368038461)(imgs/image-20221101180610369.png)]
(1)查看日志出现下面的代表成功
Slave_SQL_Running: Yes
Slave_IO_Running: Yes
(2)在从服务器执行下面的命令查看
docker exec -i mysql-slave1 bash -c "mysql -uroot -phancloud1234! -e \"SHOW SLAVE STATUS\G\"" | grep "Slave_SQL_Running:"
docker exec -i mysql-slave1 bash -c "mysql -uroot -phancloud1234! -e \"SHOW SLAVE STATUS\G\"" | grep "Slave_IO_Running:"
