Mysql主从复制及配置实现以及坑坑坑

今天搞Mysql主从复制,遇到了很多坑,在此记录相关操作。
今天用tp5.1进行mysql 的主从复制,数据库配置如下:

 // 数据库类型
    'type'            => 'mysql',
    // 服务器地址
    'hostname'        => 'localhost,60.205.204.160',
    // 数据库名
    'database'        => 'database',
    // 用户名
    'username'        => 'username',
    // 密码
    'password'        => '111111',
    // 端口
    'hostport'        => '3306',
    // 数据库调试模式
    'debug'           => true,
    // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
    'deploy'          => 1,
    // 数据库读写是否分离 主从式有效
    'rw_separate'     => true,
    // 读写分离后 主服务器数量
    'master_num'      => 1,
    // 指定从服务器序号
    'slave_no'        => '0',

两台服务器都是CENTOS
ip1,ip2

首先要开启二进制

  在mysql配置文件中
  log-bin=mysql-bin

开始构建主从复制
第一步:

在主服务器配置如下:

在ip1中创建一个ip2主机中可以登录的MySQL用户

用户:ip2_user

密码:ip2_pwd

            mysql>GRANT REPLICATION SLAVE ON *.* TO ‘ip2_user’@’ip2' IDENTIFIED BY ‘ip2_pwd’;
            mysql>FLUSH PRIVILEGES;

第二步:

查看ip1MySQL服务器二进制文件名与位置

            mysql>SHOW MASTER STATUS;

            mysql>show master status \G;
Mysql主从复制及配置实现以及坑坑坑_第1张图片
查看ip1MySQL服务器二进制文件名与位置

第三步:

告知二进制文件名与位置
在从服务器中配置如下:
在ip2中执行:

          mysql>CHANGE MASTER TO

                   >MASTER_HOST=’ip1’,

                   >MASTER_USER=’ip2_user’,

                   >MASTER_PASSWORD=’ip2_pwd’,

                   >MASTER_LOG_FILE=’mysql-bin.000004’,

                   >MASTER_LOG_POS=2015812;

测试主从复制

在ip2(从服务器)中开启主从复制:

            mysql>start slave;   #开启复制

            mysql>SHOW SLAVE STATUS\G   #查看主从复制是否配置成功
            Slave_IO_State:
                  Master_Host: 118.24.2.153
                  Master_User: tp_gcan_top
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 2015812
               Relay_Log_File: iz2ze4j3dpfuv8vtlac7ymz-relay-bin.000002
                Relay_Log_Pos: 4
        Relay_Master_Log_File:
             Slave_IO_Running: No
            Slave_SQL_Running: No

由上可以发现下面两个出现异常:

        Slave_IO_Running: No
        Slave_SQL_Running: No

如果这两个都是Yes,说明主从复制已经配置成功了。
解决方法如下:

      SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; 
      START SLAVE; 
      mysql>SHOW SLAVE STATUS\G 
      Slave_SQL_Running: Yes 
      Slave_SQL_Running已经变成Yes,那么就剩下Slave_IO_Running: No要解决了

导致lave_IO_Running 为connecting 的原因主要有以下 3 个方面:

      1、网络不通  
      2、密码不对  
      3、pos不对
   # telnet ip1 3306
   Trying ip1...
   telnet: connect to address ip1: No route to host

测试ip1 3306端口是否连通,发现 No route to host
说明ip1没有放行3306端口。
将ip1的3306端口放行即可。

放行端口后已经可以连通,但是Slave_IO_Running: No还是NO

mysql同步的数据中是包含server-id的,用于标识该语句最初是从哪个server写入的,因此server-id一定要有的
每一个同步中的slave在master上都对应一个master线程,该线程就是通过slave的server-id来标识的;
每个slave在master端最多有一个master线程,如果两个slave的server-id 相同,则后一个连接成功时,前一个将被踢掉。
这里至少有这么一种考虑 slave主动连接master之后,如果slave上面执行了slave stop;
则连接断开,但是master上对应的线程并没有退出;
当slave start之后,master不能再创建一个线程而保留原来的线程,那样同步就可能有问题

因为我的两台服务器的mysql配置文件中

server-id   = 1

这个配置是相同的,所以我将从服务器的server-id值更改如下:

server-id   = 2

然后我将从服务器的mysql重启发现:

 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes

好了,这时主从复制已经配置成功。

你可能感兴趣的:(Mysql主从复制及配置实现以及坑坑坑)