首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新MySQL数据库

问更新MySQL数据库
EN

Server Fault用户
提问于 2009-06-01 13:59:08
回答 4查看 2.7K关注 0票数 6

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

谢谢。

EN

回答 4

Server Fault用户

回答已采纳

发布于 2009-06-01 15:04:11

在处理MySQL的文件系统时,必须停止MySQL服务器。为了避免您的活动机器上的停机时间,请使用具有相同版本的MySQL服务器的备份/虚拟化机器。当备份MySQL服务器停止时,复制表(我假设.FRM、.MYI等?)进入/var/lib/mysql/BACKUP_DB (BACKUP_DB的相应目录)的文件系统中。

启动备份MySQL服务器,并确保数据已使用脚本或CLI正确加载。验证后,mysqldump将BACKUP_DB数据库加载到活动服务器中:

代码语言:javascript
复制
mysqldump --extended-insert BACKUP_DB > /root/sql/BACKUP_DB.sql

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

将BACKUP_DB.sql作为不同的数据库导入到活动MySQL实例中:

代码语言:javascript
复制
mysql BACKUP_DB < /root/sql/BACKUP_DB.sql

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

现在,依赖于INSERT Now,或替换为语句(您是覆盖旧数据还是在索引中“填充空白”?):

代码语言:javascript
复制
mysqldump --no-create-db
--no-create-info --extended-insert --insert-ignore MERGE_SOURCE | mysql BACKUP_DB

或者,为了使之变为行动:

代码语言:javascript
复制
mysqldump --no-create-db --no-create-info --extended-insert MERGE_SOURCE | sed 's/INSERT INTO/REPLACE INTO/g' | mysql BACKUP_DB

或者,不要将输出回MySQL,而是发送到一个文件并检查SQL语句。

代码语言:javascript
复制
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

最后,为了避免停机,将第一个数据库转储到第二个数据库:

代码语言:javascript
复制
mysqldump BACKUP_DB | mysql CURRENT_DB

您可以始终先锁定数据库,以防止数据被写入(例如)表中带有外键的z表(该表已经写入):

代码语言:javascript
复制
FLUSH TABLES WITH READ LOCK;

(上一步执行转储)

代码语言:javascript
复制
UNLOCK TABLES;

将刷新命令添加到转储.sql文件的开始,并解锁到末尾。

在这个场景中,一定要四倍检查您的DB名称!问任何你不确定的后续问题,因为这是高风险的数据混合的东西。如果可能的话,在dev服务器上执行(并详细记录)所需的确切步骤,或者虚拟化您的测试,或者创建一个小规模的测试。只是测试一下。当然,还需要进行足够的备份,以应对每一次数据丢失的可能性。

票数 7
EN

Server Fault用户

发布于 2009-06-06 07:38:43

设置复制并将DB-服务器切换为从服务器,并且经过了良好的测试(!)

除非您有一些技术限制来执行该操作,否则这只是有效的变体(我的意思是您应该能够在将更改放到24/7环境之前测试它们)。

票数 3
EN

Server Fault用户

发布于 2009-06-01 14:13:17

假设您有磁盘空间,我将设置一个迁移数据库,并将数据复制/合并到其中。设置web环境的副本,以连接到迁移数据库并对其进行彻底测试。然后,一旦您感到高兴,就更改生产环境上的连接字符串,以查看新的迁移DB。

票数 2
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/16819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档