Docker学习之路【八】安装主从复制MYSQL8

拉取MySQL镜像

bash 复制代码
#拉取MySQL镜像
docker pull mysql:8.0.37

创建存储目录

bash 复制代码
#创建数据存储目录
mkdir -p /docker/mysql/master/data
#创建日志目录
mkdir -p /docker/mysql/master/logs
#创建配置文件目录
mkdir -p /docker/mysql/master/conf

运行容器

bash 复制代码
docker run -p 3340:3306 --name mysql_master --privileged=true \
-v /docker/mysql/master/conf:/etc/mysql/conf.d \
-v /docker/mysql/master/logs:/var/log/mysql \
-v /docker/mysql/master/data:/var/lib/mysql \
-v /etc/localtime:/etc/localtime \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.37 --init-connect="SET collation_connection=utf8mb4_0900_ai_ci" --init-connect="SET NAMES utf8mb4" --skip-character-set-client-handshake 

进入容器

bash 复制代码
docker exec -it mysql_master /bin/bash
mysql -uroot -p
#输入密码123456
#创建用于同步的数据库
create database db01;

配置远程连接(对外连接的)

bash 复制代码
# 在MySQL下执行
use mysql;
# 创建对外访问的用户和权限
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT ALL ON *.* TO 'slave'@'%' WITH GRANT OPTION;
#修改认证方式
alter user 'slave'@'%' identified with mysql_native_password by '123456';
FLUSH PRIVILEGES;
# 退出
exit;

创建自定义的配置文件

bash 复制代码
cd /docker/mysql/master/conf
touch my.cnf
vim my.cnf

my.cnf文件内容

bash 复制代码
[client]
# mysql客户端默认字符集
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
# 跳过密码登录
#skip-grant-tables
#bind-address = 127.0.0.1
init_connect='SET collation_connection = utf8mb4_general_ci'
init_connect='SET NAMES utf8mb4'
# mysql服务端默认字符集
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
skip-character-set-client-handshake
# datadir=/var/lib/mysql  

# 主服务器唯一ID
server-id=1
# 设置不要复制的数据库
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
# 设置需要复制的数据库(先创建好)
binlog-do-db=db01
# 启用二进制日志,日志的存放地址
log-bin=/var/lib/mysql/mysql-bin
# 主机,1 只读 0 读写(默认是0)
read-only=0
# 设置logbin格式 有3种格式 
# 默认 STATEMENT(函数支持不好) 默认的 ROW(行模式大量修改效率不行,但支持存储引擎) MIXED (综合,推荐)
binlog_format=mixed
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
# 二进制日志过期清理时间,默认是0(不自动清理)
expire_logs_days=7
# 单个二进制日志大小
max_binlog_size=200M
# 设置每隔多少次事务提交操作,将这些操作写入二进制日志文件
sync_binlog=1
# 使用mysql_native_password插件的认证
# default_authentication_plugin=mysql_native_password

重启容器

bash 复制代码
docker restart mysql_master
# 需要记录一下File、Position
show master status;
bash 复制代码
#查询结果
mysql> show master status;
+------------------+----------+--------------+---------------------------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                            | Executed_Gtid_Set |
+------------------+----------+--------------+---------------------------------------------+-------------------+
| mysql-bin.000002 |      730 | db01         | mysql,information_schema,performance_schema |                   |
+------------------+----------+--------------+---------------------------------------------+-------------------+
1 row in set (0.00 sec)

配置从数据库节点

bash 复制代码
#创建数据目录
mkdir -p /docker/mysql/slave/data
#创建日志目录
mkdir -p /docker/mysql/slave/logs
#创建配置文件目录
mkdir -p /docker/mysql/slave/conf
#创建自定义的配置文件
cd /docker/mysql/slave/conf
touch my.cnf
vim my.cnf

my.cnf文件内容

bash 复制代码
[client]
# mysql客户端默认字符集
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
# 跳过密码登录
#skip-grant-tables
#bind-address = 127.0.0.1
init_connect='SET collation_connection = utf8mb4_general_ci'
init_connect='SET NAMES utf8mb4'
# mysql服务端默认字符集
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
skip-character-set-client-handshake
# datadir=/var/lib/mysql  

# 从服务器唯一ID
server-id = 2  
# 开启中继日志
relay-log=mysql-relay
# 从机,1 只读 0 读写(默认是0)
read-only=1
# 启用二进制日志,日志的存放地址,如果从机变成主机可以继续使用bin日志
# log-bin=mysql-slave-bin
# 使用mysql_native_password插件的认证
# default_authentiction_plugin=mysql_native_password

运行容器

bash 复制代码
docker run -p 3341:3306 --name mysql_slave --privileged=true \
-v /docker/mysql/slave/conf:/etc/mysql/conf.d \
-v /docker/mysql/slave/logs:/var/log/mysql \
-v /docker/mysql/slave/data:/var/lib/mysql \
-v /etc/localtime:/etc/localtime \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.37 --init-connect="SET collation_connection=utf8mb4_0900_ai_ci" --init-connect="SET NAMES utf8mb4" --skip-character-set-client-handshake 

进入容器

bash 复制代码
docker ps -a
docker exec -it mysql_slave /bin/bash
# 打开MySQL,输入密码
mysql -uroot -p
# 创建数据库
create database db01;

设置同步信息

bash 复制代码
CHANGE MASTER TO MASTER_HOST='ip地址',
MASTER_PORT=3340,
MASTER_USER='slave',MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_CONNECT_RETRY=30,
MASTER_LOG_POS=730;

开始同步

bash 复制代码
start slave;
show slave status \G;  # 检查状态
# 如果结果下面的字段为Yes 代表配置成功
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
相关推荐
南猿北者3 小时前
docker容器
docker·容器
二十雨辰3 小时前
[linux]docker基础
linux·运维·docker
time never ceases4 小时前
使用docker方式进行Oracle数据库的物理迁移(helowin/oracle_11g)
数据库·docker·oracle
MonkeyKing_sunyuhua6 小时前
ubuntu22.04 docker-compose安装postgresql数据库
数据库·docker·postgresql
追风林6 小时前
mac m1 docker本地部署canal 监听mysql的binglog日志
java·docker·mac
€☞扫地僧☜€8 小时前
docker 拉取MySQL8.0镜像以及安装
运维·数据库·docker·容器
茶馆大橘8 小时前
微服务系列六:分布式事务与seata
分布式·docker·微服务·nacos·seata·springcloud
全能全知者9 小时前
docker快速安装与配置mongoDB
mongodb·docker·容器
阿尔帕兹11 小时前
构建 HTTP 服务端与 Docker 镜像:从开发到测试
网络协议·http·docker
ZHOU西口12 小时前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac