现在的位置: 首页 > IT运维 > 正文

MySQL数据库的无缝迁移

2011年05月13日 IT运维 ⁄ 共 1073字 暂无评论 ⁄ 被围观 5+

MySQL数据库的无缝迁移问题?

问:在平时的开始过程中,由于经常“需求理解,架构设计,需求变更”等多种原因,导致系统运行一段时间后,数据库的表结构需要变更,如何实现尽量短的停机,实现无缝的迁移?

我开玩笑说,最好的解决办法就是不迁移。不迁移肯定最好,这要依赖于非常好的设计,在前期架构设计的时候能够考虑到需求可能的变更,数据库设计也可以根据业务来进行一定程度的抽象。这可能有点太理想,不过迁移数据,始终是个不可避免的问题。下面说下一般的迁移方案。

定点停机迁移

就像那位朋友说的,在一个月黑风高的夜晚,停掉应用,用事先写好的迁移程序,把MySQL 数据库数据迁移到新结构的MySQL数据库中。完成后,切换应用。最大的缺点就是随着数据量的增加停机时间会变得非常长。

MySQL binlog方案

MySQL 的迁移可以考虑MySQL的主从复制replication的特性,解析binlog日志出来,然后根据新的业务特点设计的数据库结构,把数据写入到新的数据库,运行迁移过程不需要停机。在数据迁移基本上完成的时候,停掉前段应用,等待迁移全部完成,切换应用到新库。停机时间非常短,只需要几乎1-2分钟或者更少。

触发器方案

备份老的MySQL数据表结构到新的MySQL数据库,在新库创建新的表结构,更改老的数据库表,创建触发器,让数据写入的时候同时写入到的新的MySQL表。dump老的MySQL的数据,导入到新的MySQL,这是新的MySQL表结构的表应该已经有相应的数据了。然后开启主从复制,让其达到跟主库数据一致。切换应用,迁移到的方案。停机时间非常短,只需要几乎1-2分钟或者更少。

MySQL udf方案

MySQL的udf允许你开发自己的函数集成到MySQL中,这样你可以很方便的在数据写入的时候同时写到的其他地方。缺点是开发成本大,需要对MySQL udf有了解。也可以用现成的memcached_functions_MySQL和lib_MySQLudf_json来实现,你就不需要编写udf函数了,只需要实现一个memcached的服务端来接受数据,然后解析json到新的数据库就OK了。memcached协议非常简单,自己实现起来也很容易。这种方案的迁移时间也会非常短。

中间件方案

这种方案必须要你的应用连接数据使用了类似中间层的方案,你只需要在中间层增加同时往新库写数据就OK了。这种方案的依赖比较大,相信小一点的公司可能都没有条件。

总结

要实现无缝迁移,成本和难度肯定会增加,这需要结合你的业务需要来具体实施。迁移方案需要进行充分的测试,以及考虑出错的回滚方案。

给我留言

您必须 [ 登录 ] 才能发表留言!

×
#