Docker Mysql主从同步

本文介绍了一种通过配置主从数据库实现数据同步的方法。包括主库和从库的配置步骤、操作指南及可能遇到的问题及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

主从数据库

主库

配置

操作

从库

配置

操作

 可能遇到的问题

1)主从库uuid和server_id重复导致错误;

2)连接错误;

3)主从同步不一致导致的错误;

4)slave已启动,但想修改主库配置;


主从数据库

主库: 

        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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值