数据库 1 是常规数据库服务器。他将其复制到数据库 2...直接克隆。主对主。它们始终处于“同步”状态。它们各自有 4000 万行。
今天,数据库 2 “坏了”,似乎返回的结果与数据库 1 不同。这不正常,因为它们应该是相同的。
您会提出什么建议来解决这个问题?
我是否应该删除数据库 2,并让数据库 1 重新复制到数据库 2?如果是,我该怎么做?
-我需要知道他做了哪些更改以及输入了哪些命令,以便我可以撤消复制并创建新的复制。
答案1
在尝试任何其他操作之前,请检查 DB 2 是否是 DB 1 的复制从属。在 DB 2 上执行“SHOW SLAVE STATUS”。如果它给出结果,则很可能发生了错误,从而停止了复制。
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: localhost
Master_User: root
Master_Port: 3306
Connect_Retry: 3
Master_Log_File: gbichot-bin.005
Read_Master_Log_Pos: 79
Relay_Log_File: gbichot-relay-bin.005
Relay_Log_Pos: 548
Relay_Master_Log_File: gbichot-bin.005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 79
Relay_Log_Space: 552
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: 8
检查名为
Slave_IO_Running
Slave_SQL_Running and
Seconds_behind_master
如果“running”列显示“否”且“seconds_behind_master”大于几秒钟,请检查“last_error”中的值。它应该可以让您了解错误发生的位置。尝试修复它(通过修改 DB 2 上的数据)并通过在 DB 2 上运行“START SLAVE”给它一个新的尝试。之后立即检查“SHOW SLAVE STATUS”。
为了深入了解,我建议阅读 MySQL 手册,特别是有关复制设置的章节:MySQL 5.0 复制
答案2
您需要首先确认 DB 2 是否仅包含 DB 1 数据的子集,或者两个服务器是否都包含对方不包含的记录(即 DB 1 也缺少数据)。如果是这种情况,则删除复制,擦除 DB 2,然后重新启动,这次操作正确...
如果不是这样,那么您就需要编写大量的 SQL。
答案3
您的复制可能是通过编程方式完成的,即“手动”,就像代码一样。您别无选择,只能手动重新同步所有内容。
从官方文档:
如果您的数据库特别大,复制原始数据文件可能比使用 mysqldump 并在每个从属服务器上导入文件更有效。
- 停止复制。
- 停止对数据库的所有操作(不再访问、读取或写入)
- 完全关闭两个数据库。
- 有风险但是如果你有大量数据集,你可以在停止复制并刷新 binlog 后将“数据”目录复制到 Master 2。这样会很快,并且会 100% 复制你的 Master。有风险
- 重新启动数据库。
- 重新开始复制。