本地docker安装主从mysql数据库
安装mysql主从数据库
安装docker desktop
此处省略
下载mysql镜像
docker pull mysql:8.0.29
创建mysql本地挂载配置文件
- 创建E:\dockerConfig\mysql\master\conf\my.cnf,文件内容为:
[mysqld]
# 服务器的唯一id,默认值1
server-id=1
# 设置日志格式,默认值ROW
binlog_format=STATEMENT
# 二进制日志名,默认binlog
# log-bin=binlog
# 设置需要复制的数据库,默认复制全部数据库
# binlog-do-db=mytestdb
# 设置不需要复制的数据库
# binlog-ignore-db=mysql
# binlog-ignore-db=infomation_schema
- 创建E:\dockerConfig\mysql\master\data目录
运行docker容器
运行命令,启动主数据库
docker run -d -p 3307:3306 -v E:/dockerConfig/mysql/master/conf:/etc/mysql/conf.d -v E:/dockerConfig\mysql\master\data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql-master mysql:8.0.29
主数据库设置
# 创建用户数据同步的用户
CREATE USER 'lxb_slave'@'%';
# 设置用户密码
ALTER USER 'lxb_slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 授予用户数据库同步的权限 *。*表示所有数据库的所有表
GRANT REPLICATION SLAVE ON *.* TO 'lxb_slave'@'%';
# 刷新权限
FLUSH PRIVILEGES;
查询master状态
SHOW MASTER STATUS;
安装从服务器
创建mysql本地挂载配置文件
- 创建E:\dockerConfig\mysql\slave1\conf\my.cnf,文件内容为:
[mysqld]
# 服务器的唯一id,默认值1
server-id=2
# 中继日志名,默认xxxxxxxxx-relay-bin
#relay-log=relay-bin
- 创建E:\dockerConfig\mysql\slave\data目录
运行docker容器
运行命令,启动主数据库
docker run -d -p 3308:3306 -v E:\dockerConfig\mysql\slave1\conf:/etc/mysql/conf.d -v E:\dockerConfig\mysql\slave1\data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql-slave1 mysql:8.0.29
创建第二个从服务器
- 创建E:\dockerConfig\mysql\slave2\conf\my.cnf,文件内容为:
[mysqld]
# 服务器的唯一id,默认值1
server-id=3
# 中继日志名,默认xxxxxxxxx-relay-bin
#relay-log=relay-bin
- 创建E:\dockerConfig\mysql\slave2\data目录
运行docker命令
docker run -d -p 3309:3306 -v E:\dockerConfig\mysql\slave2\conf:/etc/mysql/conf.d -v E:\dockerConfig\mysql\slave2\data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql-slave2 mysql:8.0.29
在从机上设置主从关系
- 查看主机ip
docker inspect <容器id>
根据容器id可查看容器具体的id
查看IPAddress属性为172.17.0.2
注意:此ip为容器之间访问的ip,主库访问方式为172.17.0.2:3306,也可使用localhost:3307访问主库
- sql命令设置主从关系
CHANGE MASTER TO MASTER_HOST='172.17.0.2',
MASTER_USER='lxb_slave',MASTER_PASSWORD='123456',MASTER_PORT=3306,
MASTER_LOG_FILE='binlog.000002',MASTER_LOG_POS=1075;
- MASTER_HOST 主数据库ip地址
- MASTER_USER 主数据库设置中设置的数据库同步用户
- MASTER_PASSWORD 主数据库设置中设置的数据库同步用户的密码
- MASTER_PORT 主数据库端口(如果主数据库HOST为localhost,此处为3307)
- MASTER_LOG_FILE 主数据库SHOW MASTER STATUS命令的文件名
- MASTER_LOG_POS 主数据库SHOW MASTER STATUS命令的起始位置
分别在slave1和slave2两个从库中执行以上sql命令。
启动主从同步
启动从机复制功能
在两台从服务器中分别执行如下命令启动同步:
START SLAVE;
查看同步状态
在从服务器中执行如下命令。(不要带分号)
SHOW SLAVE STATUS\G
两个属性都为yes表示主从同步开启成功。如果为no,可查看日志。
测试主从同步
DROP DATABASE IF EXISTS `dbsyncTest`;
CREATE DATABASE `dbsyncTest` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
USE `dbsyncTest`;
-- ----------------------------
-- Table structure for sys_user
-- ----------------------------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of sys_user
-- ----------------------------
INSERT INTO `sys_user` VALUES (1, 'zhangsan');
INSERT INTO `sys_user` VALUES (2, 'lisi');
SET FOREIGN_KEY_CHECKS = 1;
在主库中执行创建库和表的sql,从可同步创建库和表
遇到的问题
mysql挂载的配置文件server-id未生效问题
执行:SHOW VARIABLES LIKE ‘server_id’; 发现与my.cnf中配置的server-id不一致,都为默认值1
解决方法:
将本地my.cnf设置为只读模式