1

我为实时 mySQL 数据库同步开发了一种自定义机制,与内置的 mySQL 主/从复制相比,它随着时间的推移提供更高的可靠性(数据完整性) 。

同步机制以周期性循环运行,每 5 秒触发一次,由以下阶段组成:

  1. 数据库被命令通过mysqldump
  2. 转储文件被传输到远程服务器,拥有从数据库。此传输利用了rsyncdelta 算法和数据压缩
  3. 远程服务器等待接收确认以继续
  4. 远程服务器将接收到的转储文件导入从属mySQL数据库
  5. 远程服务器确认本地服务器同步周期已完成

为了防止主从之间的任何不一致,转储文件将删除整个从数据库调用mysqldump--add-drop-database

由于从机在不中断 mySQL 守护进程的情况下导入转储文件,我担心如果在 mySQLdrop database从转储文件读取指令之后的时间窗口内,以及在 mySQL 完成所有表的重新创建之前,mySQL 客户端试图访问尚未重新创建的表的数据库可能会导致他的请求失败。

可能会发生这种情况,或者在游戏过程中,任何试图访问数据库的最终客户端都被安静地暂停,直到它的请求可以被执行?最终,可以应用哪些解决方案?

4

1 回答 1

3

为了避免从可能试图连接到特定数据库的任何客户端下拉出地毯,最好的方法可能是每次刷新时不要DROP和数据库。CREATE

一种可能被证明更可靠的方法是一次将数据加载到备用表中,然后进行批量切换。例如:

CREATE TABLE __users (...);
INSERT INTO __users (...) VALUES (...), ...;

CREATE TABLE __things (...);
INSERT INTO __things (...) VALUES (...), ...;

RENAME users to _users, __users to users, things to _things, __things to things;
DROP table _users;
DROP table _things;

如果您将所有内容正确排列,则批量重命名操作将自动执行。

您要么必须更改原始 SQL 转储本身中的名称,要么转储为更容易解析的格式,例如SELECT INTO ... OUTFILE稍后使用LOAD DATA INFILE.

请注意,此方法将不处理VIEWTRIGGER对象等。它只适用于普通的旧表。在重新加载过程中,您还需要有足够的可用空间来创建整个数据库的两个副本。

于 2012-11-30T17:25:07.057 回答