完全屬於我自己的Blog,運行在我的路由器H218N上.記錄著我想記錄的文字.

05月 10

MySQL热备份

环境设定

假设有3台MySQL服务器,分别为Master,Standby,Slave.
其实Standby也是一个Slave,只是叫法不一样而已.

切换Master原理

切换Master的一个基本思路就是:Slave和Standby在完全相同的位置停止运行,然后把Slave重定向到Standby.

模拟真实场景

场景准备

当数据量大时,StandbySlave的数据可能不一样
(如其中一个快的把Master的完全同步好,另外一个同步进度稍微落后)
即Slave和Standby不在完全相同的位置停止运行.
现假定Slave稍微落后,连上Slave,执行

stop slave;
show slave status\G

确认slave已经停掉

Slave_IO_Running: No
Slave_SQL_Running: No

Master上执行一些sql操作

Master >insert into init.test (id) values(1),(2),(3);

分别在StandbySlave查看是否有数据改变
结果如下

Slave > select * from init.test;
Empty set (0.02 sec)
Standby > select * from init.test;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)

此时,StandbySlave的同步进度就不一样.

Standby > show slave status\G
...
Relay_Master_Log_File: master-bin.000001
...
Exec_Master_Log_Pos: 454
...
Slave > show slave status\G
...
Relay_Master_Log_File: master-bin.000001
...
Exec_Master_Log_Pos: 210
...

Standby执行到454,Slave执行到210,Standby超前于Slave.

切换Master

停掉Standby的slave

Standby > stop slave;

使StandbySlave停在完全相同的位置上.根据前面的场景准备得到它们的位置.
然后执行

Slave > start slave until
    -> master_log_file = 'master-bin.000001',
    -> master_log_pos  = 454;
Slave > select master_pos_wait('master-bin.000001',454);
Slave > stop slave;

此时再查看Slave的slave状态,应该与Standby一样了.

Slave > show slave status\G
...
Relay_Master_Log_File: master-bin.000001
...
Exec_Master_Log_Pos: 454
...

现在把Standby切换成新的主服务器.
Slave连接到Standby并重启slave.
因为Master在停止运行点记录的文件和位置与Standby在同一点记录的文件和位置是完全不同的,有必要获取当Master记录更改时Standby记录的位置.
为此,在Standby上运行

Standby > show master status\G
*************************** 1. row ***************************
            File: master-bin.000006
        Position: 107
    Binlog_Do_DB: 
Binlog_Ignore_DB: 
1 row in set (0.00 sec)

获得位置信息后
Slave上执行

Slave > CHANGE MASTER TO
    -> MASTER_HOST = '127.0.0.1',
    -> MASTER_PORT = 3309,
    -> MASTER_USER = 'repl_user',
    -> MASTER_PASSWORD = 'root',
    -> MASTER_LOG_FILE='master-bin.000006',
    -> MASTER_LOG_POS=107;
Query OK, 0 rows affected (0.16 sec)
Slave > start slave;

现在Standby就可以作为Master使用了.

标签:MySQL, 热备份

还不快抢沙发

添加新评论