Mysql5.7主从复制(常遇问题解决)

本文概览

  • 备份原数据库并记录相关事务点

  • 在原数据库中建立复制用户

  • 在新实例上恢复备份数据库

  • 在新实例上配置复制链路

  • 在新实例上启动复制

一、备份Master上的数据库

mysql>mysqldump --master-data=2 --single-transaction --routines --triggers --events -uroot -p imooc_db > bak_imooc.sql

master-data记录日志点
single-transaction指定备份是在一个事务中完成
routines备份存储过程
triggers备份触发器
events备份事件
输入密码后有可能显示如下异常:
mysqldump: Error: Binlogging on server not active
则需要开启日志功能:
/etc/my.conf中新增:

必须放在mysqld的下面
log-bin=mysql
server-id=1

再次执行则可成功。

二、将备份文件导入到数据库中

新建数据库

order_db:># mysql -u root -p -e"create database order_db"

导入备份文件到数据库中

>#mysql -uroot -p order_db < bak_imooc.sql

三、在主节点中新建主从复制的账号

mysql> create user 'im_repl'@'172.22.%.%' identified by '123456';

可能会由于安全策略出现创建失败的情况,只需要修改一下安全策略:两种常用方法:

  1. 在/etc/my.cnf配置文件中增加validate_password=off([mysqld]的下面);
  2. set global validate_password_policy=0;(修改密码策略为LOW),set global validate_password_length=0;(修改密码长度);

四、授予主从复制账号权限

mysql> grant replication slave on *.* to 'im_repl'@'172.22.%.%';

五、在从节点中新建复制链路

== 在mysql中如果有不熟悉的命令可以通过\h 命令关键字,进行查看。==

mysql>change master to master_host=’172.22.34.28’, master_user=’im_repl’,master_password=’123456’, MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=154

参数说明:
master_host是同步的主机地址
master_user是同步的用户
master_password是同步的密码

master_log_file是同步的文件名
MASTER_LOG_POS是同步的位置
以上两个值都是从备份文件中直接复制的:
Mysql5.7主从复制(常遇问题解决)_第1张图片
经过以上配置是否就可以直接启动了呢?
我们在主服务器中用的数据库名称是“master_db”,但是从服务器中的数据库名是“order_db”、“product_db”、“customer_db”,这样一来从库和主库的数据库名不一样,直接启动会报错的。
所以,需要建立过滤链接

Mysql> change replication filter replicate_rewrite_db=((master_db, order_db));

查看状态:

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 172.22.34.28
                  Master_User: im_repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 154
               Relay_Log_File: localhost-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: No
            Slave_SQL_Running: No
              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: 154
              Relay_Log_Space: 154
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 0
                  Master_UUID: 
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: 
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: (master_db,order_db)
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

Replicate_Rewrite_DB: (master_db,order_db)

六、正式开启主从复制功能

mysql>start slave;

如果一切正常,则show slave status;后:

             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

但是,有时候会出现以下情况:

             Slave_IO_Running: No
            Slave_SQL_Running: Yes

此时,就要查看从节点的日志了(/var/log/mysqld.log),我遇到的问题如下:

Slave I/O for channel '': 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). Error_code: 1593

通过分析可知,是由于server-id冲突造成的,而且mysql 5.6的复制引入了uuid的概念,各个复制结构中的server_uuid也得保证不一样才行:
首先修改server-id:

vi /etc/my.cnf
[mysqld]
server-id=1

然后修改server_uuid:

// 查看
show variables like '%server_uuid%';

Master:

mysql> show variables like '%server_uuid%';
+---------------+--------------------------------------+
| Variable_name | Value                                |
+---------------+--------------------------------------+
| server_uuid   | 46d587a7-3660-11e9-8173-080027b427af |
+---------------+--------------------------------------+
1 row in set (0.01 sec)

Slave:

mysql> show variables like '%server_uuid%'
    -> ;
+---------------+--------------------------------------+
| Variable_name | Value                                |
+---------------+--------------------------------------+
| server_uuid   | 46d587a7-3660-11e9-8173-080027b427af |
+---------------+--------------------------------------+
1 row in set (0.02 sec)

Master和Slave中的server_uuid是一样的,这就是出错的原因。那么这个问题是如何产生的呢?
原来我是用虚拟机来模拟的环境,在配置好master后,我直接复制了master的虚拟机修改了一下虚拟机名后当作了slave。
问题解决:
找到data文件夹下的auto.cnf文件,修改里面的uuid值,保证各个db的uuid不一样,重启db即可。

// 查看auto.cnf文件的位置:
>vi /etc/my.cnf

[mysqld]
#
...
log_bin=mysql-bin
server-id=1

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
validate_password=off

// 找到data的目录
datadir=/var/lib/mysql

vi auto.cnf	// 修改id即可

修改完后,需要重启:

service mysqld restart

你可能感兴趣的:(Mysql)