更新MySQL数据库

Modified on: Sat, 21 Sep 2019 12:40:02 +0800

我们有一个使用MySQL数据库的在线系统。我们需要将较旧的备份数据库(完整表,而不是转储文件)与当前数据库合并。没有经历任何服务器停机,你会怎么做?请注意,系统全天候在线。有什么问题可能会上升?

谢谢。

作者:,DragonBorn

最佳答案

当搞乱MySQL的文件系统时,你必须停止MySQL服务器。为避免在现场计算机上停机,请使用具有SAME VERSION of MySQL服务器的备份/虚拟机。当BACKUP MySQL服务器停止时,将表(我假设.FRM,.MYI等?)复制到/ var / lib / mysql / BACKUP_DB(BACKUP_DB的相应目录)中的文件系统中。

启动BACKUP MySQL服务器并确保使用脚本或CLI正确加载数据。验证后,mysqldump BACKUP_DB数据库,以便它可以加载到实时服务器:

mysqldump --extended-insert BACKUP_DB > /root/sql/BACKUP_DB.sql

您现在已将原始备份数据转换为SQL语句,可以在不停机的情况下加载到MySQL中(与原始数据不同)。将BACKUP_DB.sql移动到实时计算机。

BACKUP_DB.sql作为不同的数据库导入LIVE MySQL实例:

mysql BACKUP_DB < /root/sql/BACKUP_DB.sql

您现在应该将备份数据库作为BACKUP_DB加载到MySQL中。

现在,依赖于INSERT IGNORE或REPLACE INTO语句(你在索引中覆盖旧数据或“填充空白”吗?):

mysqldump --no-create-db
--no-create-info --extended-insert --insert-ignore MERGE_SOURCE | mysql BACKUP_DB

或者,对于REPLACE INTO行动:

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;

将FLUSH命令添加到转储.sql文件的开头,并将UNLOCK添加到最后。

在这种情况下,请务必检查数据库名称的四倍!询问您不确定的任何后续问题,因为这是高风险数据混合的东西。如果可能,执行(并详细说明)开发服务器上所需的确切步骤,或虚拟化测试或创建小规模测试。试试吧。当然,请采取足够的备份来弥补每个数据丢失的可能性。

作者:,Andy

相关问答

添加新评论