Leo*_*doC 6 mysql mysql-replication mysql5.5
我们正在使用异步复制构建一个简单的主/从 MySQL 配置,在服务器和基于 innoDB 的表上使用 MySQL Enterprise 5.5.17。在主服务器崩溃的情况下,我们希望为我们的用户提供使用从服务器的最新数据库内容恢复主服务器的可能性。在主服务器上,数据库和二进制日志存储在不同的磁盘设备中,以提高可靠性。
什么是最好的方法来做到这一点?我试图为此概述一个程序,但我不确定这是否正确:
这个可以吗?
为了简化从站到主站的升级,我建议让从站与主站保持更紧密的同步。
您应该使用工具mk-slave-prefetch。
这个工具的优点在于:在从属设备上,它将读取中继日志,查找所有具有 WHERE 子句的查询,将其转换为 SELECT 并执行它。这样,Slave 上的 InnoDB 和 MyISAM 缓存与 Master 上的缓存本质上是相同的。差异应该很小。
您还需要以下其他内容:使用循环复制设置主站和从站。这样,Master 和 Slave 都启用了二进制日志记录。
这有什么帮助?当主服务器崩溃并且您故障转移到从服务器时,主服务器上的文件 master.info 将包含从服务器最后执行 SQL 的位置。您可以通过以下方式找到答案:
对于此示例,我们将在 M1 和 M2 之间进行循环复制
在 M2(您当前的 Master)上运行此命令:SHOW SLAVE STATUS\G
你应该看到这样的东西:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.64.100.253
Master_User: replicant
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000834
Read_Master_Log_Pos: 823413571
Relay_Log_File: relay-bin.002505
Relay_Log_Pos: 823391419
Relay_Master_Log_File: mysql-bin.000834
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: 823391282
Relay_Log_Space: 823413708
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: 1
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
请注意两个字段:
这两个字段代表主服务器在从服务器上成功执行的最后一个日志文件和日志位置。
假设 M1 崩溃,您将故障转移到 M2,然后启动 M1。您的目标是重新建立循环复制。如果发生崩溃,复制可能会失去其位置。以下是该怎么做:
SHOW SLAVE STATUS\G
Step01)在M1上运行
Step02)从Step01获取Relay_Master_Log_File
和。Exec_Master_Log_Pos
对于此示例,Relay_Master_Log_File
设 mysql-bin.000834 为Exec_Master_Log_Pos
823391282。
Step03) 运行这些命令
STOP SLAVE;
CHANGE MASTER TO master_log_file='mysql-bin.000834',master_log_pos=823391282;
START SLAVE;
SELECT SLEEP(5);
SHOW SLAVE STATUS\G
Run Code Online (Sandbox Code Playgroud)
以下是要寻找的内容:
你可以用以下方法解决这个问题
STOP SLAVE;
CHANGE MASTER TO master_log_file='mysql-bin.000835',master_log_pos=<new pos>;
START SLAVE;
SELECT SLEEP(5);
SHOW SLAVE STATUS\G
Run Code Online (Sandbox Code Playgroud)
newpos是什么?
如果你实现循环复制并使用这些原则正确地编写这些东西的脚本,你将实现Master和Slave的恢复。