mysql同步表结构_MySQL表结构同步
现在全⾝⼼投⼊到MySQL中。
项⽬要求:将开发环境中的数据库的修改同步⾄线上环境。
开发者给出的解决办法是:利⽤像Python 中的South框架,⾃动将开发环境的变更同步⾄⽣产环境。这个对于DBA来说是⽆法承受的(除⾮是创建数据库结果类似的语句)。数据库变更在⽣产环境执⾏,必须事先经过评估。对业务的影响降到最低,这个就设计到了重新设计索引,或者采⽤在线修改⼯具之类的。本⽂暂时先不讨论,下⾯给出表同步的解决办法。
以前的做法是通过navicate的⼯具将⼀个⼀个的数据库进⾏对⽐或者⾃⼰写脚本Mysqldump 只dump 表结构,利⽤diff 挨个对⽐,在数据库实例量少的情况下,可以接受。总之个⼈认为 不符合运维⾃动化的理念。
最近尝试了⼀种新的⼯具-Schema Sync,这个是基于Python语⾔,遵守. 开源协议。
描述信息:
1、该⼯具不会修改数据库,⾄会搜集在不同数据库之间的差异并⽣成SQL脚本。
2、⽣成的SQL语句,会⾃动添加after,first 等关键字
3、对于重命名的表或者字段,该⼯具⽣成先删除在重建的SQL语句
4、对于MySQL的分区功能暂不⽀持。
下载并安装:
安装条件:
1、2.4, 2.5, or 2.6
2、, version 5.0 or higher
3、, version 1.2.1p2 or higher
安装:
tar xvzf SchemaSync-0.9.
cd SchemaSync-0.9.2
sudo python setup.py install
基本语法:
schemasync [options]
source或者target的格式是:
mysql://user:password@host:port/database
最终⽣成⽂件的格式是:[_].YYYYMMDD.(patch|revert)[_].sql,有⼀个⽇志⽂件
⼀个patch⽂件(应⽤到⽬标主机),⼀个revert⽂件(可以做回滚,这个做法是很棒的,个⼈很赞同,但作为DBA,最好在操作前对线上的数据库做好备份)
具体选项,可以通过  schemasync  --help 查看
之前下过mysql现在重新下载mysql常⽤选项:
-output-directory=OUTPUT_DIRECTORY ⽇志⽂件和⽣成的SQL⽂件存放的⽬录
--tag=TAG 为⾃⼰的⽂件打上容易辨认的便签
-r, --revision 如果⽣成的结果⽂件中存在相同的名字,则会另加标⽰。
-a, --sync-auto-inc 这个选项要注意,他会同步⾃增长的值
-c --sync-comments 同步新添加字段的内容 描述(经测试该选项⽆效)
测试:
在192.168.1.172上有⼀数据库sync 库内的表:t1(id int null)
在192.168.1.175上有⼀数据库sync 库内的表:t1(id int not null)
现在将172中的sync库同步⾄175上:
schemasync  -r --output-dir="/root/sync/"  mysql://root:XXXX@localhost:3306/sync
mysql://root:XXXXX@192.168.1.175:3307/sync
打印出的消息:
[INFO 2012-07-13 18:21:49,784] Migration scripts created for mysql://192.168.1.175/sync
Patch Script: /root/sync/sync.20120713.patch.sql
Revert Script: /root/sync/vert.sql
我们可以打开⽂件查看下:
USE `sync`;
ALTER TABLE `t1` MODIFY COLUMN `id` int(11)NULLFIRST, ENGINE=InnoDB ROW_FORMAT=Compact;
这个⽂件已经将id列 的⾮空属性设置为空。将这个⽂件应⽤到175上即可。!
(PS:此为简单测试。在⽣成环境下,可以⽤shell循环同时同步多个库,对于DBA来说,最好在应⽤更改之前,必须审核⼀下该SQL,评估下对线上的影响,考虑在线DDL等⼯具)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。