目录
主从数据库
主库:
ip:172.27.1.1
端口:13306(具体而定)
从库:
ip:172.27.1.2
端口:23306(具体而定)
主库
配置
1.my.cnf
[mysqld]
# 开启二进制日志并指定日志名前缀
log-bin=mysql-bin
# 设置唯一库ID
server-id=1
2.mysql-compose.yaml
version: '3'
services:
mysql:
image: mysql
restart: always
container_name: mysql_master
environment:
MYSQL_ROOT_PASSWORD: 123456
TZ: Asia/Shanghai
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M;
ports:
- 13306:3306
volumes:
# 映射SQL文件
- /srv/mysql/sql:/sql
- /srv/mysql/data:/var/lib/mysql
# ro只读模式
- /etc/localtime:/etc/localtime:ro
操作
1. 重启容器
# 查看所有容器
docker ps -a
# 重启容器
docker restart <主库mysql容器名>
# 进入容器
sudo docker exec -it <主库mysql容器名> /bin/bash
# 进入mysql
mysql -u root -p
2.创建slave用户并赋予权限
# 创建用户slave
CREATE USER 'slave'@'172.27.1.2' IDENTIFIED BY '123456';
# 授予用户slave相关权限
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'172.27.1.2';
# 刷新权限
FLUSH PRIVILEGES;
3.导出主库数据
# 锁表,待从库配置好后解锁
FLUSH TABLES WITH READ LOCK;
# 查看主库二进制日志文件(binary log)文件名(File)和位置(Position),待会儿从库配置有用
SHOW MASTER STATUS;
# 查看数据库
show databases;
# 退出mysql, 导出主库数据库
mysqldump -u root -p <主库数据库名> > <主库数据库名>.db
# 如:mysqldump -u root -p test > test.db
# 发送到从库
scp test.db root@172.27.1.2:/tmp/
从库
配置
1. my.cnf
[mysqld]
# 开启二进制日志并指定日志名前缀
log-bin=mysql-bin
# 设置唯一库ID
server-id=2
2. mysql-compose.yaml
version: '3'
services:
mysql:
image: mysql
restart: always
container_name: mysql_slave
environment:
MYSQL_ROOT_PASSWORD: 123456
TZ: Asia/Shanghai
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--default-authentication-plugin=mysql_native_password
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M;
ports:
- 23306:3306
volumes:
# 映射SQL文件
- /srv/mysql/sql:/sql
- /srv/mysql/data:/var/lib/mysql
# ro只读模式
- /etc/localtime:/etc/localtime:ro
操作
1. 重启容器
docker ps -a
docker restart <从库mysql容器名>
sudo docker exec -it <从库mysql容器名> /bin/bash
mysql -u root -p
2. 将主库数据导入从库
# 1)若从库该db已存在
use test.db
source /tmp/test.db
# 2)db不存在,进入mysql前直接创建导入
mysql -u root -p test< /tmp/test.db
3. 配置主库连接参数
# 配置主库参数
CHANGE MASTER TO
# 主库IP
MASTER_HOST='172.27.1.1',
# 主库端口
MASTER_PORT=13306,
# 用于连接的用户名
MASTER_USER='slave',
# 密码
MASTER_PASSWORD='123456',
# bin log 日志文件名
MASTER_LOG_FILE='binlog.000022',
# bin log 日志位置
MASTER_LOG_POS=7052512;
4. 开启从库,主从同步
# 开启从库
start slave;
# 查看状态
show slave status\G;
出现两个Yes即完成。
# 然后回到主库,解除锁表。
UNLOCK TABLES;
可能遇到的问题
1)主从库uuid和server_id重复导致错误;
Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).
解决方案:
在mysql中输入以下命令,查看主从库是否重复,确保两者不同;
show variables like '%server_uuid%';
show variables like '%server_id%';
server_id:
1.可以在my.cnf中修改,但重启后可能依然不生效;
2.用“SET GLOBAL server_id=;”解决,但此命令会在mysql服务重启后丢失。
uu_id:
在mysql中的auto.cnf中修改;
待uu_id和server_id修改完后重启容器。
2)连接错误;
error connecting to master 'root@172.27.110.86:49153' - retry-time: 60 retries: 1 message: Access denied for user 'root'@'172.26.121.90' (using password: YES)
解决方案:
主库重新创建用户,赋予权限;
# 删除之前用户
DROP USER 'root'@'172.26.121.90';
# 创建用户slave
CREATE USER 'slave'@'172.26.121.90' IDENTIFIED BY '123456';
# 授予用户slave相关权限
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'172.26.121.90';
# 刷新权限
FLUSH PRIVILEGES;
3)主从同步不一致导致的错误;
Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 1 failed executing transaction 'ANONYMOUS' at master log binlog.000022, end_log
解决方案:
1.跳过n步错误
# 停止主从同步
stop slave;
# 跳过n个错误
set global sql_slave_skip_counter =n;
# 开启主从同步
start slave;
2.重新配置主从
4)slave已启动,但想修改主库配置;
ERROR 3021 (HY000): This operation cannot be performed with a running slave io thread;
解决方案:
# 先停止slave
stop slave;
# 再重新配置主库参数
CHANGE MASTER TO
# 主库IP
MASTER_HOST='172.27.1.1',
# 主库端口
MASTER_PORT=13306,
# 用于连接的用户名
MASTER_USER='slave',
# 密码
MASTER_PASSWORD='123456',
# bin log 日志文件名
MASTER_LOG_FILE='binlog.000022',
# bin log 日志位置
MASTER_LOG_POS=7052512;