主从数据库 Slave_IO_Running: Connecting问题解决

MySQL主从数据复制

参考文章

  1. 架构计划

    192.168.67.146 master 主节点(主数据库)

    192.168.67.118 slave 从数据库

    主从数据库版本内容最好一致

  2. 修改主从数据库配置文件

    主数据库配置

    找到主数据库的配置文件my.cnf(或者my.ini),我的在/etc/mysql/my.cnf,在[mysqld]部分插入如下两行:

    [mysqld]
    log-bin=mysql-bin #开启二进制日志
    server-id=1 #设置server-id
    

    然后重启数据库,可以设置一个账户用来同步两个数据库的信息

    查看master状态,记录二进制文件名(mysql-bin.000002)和位置(155):

    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000002 |      155 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    

    从数据库配置

    找到从数据库的配置文件my.cnf(或者my.ini),在[mysqld]部分插入内容:

    [mysqld]
    server-id=2 #设置server-id,必须唯一
    

    接着重启数据库,进入MySQL会话执行同步SQL语句(需要主数据库的一个用户和主数据库ip地址)

    mysql> CHANGE MASTER TO
        -> MASTER_HOST='192.168.67.146',
        -> MASTER_USER='root',
        -> MASTER_PASSWORD='root',
        -> MASTER_LOG_FILE='mysql-bin.000003',
        -> MASTER_LOG_POS=155;
    Query OK, 0 rows affected, 2 warnings (0.03 sec)
    

    在该数据库中启动slave同步

    mysql>start slave;
    

    查看是否成功执行命令

    mysql> show slave status\G;
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.67.146
                      Master_User: root
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000003
              Read_Master_Log_Pos: 155
                   Relay_Log_File: localhost-relay-bin.000002
                    Relay_Log_Pos: 322
            Relay_Master_Log_File: mysql-bin.000003
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                  Replicate_Do_DB:
              Replicate_Ignore_DB:
               Replicate_Do_Table:
           Replicate_Ignore_Table:
          Replicate_Wild_Do_Table:
      Replicate_Wild_Ignore_Table:
                       Last_Errno: 0
                       Last_Error:
                     Skip_Counter: 0
              Exec_Master_Log_Pos: 155
                  Relay_Log_Space: 534
                  Until_Condition: None
                   Until_Log_File:
                    Until_Log_Pos: 0
               Master_SSL_Allowed: No
      Replicate_Ignore_Server_Ids:
                 Master_Server_Id: 1
                      Master_UUID: 0041fd85-4371-11eb-92b3-000c290949eb
                 Master_Info_File: mysql.slave_master_info
                        SQL_Delay: 0
              SQL_Remaining_Delay: NULL
          Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
               Master_Retry_Count: 86400
               ~~
    1 row in set (0.00 sec)
    
    ERROR:
    No query specified
    

    其中Slave_IO_Running: Yes Slave_SQL_Running: Yes状态需要是Yes表示成功,接下来就可以进行验证操作,比如在主master数据库的test数据库的一张表中插入一条数据,在slave的test库的相同数据表中查看是否有新增的数据即可验证主从复制功能是否有效,还可以关闭slave(mysql>stop slave;),然后再修改master,看slave是否也相应修改(停止slave后,master的修改不会同步到slave),就可以完成主从复制功能的验证了;

    还可以用到的其他相关参数:

    master开启二进制日志后默认记录所有库所有表的操作,可以通过配置来指定只记录指定的数据库甚至指定的表的操作,具体在mysql配置文件的[mysqld]可添加修改如下选项:

    # 不同步哪些数据库  
    binlog-ignore-db = mysql  
    binlog-ignore-db = test  
    binlog-ignore-db = information_schema  
      
    # 只同步哪些数据库,除此之外,其他不同步  
    binlog-do-db = game 
    
  3. 问题解决

    按照上面的配置发现

    Slave_IO_Running: Connecting  # 出现错误,IO线程处于正在连接状态

    解决一

    首先在从数据库链接登录主数据库,查看是否能够成功登录

    mysql -uroot -proot -h192.168.67.146(主数据库分配的user和pwd以及主数据库的IP地址)

    假如不能登录则需要关闭防火墙后重试

    systemctl stop firewalld 关闭网络防火墙
    systemctl disable firewalld 关闭开机自启动(永久关闭)
    

    解决二

    由于测试是使用本地虚拟机实现,我的虚拟机是使用克隆出来的两个虚拟机,所以在文件夹/var/lib/mysql下面的auto.cnf文件中server-uuid=64e8e1b7-e13e-11ea-9d5f-000c29a7b93f俩个虚拟机数据库的uuid相同所以导致一直处于Slave_IO_Running: Connecting状态,假如主从数据库中的UUID相同则将主从数据库中的auto.cnf文件删除后重新启动数据库后可以解决

    解决三

    由于每次数据库重启后都会导致master status发生变化,所以需要根据当前的master status来修改从数据库中的SQL同步语句

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值