Docker操作Mysql主备模式

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

请确保目前Mysq已经启动

docker ps  #查看容器id
复制代码
sudo docker exec -it {容器id} /bin/bash  #进入容器内部
复制代码

配置主数据库

根据安装mysql时设定的路径进入my.cnf

进入
vim my.cnf #如果没vim就装一个
#安装vim命令
apt-get update
apt-get install vim
​
[mysqld]
##同局域网唯一ID
server-id=100
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
##server-id=201
##log-bin=mysql-bin 
# 同一局域网下均唯一
复制代码

进入MySQL

mysql -uroot -p
复制代码
#创建同步用户以及权限
CREATE USER ‘slave’@’%’ IDENTIFIED BY ‘123456’;
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . TO ‘slave’@’%’;
复制代码

使用Navicat链接一下建立的slave,查看是否成功

配置从数据库

[mysqld]
## 设置server_id,注意要唯一
server-id=202
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin  
复制代码

链接主数据库

进入到主数据库查看状态

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 |     7624 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
复制代码

从数据库根据主数据库状态执行

mysql> change master to master_host='{ip_address}', 
    -> master_user='slave', master_password='123456',
    -> master_port=3306, 
    -> master_log_file='mysql-bin.000004', 
    -> master_log_pos= 7624, master_connect_retry=30;
复制代码

从库执行

mysql> start slave ; #开启同步
    
#查看同步状态    
mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.77.18
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 30
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 7624
               Relay_Log_File: bda0b9647912-relay-bin.000002
                Relay_Log_Pos: 324
        Relay_Master_Log_File: mysql-bin.000004
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
              #略
复制代码

出现

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

表示搭建成功

排坑

Slave_IO_Running: NO

  1. 找到mysql配置的这个文件/etc/my.cnf
  2. 在文件中找到mysql错误异常日志文件的路径,我配置的是log-error=/var/log/mysqld.log
  3. 编辑/var/log/mysqld.log文件
  4. 查看具体异常信息

异常信息

[ERROR] Slave I/O for channel ‘’: Fatal error: The slave I
/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must
be different for replication to work. Error_code: 1593
复制代码

问题原因
由于uuid相同,而导致触发此异常

解决方案

由于存Mysql的 虚拟机为一台复制过来的,所以 uudi 相同,把uuid修改即可

Slave_IO_Running:Connecting ; Slave_SQL_Running:Yes

1.网络不通
2.账户密码错误
3.防火墙
4.mysql配置文件问题
5.连接服务器时语法
6.主服务器mysql权限

这个比较清楚明了,就不具体说明了,跟上面的实操下来,就知道这6条都要怎么改。

Slave_SQL_Running:No

原因:

1.程序可能在slave上进行了写操作

2.也可能是slave机器重起后,事务回滚造成的。

解决方案

首先停掉Slave服务:slave stop

进入master

mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000003 | 8935 | test1 | jzsoft | +------------------+----------+--------------+------------------+
手动同步

mysql> change master to master_host=' 你的ip',master_user='slave',master_pas sword=' 你的密码 ',master_log_file='mysql-bin.000003',master_log_pos=8935;

mysql> show slave status\G;

看到

Slave_IO_Running: Yes Slave_SQL_Running: Yes
即可

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享