首页 > 数据库 >docker实战教程(十六):mysql主从复制docker版

docker实战教程(十六):mysql主从复制docker版

时间:2022-11-12 11:02:42浏览次数:48  
标签:主从复制 slave log ## master mysql docker

新建主服务器容器实例3307

docker run -p 3307:3306 --name mysql-master -v /mydata/mysql-master/log:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

进入/mydata/mysql-master/conf目录下新建my.cnf

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101 
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能
log-bin=mall-mysql-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

修改完配置后重启master实例

docker restart mysql-master

进入mysql-master容器

docker exec -it mysql-master /bin/bash

master容器实例内创建数据同步用户

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';

新建从服务器3308

docker run -p 3308:3306 --name mysql-slave -v /mydata/mysql-slave/log:/var/log/mysql -v /mydata/mysql-slave/data:/var/lib/mysql -v /mydata/mysql-slave/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
···

# 进入/mydata/mysql-slave/conf目录下新建my.cnf
```linux
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062  
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin  
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1  
## slave设置为只读(具有super权限的用户除外)
read_only=1

修改完配置后重启slave实例

docker restart mysql-slave

在主数据库中查看主从同步状态

show master status

进入mysql-slave容器

docker exec -it mysql-slave /bin/bash
mysql -u root -p

在从数据库中配置主从复制

change master to master_host='192.168.1.116', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin .000002', master_log_pos=617, master_connect_retry=30;

# master_host:主数据库的IP地址;
# master_port:主数据库的运行端口;
# master_user:在主数据库创建的用于同步数据的用户账号;
# master_password:在主数据库创建的用于同步数据的用户密码;
# master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
# master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
# master_connect_retry:连接失败重试的时间间隔,单位为秒

在从数据库中查看主从同步状态

show slave status \G;

在从数据库中开启主从同步

start slave;

查看从数据库状态发现已经同步

show slave status \G;

如果中间碰到Slave_IO_Running: No 的情况,我是这样处理的,先通过docker logs mysql-slave的容器ID查看报错日志

2022-11-12T02:27:44.765861Z 0 [Note] Server socket created on IP: '::'.
2022-11-12T02:27:45.081481Z 0 [Warning] Recovery from master pos 617 and file mall-mysql-bin.000002 for channel ''. Previous relay log pos and relay log file had been set to 4, ./mall-mysql-relay-bin.000001 respectively.
2022-11-12T02:27:45.097967Z 0 [Note] Event Scheduler: Loaded 0 events
2022-11-12T02:27:45.098459Z 2 [Warning] Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information.
2022-11-12T02:27:45.100861Z 0 [Note] mysqld: ready for connections.
Version: '5.7.36-log'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)
2022-11-12T02:27:45.102285Z 2 [Note] Slave I/O thread for channel '': connected to master '[email protected]:3307',replication started in log 'mall-mysql-bin.000002' at position 617
2022-11-12T02:27:45.102412Z 1 [Note] Slave SQL thread for channel '' initialized, starting replication in log 'mall-mysql-bin.000002' at position 617, relay log './mall-mysql-relay-bin.000002' position: 4
2022-11-12T02:27:45.107964Z 2 [ERROR] Error reading packet from server for channel '': Could not find first log file name in binary log index file (server_errno=1236)
2022-11-12T02:27:45.108000Z 2 [ERROR] Slave I/O for channel '': Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file', Error_code: 1236

很可能是master_log_file名字写错了,这时候再重启master重新生成,重启slave也会自动同步

docker restart mysql-master
mysql -u root -p
show master status

docker restart mysql-slave
mysql -u root -p
show slave status \G

主从复制测试

master

salve

标签:主从复制,slave,log,##,master,mysql,docker
From: https://www.cnblogs.com/my_captain/p/16863389.html

相关文章

  • mysql 中的 explain 关键字
    在MySQL中使用explain关键字可以模拟查看数据库是如何来执行SQL查询语句,也就是常说的查看一条SQL语句在数据库中的执行计划,如下图所示此图就是执行EXPLAINSELECT*FRO......
  • 腾讯云服务器mysql
    添加规则[root@VM-4-8-centos~]#cd/usr/local/src/[root@VM-4-8-centossrc]#wgethttp://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm[root@VM-......
  • mysql免安装版服务启动
    1.以管理员身份启动cmd2.cd到mysql的bin目录下3.执行:mysqld-install提示:  如果不以管理员身份运行,有可能出现以下错误:  4.这个时候,运行输入"servic......
  • MySQL union 和 order by 同时使用
    目录一、出现错误的情况二、解决上述问题的两种方法三、案例分析:求解:常见的错误解法(1)使用union和多个orderby不加括号【报错】(2)orderby在union子句中不起作用正......
  • MySQL的一些认知
    MyISAM与InnoDBMyISAM的优点:1.快速查询唯一键2.支持全文索引3.选择count(*)速度快4.磁盘空间占用较少缺点:1.表级别的锁定,运用程序写入时间大于5%,表锁定会降低运用程序速度2.......
  • MySQL常用函数
    MySQL数值型函数函数名称作 用ABS求绝对值SQRT求二次方根MOD求余数CEIL和 CEILING两个函数功能相同,都是返回不小于参数的最小整数,即向上取整FLOOR向下取整,返回值转化为......
  • MySQL主键索引和二级索引
    Mysql的索引首先,我们常说的索引类型有:主键索引、唯一索引、普通索引、前缀索引、全文索引,甚至还有聚簇索引、覆盖索引等。其中,唯一索引、普通索引、前缀索引等索引属于......
  • MySQL索引
    MySQL索引是一种帮助快速查找数据的数据结构,通过索引能够快速找到数据所在位置。场景的索引数据结构有:Hash表(通过hash算法快速定位数据,但不适合范围查询,因为需要每个key都......
  • 【转】Mysql分表和分区的区别
     一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块......
  • 插入MySQL报错‘pymysql.err.DataError: (1406, "Data too long for column 'url' at
    错误重现:插入MySQL报错‘pymysql.err.DataError:(1406,"Datatoolongforcolumn'url'atrow1")’解决方法:在插入MySQL的字符太多,此时将MySQL的模式改为非严格模......