Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 导入转储文件时不可能出现服务中断_Mysql_Mysqldump_Database Backups - Fatal编程技术网

Mysql 导入转储文件时不可能出现服务中断

Mysql 导入转储文件时不可能出现服务中断,mysql,mysqldump,database-backups,Mysql,Mysqldump,Database Backups,我开发了一种用于实时mySQL数据库同步的自定义机制,与内置mySQL主/从复制相比,该机制随时间提供了更高的可靠性(数据完整性) 同步机构以定期循环运行,每5秒定期触发一次,由以下阶段组成: 主数据库被命令通过mysqldump 转储文件被传输到拥有从数据库的远程服务器。这种传输利用了rsync的delta算法和数据压缩 远程服务器等待接收确认以继续 远程服务器将接收到的转储文件导入从属mySQL数据库 远程服务器向本地服务器确认同步周期已完成 为了防止主数据库和从数据库之间出现任何不一致,转

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

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

  • 主数据库被命令通过
    mysqldump
  • 转储文件被传输到拥有从数据库的远程服务器。这种传输利用了rsync的delta算法和数据压缩
  • 远程服务器等待接收确认以继续
  • 远程服务器将接收到的转储文件导入从属mySQL数据库
  • 远程服务器向本地服务器确认同步周期已完成
  • 为了防止主数据库和从数据库之间出现任何不一致,转储文件将调用
    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。。。输出文件
    ,然后使用加载数据填充进行恢复


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

    有两种复制模式,语句和二进制。两者都有各自的优势。滚动你自己的可能要困难得多。我不知道你怎么会期望客户端不关心你已经删除了数据库。我想可能会在转储的头部附加一个“锁定”命令,在尾部附加一个“解锁”命令。但我只是猜测。你不能锁定不存在的数据库。这是一个好主意,是的,我在数据库中只有普通的旧表,所以我想解析原始转储文件应该很简单。这是一种很好的技术!