脚本详情
使用docker-compose安装MySQL主从库,文件架构如下:
image
docker-compose.yml文件
version: '3'
services:
mysql-master:
container_name: mysql-master
hostname: mysql-master
image: "mysql:5.6"
ports:
- "33060:3306"
volumes:
- /usr/local/mysql-master/etc:/etc/mysql
- /usr/local/mysql-master/var/lib:/var/lib/mysql
- ./master/etc/my.cnf:/etc/my.cnf
- ./master/init_db/:/docker-entrypoint-initdb.d/
environment:
- TZ=Asia/Shanghai
- MYSQL_ROOT_PASSWORD=123456
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
restart: always
mysql-slave:
container_name: mysql-slave
hostname: mysql-slave
image: "mysql:5.6"
ports:
- "33070:3306"
volumes:
- /usr/local/mysql-slave/etc:/etc/mysql
- /usr/local/mysql-slave/var/lib:/var/lib/mysql
- ./slave/etc/my.cnf:/etc/my.cnf
- ./slave/init_db/:/docker-entrypoint-initdb.d/
environment:
- TZ=Asia/Shanghai
- MYSQL_ROOT_PASSWORD=123456
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
restart: always
Master
2.1 配置文件(/etc/my.cnf)
#my.conf
[mysqld]
server_id = 1
# 开启GTID模式
gtid-mode = ON
enforce-gtid-consistency = 1
# 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db = mysql
# 开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)
log-bin = mysql-bin
# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size = 1M
# 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format = mixed
# 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days = 7
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors = 1062
# log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates = ON
2.2 初始化脚本(init_db/init.sql)
create user 'repl'@'%' identified by 'repl';
grant replication client,replication slave on *.* to 'repl'@'%';
Slave
3.1 配置文件(/etc/my.cnf)
#my.conf
[mysqld]
server_id = 2
gtid-mode = ON
enforce-gtid-consistency = 1
binlog-ignore-db = mysql
log-bin = mysql-slave1-bin
binlog_cache_size = 1M
binlog_format = mixed
expire_logs_days = 7
slave_skip_errors = 1062
relay_log = mysql-relay-bin
log_slave_updates = ON
read_only = 1
3.2 初始化脚本(init_db/init.sql)
reset master;
select sleep(10); ## 第一次出现了mysql-slave先初始化好的情况
CHANGE MASTER TO MASTER_HOST='mysql-master',MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_PORT=3306,MASTER_AUTO_POSITION=1;
start slave;
安装方法
在mysql路径下,执行命令行,即可完成安装。
docker-compose up -d
验证方法
查看容器是否正常启动。
docker ps -a
image
进入主库所对应的容器。
docker exec -ti /bin/bash
进入数据库,
mysql -u root -p 123456
并新建数据库和表,插入测试数据。
create test;
use test;
create table t(id int,k int);
insert into t values(1,1),(2,3);
进入从库所对应的容器进行查看,进入数据库后,查询表。
use t;
select * from t;
image
如果看到如图所示数据,则主从库安装成功。
或者看到如下信息,也代表主从库配置成功。
image
添加从库只读用户
为保证从库只从主库同步,现设置从库的只读用户。
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT SELECT ON dp_dorado.* TO 'slave'@'%';
FLUSH PRIVILEGES;