docker search mysql
docker pull mysql:5.7.35
1.主节点服务器创建mysql文件夹
mkdir mysql
#mysql文件夹下 创建挂载目录 和 docker-compose.yml文件
mkdir volumes
mkdir conf data logs
2.制作docker-compose.yml
version : '3'
services:
mysql:
container_name: mysql
restart: always
image: mysql:5.7.35
ports:
- "3306:3306"
volumes:
- ./volumes/conf/mysql:/etc/mysql
- ./volumes/logs:/logs
- /var/lib/docker/volumes/data:/var/lib/mysql
command: [
'mysqld',
'--innodb-buffer-pool-size=80M',
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci',
'--default-time-zone=+8:00',
'--lower-case-table-names=0'
]
environment:
MYSQL_ROOT_PASSWORD: root
networks:
- mysql-net
networks:
mysql-net:
driver: bridge
3.拷贝容器内的配置文件到宿主机
1)启动一个mysql临时容器
docker run --name mysql-temp -e MYSQL_ROOT_PASSWORD=root --rm -d mysql:5.7.35
2)拷贝mysql-temp容器中的配置文件到宿主机
docker cp mysql-temp:/etc/mysql mysql/
3)重命名配置文件my.cnf.fallback
#拷贝出的配置文件虽然存在my.cnf文件但是link链接,容器停止后也会失效 故而直接用备份文件重命名,作为主要配置文件
mv -f my.cnf.fallback my.cnf
4.修改my.cnf配置文件
#在my.cnf配置文件最下方加入下方配置
[mysqld]
log-bin=mysql-bin # 开启 binlog
server-id=1 # 当前server在cluster中的id,必须保证在cluster中唯一
#只保留7天的二进制日志,以防磁盘被日志占满(可选)
expire-logs-days = 7
#备份的数据库(可选)
binlog-do-db=Vasyslink_base
#不备份的数据库 (可选)
#binlog-ignore-db=information_schema
#binlog-ignore-db=performation_schema
#binlog-ignore-db=sys
5.启动mysql-master
#docker-compose.yml同级目录
docker-compose up -d
6.创建用于从库的用户slave
#进入容器内mysql执行下方命令或使用第三方工具链接数据库后执行下方命令
CREATE USER 'slave' @'%' IDENTIFIED BY '123456';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave' @'%';
#刷新权限
FLUSH PRIVILEGES;
7.查看master状态
SHOW MASTER STATUS;
#查看Mater数据有哪些slave
select * from information_schema.processlist as p where p.command = 'Binlog Dump';
1.从节点服务器创建mysql文件夹
mkdir mysql
#mysql文件夹下 创建挂载目录 和 docker-compose.yml文件
mkdir volumes
mkdir conf data logs
2.制作docker-compose.yml
version : '3'
services:
mysql:
container_name: mysql-slave
restart: always
image: mysql:5.7.35
ports:
- "3306:3306"
volumes:
- ./volumes/conf/mysql:/etc/mysql
- ./volumes/logs:/logs
- ./volumes/data:/var/lib/mysql
command: [
'mysqld',
'--innodb-buffer-pool-size=80M',
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci',
'--default-time-zone=+8:00'
]
environment:
MYSQL_ROOT_PASSWORD: root
networks:
mysql_mysql-net:
#外部网络
external: true
3.拷贝容器内的配置文件到宿主机
1)启动一个mysql临时容器
docker run --name mysql-temp -e MYSQL_ROOT_PASSWORD=root --rm -d mysql:5.7.35
2)拷贝mysql-temp容器中的配置文件到宿主机
docker cp mysql-temp:/etc/mysql mysql/
3)重命名配置文件my.cnf.fallback
#拷贝出的配置文件虽然存在my.cnf文件但是link链接,容器停止后也会失效 故而直接用备份文件重命名,作为主要配置文件
mv -f my.cnf.fallback my.cnf
4.修改my.cnf配置文件
#在my.cnf配置文件最下方加入下方配置
[mysqld]
server-id=2
relay_log=relay-log
#开启只读 意味着当前的数据库用作读,当然这也只会影响到非root的用户,如果使用root用户操作本库是不会有影响的
read_only=ON
#同步Vasyslink_base库下所有的表,%为通配符
replicate_wild_do_table = Vasyslink_base.%
5.启动mysql-master
#docker-compose.yml同级目录
docker-compose up -d
6.关联master节点,启动从库同步功能
#进入mysql-slave容器
docker exec -it mysql-slave /bin/bash
#进入mysql
mysql -uroot -p
mysql>
#关联master节点
change master to master_host='172.20.2.1', master_user='slave' ,master_password='123456', master_port=3306,master_log_file='mysql-bin.000002', master_log_pos=189733443,master_connect_retry=30;
#启动slave
start slave;
#注意
master_host: 若同服务器下,可以是master节点的容器名称,不同服务器,使用服务器IP
master_log_file: 主节点的bin-log日志文件名称,master主节点的File
master_log_pos: 主节点的bin-long日志文件的位置,master主节点的Position
#master主节点的File和Position 主节点容器中使用show master status;命令可以查看
7.验证
#mysql-slave容器 mysql内
show slave status;
#均为yes才算成功
#Slave_SQL_Running:yes
#Slave_IO_Running:yes
在master主节点上创建a_master_test表,刷新slave节点从库,出现了对应的表
1)创建从节点报错
#从节点关联主节点时报错
change master to master_host='172.20.2.1', master_user='slave' ,master_password='123456', master_port=3306,master_log_file='mysql-bin.000002', master_log_pos=189733443,master_connect_retry=30;
ERROR 3021 (HY000): This operation cannot be performed with a running slave io thread; run STOP SLAVE IO_THREAD FOR CHANNEL '' first.
#原因:之前已经创建过从节点,需要停掉已启动,然后重新配置
stop slave;
reset master;