MySQL结构自动同步工具-schemasync

MySQL结构自动同步工具-schemasync

背景: 工具schemasync,可以对比开发库与测试库的差别生成patch和revert两个sql文件,其中path是正向更改,revert是更改后的回滚脚本,自此同步数据库结构只需要潇洒的敲一个命令执行一个脚本。

安装要求: Python 2.4,2.5,2.6其他版本没试过,我用的是2.6 MySQL要求是5.0以上,我使用的是Percona5.6 MySQLdb,1.2.1p2以上 SchemaObject 0.5.3以上,安装时会自动安装,为解决中文乱码问题,需要安装前,下源码更改源码手动安装,下面会讲到怎么更改 安装依赖包: yum install -y MySQL-python python 安装: 下载wget http://www.schemasync.org/downloads/SchemaSync-0.9.2.tar.gz tar -zxvf tar -zxvf SchemaSync-0.9.2.tar.gz cd SchemaSync-0.9.2 sudo python setup.py install 使用方法:

Usage: schemasync [options] <source> <target> source/target format: mysql://user:pass@host:port/database

                    A MySQL Schema Synchronization Utility

Options: -h, --help show this help message and exit -V, --version show version and exit. -r, --revision 如果要生成的文件名称已经存在了,启用这个参数会给新文件加个序列号 -a, --sync-auto-inc 同步自增长值,一般都不需要 -c, --sync-comments 同步备注,备注对于后期数据库维护比较重要,建议启用 --tag=TAG 为生成的文件打tag,会在文件名中体现 --output-directory=OUTPUT_DIRECTORY 生成patch和revert文件的路径,必须是绝对路径,默认为当前 工作路径 --log-directory=LOG_DIRECTORY 设置日志文件的路径,必须是绝对路径,默认是output- directory,文件名为schemasync.log

选项都很简单,没什么值得需要强调的。 为了后期维护方便,我们要求每个字段都有注释,但是用英文注释建表的人痛苦,看的人也不舒服,注释还是中文大家使用起来更好一些。那么问题就来了,使用--sync-comments参数中文会乱码,导致字段备注不可用了。在之前公司也也遇到过此类问题,表的注释使用中文会导致一些工具操作后变成乱码,大家也没在技术上去解决乱码问题,而是强制要求开发注释使用英文,但是执行效果并不好,最后导致很多表注释就变成个一堆乱码。究其根源是程序作者根本就没考虑中文等字符集的事,python脚本里根本就没指定字符集,链接数据库默认使用了latin1字符集,导致最后生成的两个文件是ansi编码的。解决中文乱码就需要指定链接数据库字符集并且指定程序使用utf8编码。

避免中文乱码的安装及更改源代码过程如下: 安装SchemaObject wget https://github.com/mmatuson/SchemaObject/archive/master.zip unzip master.zip cd SchemaObject-master/ 将此目录及子目录下的py文件全部添加#--coding:utf8--!--指定utf8编码 schemaobject/connection.py添加红色代码,指定链接数据库时字符集

def connect(self, connection_url):
    """Connect to the database"""

    kwargs = parse_database_url(connection_url)
    if not (kwargs and kwargs['protocol'] == 'mysql'):
        raise TypeError("Connection protocol must be MySQL!")

    kwargs['charset']='utf8'
    self.db = kwargs.get('db', None)
    self.host = kwargs.get('host', 'localhost')
    self.port = kwargs.get('port', 3306)
    self.user = kwargs.get('user', None)
   

    # can't pass protocol to MySQLdb
    del kwargs['protocol']
    self._db = MySQLdb.connect(**kwargs)

schemasync/utils.py文件头部添加
#--!--coding:utf8--!--
import sys
if sys.getdefaultencoding() != 'utf8':
    reload(sys)
    sys.setdefaultencoding('utf8')
修改完成成执行如下命令安装软件
python setup.py install

安装SchemaSync: 下载wget http://www.schemasync.org/downloads/SchemaSync-0.9.2.tar.gz tar -zxvf tar -zxvf SchemaSync-0.9.2.tar.gz cd SchemaSync-0.9.2 把下载下来的源码包中的py文件全部指定utf8字符集,即如下文件 [root@vm-template-centos10022 SchemaSync-0.9.2]# find ./ -name '.py' ./ez_setup.py ./setup.py ./schemasync/schemasync.py ./schemasync/syncdb.py ./schemasync/utils.py ./schemasync/init.py 均添加#-- coding:utf-8 -*- 修改完成后执行如下命令安装软件: python setup.py install 安装完成后验证中文乱码问题已解决 wKioL1WWVbjRYsNCAALpHchAnrQ881.jpg

每次都指定密码也比较麻烦,自己写了一个shell脚本,每次只需要指定源ip,目标ip,端口号,库名就可以 mysqlha_sync2test.sh #!/bin/bash s_host=$1 d_host=$2 port=$3 db=$4 mysql_path="/usr/local/mysql-5.6.24" sync_time=date +"%H%M%S" sync_date=date +"%Y%m%d" s_user='db_read_user' s_pwd='123456' d_user='root' d_pwd='123456'

schemasync --tag="${sync_time}" --output-dir="/data/mysql_schemasync" --sync-comments mysql://${s_user}:${s_pwd}@${s_host}:${port}/${db} mysql://${d_user}:${d_pwd}@${d_host}:${port}/${db} patch_file="/data/mysql_schemasync/${db}_${sync_time}.${sync_date}.patch.sql" if [ -f $patch_file ] then cd ${mysql_path}&&./bin/mysql -h${d_host} -P${port} -u${d_user} -p${d_pwd} $db < "${patch_file}" else echo "结构一致,不需要Migration操作" fi

转载于:https://my.oschina.net/7795442/blog/825299

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值