Mysql 导入转储文件时不可能出现服务中断
我开发了一种用于实时mySQL数据库同步的自定义机制,与内置mySQL主/从复制相比,该机制随时间提供了更高的可靠性(数据完整性) 同步机构以定期循环运行,每5秒定期触发一次,由以下阶段组成:Mysql 导入转储文件时不可能出现服务中断,mysql,mysqldump,database-backups,Mysql,Mysqldump,Database Backups,我开发了一种用于实时mySQL数据库同步的自定义机制,与内置mySQL主/从复制相比,该机制随时间提供了更高的可靠性(数据完整性) 同步机构以定期循环运行,每5秒定期触发一次,由以下阶段组成: 主数据库被命令通过mysqldump 转储文件被传输到拥有从数据库的远程服务器。这种传输利用了rsync的delta算法和数据压缩 远程服务器等待接收确认以继续 远程服务器将接收到的转储文件导入从属mySQL数据库 远程服务器向本地服务器确认同步周期已完成 为了防止主数据库和从数据库之间出现任何不一致,转
mysqldump
mysqldump
和--add drop database
删除整个从数据库
由于从机在不中断mySQL守护进程的情况下导入转储文件,我担心在mySQL从转储文件读取drop database
指令之后的时间窗口内,以及mySQL完成所有表的重新创建之前,mySQL客户端试图访问尚未重新创建的表的数据库,其请求可能会失败
可能会发生这种情况,或者在重新创建过程中,任何试图访问数据库的最终客户机都会安静地暂停,直到其请求可以执行为止?最后,可以应用什么解决方案?为了避免将地毯从任何试图连接到特定数据库的客户机下面拉出来,最好的方法可能是每次刷新时不要
删除和创建数据库
一种可能被证明更可靠的方法是将数据一次加载到备用表中,然后进行批量切换。例如:
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。。。输出文件
,然后使用加载数据填充进行恢复
请注意,此方法不会处理视图
或触发器
对象等。它只适用于普通的旧桌子。在重新加载过程中,您还需要有足够的可用空间来创建整个数据库的两个副本。有两种复制模式,语句和二进制。两者都有各自的优势。滚动你自己的可能要困难得多。我不知道你怎么会期望客户端不关心你已经删除了数据库。我想可能会在转储的头部附加一个“锁定”命令,在尾部附加一个“解锁”命令。但我只是猜测。你不能锁定不存在的数据库。这是一个好主意,是的,我在数据库中只有普通的旧表,所以我想解析原始转储文件应该很简单。这是一种很好的技术!