Docekr学习 - MySQL8主从复制搭建部署

x33g5p2x  于2022-07-22 转载在 Mysql  
字(4.8k)|赞(0)|评价(0)|浏览(1411)
主从复制搭建

特别注意下一步:MySQL8跟5有配置区别特别注意下一步:MySQL8跟5有创建用户区别特别注意下一步:MySQL8跟5有创建用户区别如发现从库未同步数据,运行show slave status查看原因,具体问题具体分析配置步骤开始1. 新建主服务器容器实例33082. 进入/mydata/mysql-master/conf目录下新建my.cnf3. 修改完配置后重启master实例4. 进入mysql--master容器5. master容器实例内创建数据同步slave用户6. 新建从服务器容器实例33097. 进入/mydata/,mysql-slave/conf目录下新建my.cnf8. 修改完配置后重启slave实例9. 在主数据库中查看主从同步状态10. 进入mysql-slave容器11. 在从数据库中配置主从复制12. 在从数据库中查看主从同步状态13. 在从数据库中开启主从同步14. 查看从数据库状态发现已经同步15. 主从复制测试

# 下载镜像
docker pull mysql

# 第一步:启动主MySQL
docker run --name=mysql-master -p 3308:3306 -v /etc/localtime:/etc/localtim   -v /www/server/mysql_master-slave/master/data:/var/lib/mysql -v /www/server/mysql_master-slave/master/log:/var/log/mysql -v  /www/server/mysql_master-slave/master/conf:/etc/mysql/conf.d    -e MYSQL_ROOT_PASSWORD=root --privileged=true -d mysql:latest

# 第二步:添加配置文件  /www/server/mysql_master-slave/master/conf/my.cnf  == 内容如下
[mysqld]
## 设置server id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
# 旧版5的配置==如果是8记得替换成秒数哦,否则进不去mysqld
#expire_logs_days=7
# 新版8的配置
binlog_expire_logs_seconds=604800
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062


# 第三步:重启主MySQL
docker restart mysql-master

# 第四步:主MySQL中创建slave用户 == 使永Navicat或者直接进容器内部运行即可
#  进入主容器mysql:docker exec -it mysql-master mysql -uroot -p
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'%';
SELECT plugin FROM `user` where user = 'slave';
# 对于mysql8 这步特别重要,需要修改授权插件,否则从MySQL那边连接不到主MySQL进行同步拉取数据
# 如果是MySQL5则不需要运行这个语句
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';


# 第五步:启动从MySQL
docker run --name=mysql-slave -p 3309:3306 -v /etc/localtime:/etc/localtim   -v /www/server/mysql_master-slave/slave/data:/var/lib/mysql -v /www/server/mysql_master-slave/slave/log:/var/log/mysql -v  /www/server/mysql_master-slave/slave/conf:/etc/mysql/conf.d    -e MYSQL_ROOT_PASSWORD=root --privileged=true -d mysql:latest

# 第六步:添加配置文件  /www/server/mysql_master-slave/slave/conf/my.cnf  == 内容如下
[mysqld]
## 设置server._id,同一局域网中需要唯一
server_id=102
#指定不需要同步的数据库名称
binlog-ignore-db=mysql
#开启二进制日志功能,以备Slave作为其它数据库实例的Masterl时使用
log-bin=mall-mysql-slave1-bin
#设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
#设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
#二进制日志过期清理时间。默认值为0,表示不自动清理。
# 旧版5的配置
#expire_logs_days=7
# 新版8的配置
binlog_expire_logs_seconds=604800
#跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
#如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
# 旧版5的配置
#slave_skip_errors=1062
# 新版8的配置
replica_skip_errors=1062
#relay_log配置中继日志
relay_log=mall-mysql-relay-bin
#log_slave_.updates表示slave将复制事件写进自己的二进制日志
# 旧版5的配置
#log_slave_updates=1
# 新版8的配置
log_replica_updates=1
##slave设置为只读(具有super权限的用户除外)
read_only=1


# 第七步:重启从MySQL
docker restart mysql-slave

# 第八步:查看主MySQL的 master状态
docker exec -it mysql-master mysql -uroot -proot
show master status;

# 第九步:进入从mysql  == 设置主MySQL相关的信息
docker exec -it mysql-slave mysql -uroot -proot

# master_log_file、master_log_pos取自 主MySQL的 show master status信息
# 填写主MySQL的端口、ip等信息
change master to master_host='192.168.80.128',master_user='slave',master_password='123456',master_port=3308,master_log_file='mall-mysql-bin.000002',master_log_pos=156,master_connect_retry=30;

# 第十步:查看从MySQL的 slave相关信息  == 从MySQL中运行
# 发现还未开启同步开关
show slave status;

# 第十一步:从库开始打开拉取主库的开关  -- 从MySQL中运行
start slave;

# 第十二步:查看从库的同步开关是否开启
show slave status;

# 第十三步:数据同步测试 == 大功告成
主MySQL:创库、创表、新增数据
从MySQL:查看数据是否同步过来

主从复制搭建遇到的问题解决
MY-010095 - 启动失败
2022-07-21 05:10:09+00:00 [Note] [Entrypoint]: Starting temporary server
mysqld: Error on realpath() on '/var/lib/mysql-files' (Error 2 - No such file or directory)
2022-07-21T05:10:09.822859Z 0 [ERROR] [MY-010095] [Server] Failed to access directory for --secure-file-priv. Please make sure that directory exists and is accessible by MySQL Server. Supplied value : /var/lib/mysql-files
2022-07-21 05:10:09+00:00 [ERROR] [Entrypoint]: Unable to start server.

解决方案 - 改run配置文件的映射配置

//原启动配置 == 遇到上述启动报错问题
docker run --name=mysql-master -p 3308:3306 -v /etc/localtime:/etc/localtim   -v /www/server/mysql_master-slave/master/data:/var/lib/mysql -v /www/server/mysql_master-slave/master/log:/var/log/mysql -v  /www/server/mysql_master-slave/master/conf:/etc/mysql   -e MYSQL_ROOT_PASSWORD=root --privileged=true -d mysql:latest

//修正后启动配置 == 可正常启动 == 改mysql映射目录
docker run --name=mysql-master -p 3308:3306 -v /etc/localtime:/etc/localtim   -v /www/server/mysql_master-slave/master/data:/var/lib/mysql -v /www/server/mysql_master-slave/master/log:/var/log/mysql -v  /www/server/mysql_master-slave/master/conf:/etc/mysql/conf.d   -e MYSQL_ROOT_PASSWORD=root --privileged=true -d mysql:latest
从库连接到主库失败 - 非IP、账号密码问题
Last_IO_Error: error connecting to master 'slave@192.168.80.128:3308' - retry-time: 30 retries: 17 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.

从机中运行:show slave status

解决方案

-- 在主MySQL机中运行下列SQL == 修改授权插件
-- 修改完后无需重启 主MySQL、从MySQL
SELECT plugin FROM `user` where user = 'slave';
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

从机中运行:show slave status

相关文章