mysql表结构自动同步工具
用于将 线上
数据库结构变化同步到 本地环境
!
支持功能:
- 同步新表
- 同步字段 变动:新增、修改
- 同步索引 变动:新增、修改
- 支持预览(只对比不同步变动)
- 邮件通知变动结果
- 支持屏蔽更新表、字段、索引、外键
- 支持本地比线上额外多一些表、字段、索引、外键
首先安装go 和 git环境
安装go语言环境
下载安装包
wget -c https://studygolang.com/dl/golang/go1.10.3.linux-amd64.tar.gz
解压到/usr/local
tar -C /usr/local -xzf go1.10.3.linux-amd64.tar.gz
配置环境变量
vi /etc/profile
在文件末尾添加
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
生效环境变量
source /etc/profile
验证
go version
go version go1.10.3 linux/amd64
安装成功
安装git
yum -y install git
安装mysql-schema-sync
go get -u github.com/hidu/mysql-schema-sync
执行命令会在当前目录生成一个go/文件夹
以我的安装目录为例 我下载在了/root 目录下 ,
mysql-schema-sync的命令在/root/go/bin/下
配置文件config.json 和 自动运行脚本check.sh 在目录/root/go/src/github.com/hidu/mysql-schema-sync下
配置文件
一定要注意新添加的参数 -tables_ignore string 如果默认值的话工具会跳过所有表的检测
解决办法可以写一个没有的表名 例如 -tables_ignore "x"
{
"source":"root:密码@(10.238.160.1:3306)/xiaodai",
"dest":"root:密码@(10.238.160.2:3306)/xiaodai",
"alter_ignore":{
"tb1*":{
"column":["aaa","a*"],
"index":["aa"],
"foreign":[]
}
},
// tables: table to check schema,default is all.eg :["order_*","goods"]
"tables":[],
// tables_ignore: table to ignore check schema,default is Null :["order_*","goods"]
"tables_ignore":["x"],
"email":{
"send_mail":false,
"smtp_host":"smtp.163.com:25",
"from":"xxx@163.com",
"password":"xxx",
"to":"xxx@163.com"
}
}
[root@10-238-160-1 bin]# ./mysql-schema-sync --help
Usage of ./mysql-schema-sync:
-conf string
json config file path (default "./config.json")
-dest string
mysql dsn dest,eg test@(127.0.0.1:3306)/imis
-drop
drop fields,index,foreign key
-mail_to string
overwrite config's email.to
-source string
mysql dsn source,eg: test@(10.10.0.1:3306)/test
when it is not empty ignore [-conf] param
-sync
sync shcema change to dest db
-tables string
table names to check
eg : product_base,order_*
-tables_ignore string
table names to ignore check
eg : product_base,order_*
mysql schema sync tools 0.3
https://github.com/hidu/mysql-schema-sync/
参数解释:
# mysql-schema-sync -help
-conf string
配置文件名称
-dest string
待同步的数据库 eg: test@(10.10.0.1:3306)/test_1
该项不为空时,忽略读入 -conf参数项
-drop
是否对本地多出的字段和索引进行删除 默认否
-source string
mysql 同步源,eg test@(127.0.0.1:3306)/test_0
-sync
是否将修改同步到数据库中去,默认否
-tables string
待检查同步的数据库表,为空则是全部
eg : product_base,order_*
实际使用
比对表结构并生成sql文件,不执行
./mysql-schema-sync -conf config.json > alter.sql
查看alter.sql 生成了一些添加列或者索引的语句,如下
[root@10-238-160-1 mysql-schema-sync]# head -50 alter.sql
-- Table : fund_sign_config
-- Type : alter
-- RealtionTables :
-- SQL :
ALTER TABLE `fund_sign_config`
ADD `UPDATE_TIME` datetime NOT NULL,
ADD `DEL_FLAG` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否删除 0 未删除 1删除',
ADD `ID` bigint(20) NOT NULL AUTO_INCREMENT,
ADD `CHANNEL` varchar(20) DEFAULT NULL COMMENT '签约的通道 比如 BF',
ADD `CREATE_TIME` datetime NOT NULL,
ADD `PRIORITY` int(11) NOT NULL COMMENT '优先级 越大越优先',
ADD `FUND_CODE` varchar(20) NOT NULL COMMENT '资金方编码',
ADD `SIGN_TYPE` tinyint(4) DEFAULT NULL COMMENT '签约类型 1 主订单 2 白条 3 逾期',
ADD `PARTNER_ID` varchar(10) DEFAULT NULL COMMENT '商户号',
DROP PRIMARY KEY,
ADD PRIMARY KEY (`ID`);
从源库应用差异结构到目标库
./mysql-schema-sync -conf config.json -sync
可以利用check.sh 配置定时任务,因为我的测试环境较多 有32套 我自己改写了脚本如下
配置定时任务,每周从线上往测试同步一次
#定时从线上同步表结构到测试环境 mysql-schema-sync
00 01 * * 7 cd /root/go/src/github.com/hidu/mysql-schema-sync && bash check.sh >/dev/null 2>&1