我们有一个使用MySQL数据库的在线系统。我们需要将一个较旧的备份数据库(完整的表,而不是转储文件)与当前的数据库合并。在没有任何服务器停机的情况下,您会怎样做呢?请注意,该系统是在线的24/7。有什么问题可能上升?
谢谢。
发布于 2009-06-01 15:04:11
在处理MySQL的文件系统时,必须停止MySQL服务器。为了避免您的活动机器上的停机时间,请使用具有相同版本的MySQL服务器的备份/虚拟化机器。当备份MySQL服务器停止时,复制表(我假设.FRM、.MYI等?)进入/var/lib/mysql/BACKUP_DB (BACKUP_DB的相应目录)的文件系统中。
启动备份MySQL服务器,并确保数据已使用脚本或CLI正确加载。验证后,mysqldump将BACKUP_DB数据库加载到活动服务器中:
mysqldump --extended-insert BACKUP_DB > /root/sql/BACKUP_DB.sql现在,您已经将原始备份数据转换为SQL语句,这些语句可以在不停机的情况下加载到MySQL中(与原始数据不同)。将BACKUP_DB.sql移到活动机器上。
将BACKUP_DB.sql作为不同的数据库导入到活动MySQL实例中:
mysql BACKUP_DB < /root/sql/BACKUP_DB.sql现在应该将备份数据库作为BACKUP_DB加载到BACKUP_DB中。
现在,依赖于INSERT Now,或替换为语句(您是覆盖旧数据还是在索引中“填充空白”?):
mysqldump --no-create-db
--no-create-info --extended-insert --insert-ignore MERGE_SOURCE | mysql BACKUP_DB或者,为了使之变为行动:
mysqldump --no-create-db --no-create-info --extended-insert MERGE_SOURCE | sed 's/INSERT INTO/REPLACE INTO/g' | mysql BACKUP_DB或者,不要将输出回MySQL,而是发送到一个文件并检查SQL语句。
mysqldump --no-create-db --no-create-info --extended-insert --insert-ignore MERGE_SOURCE > /root/sql/merge.sql
mysqldump --no-create-db --no-create-info --extended-insert MERGE_SOURCE | sed 's/INSERT INTO/REPLACE INTO/g' > /root/sql/merge.sql最后,为了避免停机,将第一个数据库转储到第二个数据库:
mysqldump BACKUP_DB | mysql CURRENT_DB您可以始终先锁定数据库,以防止数据被写入(例如)表中带有外键的z表(该表已经写入):
FLUSH TABLES WITH READ LOCK;(上一步执行转储)
UNLOCK TABLES;将刷新命令添加到转储.sql文件的开始,并解锁到末尾。
在这个场景中,一定要四倍检查您的DB名称!问任何你不确定的后续问题,因为这是高风险的数据混合的东西。如果可能的话,在dev服务器上执行(并详细记录)所需的确切步骤,或者虚拟化您的测试,或者创建一个小规模的测试。只是测试一下。当然,还需要进行足够的备份,以应对每一次数据丢失的可能性。
发布于 2009-06-06 07:38:43
设置复制并将DB-服务器切换为从服务器,并且经过了良好的测试(!)
除非您有一些技术限制来执行该操作,否则这只是有效的变体(我的意思是您应该能够在将更改放到24/7环境之前测试它们)。
发布于 2009-06-01 14:13:17
假设您有磁盘空间,我将设置一个迁移数据库,并将数据复制/合并到其中。设置web环境的副本,以连接到迁移数据库并对其进行彻底测试。然后,一旦您感到高兴,就更改生产环境上的连接字符串,以查看新的迁移DB。
https://serverfault.com/questions/16819
复制相似问题