嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

周梦康 发表于 2015-10-14 12080 次浏览 标签 : Mysqldba

免费领取阿里云优惠券 我的直播 - 《PHP 进阶之路》

该问题讨论由优才全栈工程师讨论群发起,个人二次整理消化。

如果这是一道面试题,我恐怕一时间还是很难有条理的回答出来。下面是老师的解答:

数据库迁移,分成多种:

第一种是切换类型,比如从Oracle迁移成MySQL。

第二种是转移机房,从如从甲机房到乙机房,或者是数据从一个机架到另外一机架。

第三可能是扩容相关的迁移。

第一种,需要对源数据库停止服务,其实就是导出源数据库,转换脚本(如果数据量小又是单机的话,phpmyadmin本身支持导入,不需要转换)。在新的地方导入即可。这种情况不需要监控太多,主要是要确保写入停止。同时在导入完成之后,校验一下每个表的最后一条记录,确保数据完整就OK。

第二、三种,如果可以停服,跟上面一种类似。

第二、三种,如果不停服,需要做的事情就复杂,首先在某一时间,假定原始主库代码为A,选择一个从库,假定该从库代号为B,确保该从库配置文件中的log_save_updatebin_log都属于开启状态。

1. 先断开BA的同步操作,把当前时间结点的数据导出。

2. 然后在目标服务器上把数据导入,该数据库为目标主库命名为C,确保其log_save_updatebin_log都属于开启状态,同时建立从目标主库到源从库的主从关系(即将C设置为B的从库)。这个时候同步跟上是后续操作的基础。

在第二三种情况下,一般需要监控主从是否成功,数据是否一致,主从是否跟上,在停止之后,源数据库是否停止,是否存在数据丢失等。当然,如果是多组同时迁移,在切服务时,要监控多组都跟上。

我还有一个疑问,最后在将C切换为正式的主库的时候需要注意什么呢?因为 A库直接废弃,则直接把原来对A的写操作全都切到C上,然后断开CB的主从关系。问题来了,这个时候,难道整个系统就一个主库?肯定不能支撑原有的业务,这个时候的从库呢?B此刻不可能立即切换为C的从库吧。

老师给我解答是,在迁移的时候如果A原本有4个从库,那么在最初C就默认也挂了4个从库。在切换过去之后A主多从那套东西就都歇菜了;如果扩容,就是短暂停服,断开BC的主从关系,再切部分流量到C,从A一主变成AC双主。


为什么要确保B数据库的log_slave_updates是开启状态呢?

官方的解释是这样的

Normally, a slave does not write to its own binary log any updates that are received from a master server. This option causes the slave to write the updates performed by its SQL thread to its own binary log. For this option to have any effect, the slave must also be started with the --log-bin option to enable binary logging. Prior to MySQL 5.5, the server would not start when using the --log-slave-updates option without also starting the server with the --log-bin option, and would fail with an error; in MySQL 5.6, only a warning is generated. (Bug #44663) --log-slave-updates is used when you want to chain replication servers. For example, you might want to set up replication servers using this arrangement:A -> B -> C.

Here, A serves as the master for the slave B, and B serves as the master for the slave C. For this to work, B must be both a master and a slave. You must start both A and B with --log-bin to enable binary logging, and B with the --log-slave-updates option so that updates received from A are logged by B to its binary log.

一般情况下,一个从库是不是记录自己的binary log,因为它的二进制日志都是来源于其主库,这个选项(log_slave_updates)可以使得从库也把自身的更新操作都写入其自己的binary log,为了使得能够记录binary log,从库在启动的时候也必须开启log-bin的配置。在Mysql 5.5之前,如果使用了--log-slave-updates而没有使用--log-bin,则无法启动,并且没有报错信息;在 Mysql 5.6 的时候,会有一个警告信息。当你把多个数据库实例以链式从库依赖的时候,--log-slave-updates就派上用场了,例如,你也许需要这样配置从库A -> B -> C.

现在,A就是B主库,BA的从库,并且BC的主库,你必须启动AB的时候都带上--log-bin,以确保其都能记录binary log,并且B还要带上--log-slave-updates,只有这样,才能保证B接受到A的更新日志能够记录到自己的binary log里。

在双主复制的时候也需要在给各个主库开启log_slave_updateshttp://www.linuxidc.com/Linux/2014-11/109029.htm

附带自己之前做的两个笔记:

记一次数据库的迁移工作

填上面那次数据库迁移工作中埋的坑

参考资料

http://dev.mysql.com/doc/refman/5.6/en/replication-options-slave.html

嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表

回复 etgre 2015-12-20 21:28:16
fgfdgdfg