首页 > 编程笔记 > MySQL笔记 阅读:21

MySQL主从切换具体步骤(非常详细)

在实际工作环境中,有时候会遇到这样的问题:在一个工作环境中,有一个主数据库服务器 A,两个从数据库服务器 B、C 同时指向主数据库服务器 A,当主数据库服务器 A 发生故障时,需要将其中的一个从数据库服务器 B 切换成主数据库服务器,同时修改数据库服务器 C 的配置,使其指向新的主数据库服务器 B。

下面介绍一下切换主从服务器的具体操作步骤。

MySQL主从切换步骤

1) 首先要确保所有的从数据库都已经执行了 relay log 中的全部更新,查看从数据库的状态是否是 Has read all relay log(是否更新都已经执行完成)。
mysql> stop slave IO_THREAD;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW PROCESSLIST \G;
*** 1. row ***
    Id: 2
   User: system user
   Host:
    db: NULL
Command: Connect
   Time: 39
  State: Has read all relay log; waiting for the slave I/O thread to update it
   Info: NULL
*** 2. row ***
    Id: 3
   User: root
   Host: localhost
    db: NULL
Command: Query
   Time: 0
  State: NULL
   Info: SHOW PROCESSLIST
2 rows in set (0.00 sec)

2) 再从数据库 B 上停止 slave 服务,然后执行 reset master,重置成主数据库。
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

mysql> reset master;
ERROR 1186 (HY000): Binlog closed, cannot RESET MASTER
此时报 Binlog 错误(表示没有设置),不能够执行 reset master 命令。下面关闭数据库服务,然后修改 /etc/my.cnf,在 [mysqld2]后面的配置选项中添加 log-bin 选项:
[mysqld2]
…
log-bin = /usr/local/var/mysql2/mysql-bin
配置完成后,重启数据库服务,登录数据库 B,然后执行如下命令开启主数据库功能:
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

mysql> reset master;
Query OK, 0 rows affected (0.04 sec)
此时从数据库 B 已经成功切换成为主数据库,下面接着设置从数据库。

3) 在从数据库服务器 B 上添加具有 replication 权限的用户 rep1,查询主数据库状态:
mysql> grant replication slave on *.* to 'rep1'@'localhost' identified by '123';
Query OK, 0 rows affected (0.00 sec)

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

4) 在从数据库服务器 C 上配置复制的参数。
mysql> change master to
   -> master_host='127.0.0.1',
   -> master_user='rep1',
   -> master_password='123',
   -> master_port=3307,
   -> master_log_file='mysql-bin.000002',
   -> master_log_pos=98;
Query OK, 0 rows affected (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

5) 在从数据库服务器 C 上执行 show slave status 命令,查看从数据库服务是否成功启动:
mysql> show slave status \G;
*** 1. row ***
          Slave_IO_State: Waiting for master to send event
             Master_Host: 127.0.0.1
             Master_User: rep1
             Master_Port: 3307
           Connect_Retry: 60
          Master_Log_File: mysql-bin.000002
      Read_Master_Log_Pos: 98
          Relay_Log_File: mysql3-relay-bin.000002
           Relay_Log_Pos: 235
     Relay_Master_Log_File: mysql-bin.000002
         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: 98
          Relay_Log_Space: 235
          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: 0
1 row in set (0.00 sec)

6) 在主数据库服务器 B 和从数据库服务器 C 上面测试数据库是否成功设置复制功能。首先,查看主数据库服务器 B 中 test 库中表的情况:
mysql> use test;
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| rep_t1        |
| rep_t2        |
+----------------+
2 rows in set (0.00 sec)
然后,查询从数据库服务器 C 中 test 库中表的情况:
mysql> use test;
Database changed
mysql> show tables;
Empty set (0.01 sec)

7) 在主数据库服务器 B 中增加表 rep_t3:
mysql> create table rep_t3(data int);
Query OK, 0 rows affected (0.01 sec)

8) 在从数据库服务器 C 中查询,看看表 rep_t3 是否从主数据库服务器 B 上成功复制过来:
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| rep_t3        |
+----------------+
1 row in set (0.00 sec)
至此,主从数据库成功地做了切换。最后,如果原来的主数据库服务器 A 可以修复,可以考虑采用以上方法将数据库服务器 A 配置成为数据库服务器 B 的从数据库。

相关文章