介绍

从系统管理员或 DBA 的角度来说,
总希望将线上的各类变动限制在三个可控的范围内, 收缩部分不鲜明的因素.
那样做有几点好处:

1. 记录线上的库表变更;
2. 对线上的库表变更有全局的了解;
3. 如果有问题, 方便回滚操作;

从那三点来看, 有很各个主意能够兑现,
比如通过 migrate 等工具强制全部的操作都以统一的章程实施,
那亟需开辟职员做越来越多的相称, 所以那类工具在非规模话的事体场景中较难达成;
其余管理员或 DBA
也足以经过知识库举个例子 redmine 等类似的主意记录改换,
但是不可控因素居多, 特别正视上线的流水生产线, 也易于出现纰漏.
这就引申出本文要介绍的如何追踪线上库表的改观, 下文以 MySQL
数据库介绍表明.

盯住的情势

凯旋门074网址,在 Postgresql 中, 由于触发器对各类操作都有很好的支撑,
大家一同能够通过触发器的花样来记录全部 DDL 语句的更换. 与此对比, MySQL
则显得较为弱小, 我们不得不以其它方式完毕类似的指标. 上边以中间件, log,
binlog, 注册 slave, mysqldiff 八种方法开始展览介绍.

澳门凯旋门注册网址,1. 中间件

幸存的中档件 atlas, kingshard, mycat 等,
都是 proxy 的角色铺排于程序和 MySQL 之间, 全数发往 MySQL 的 sql 都经过
proxy 举行转载. 如下图所示, 大家得以在 proxy 层面增加部分 DDL, DML
相关语句的笔录, 达到追踪改换的目标.

    +------+        +-------+        +-------+
    | app  |  --->  | proxy |  --->  | MySQL |
    +------+        +-------+        +-------+

这种办法自由度较高, 我们都足以Infiniti制订制. 但是需求有个别开辟力量, 别的 sql
的过滤也会影响到查询的品质,
通过中间件来平素修改表结构等操作也可能有风险不小的格局.

2. log

这种方法非常粗大略, 张开 MySQL 的 general log 或 audit log 就可以记录所有的
sql 语句. 这种措施比较适合开辟条件, 线上情状一旦翻开会时有发生相当多日志,
弊远远超过利, 也不平价维护;

3. binlog

管理员或 DBA 一样能够剖析 MySQL 的 binlog 来过滤表或权限的改变.
这种办法本质上等同第三种方法, 线上数据库供给敞开 binlog 选项, 剖判binlog 也是很耗财富的操作. 线上一经实例比较多, 这种格局非常不得取.

4. 注册 slave

这需要开发人员做更多的配合澳门凯旋门注册网址。登记 slave 的情致即经过 MySQL 的主导协议伪造二个假的 slave, 那样 master
会把持有的创新都发送过来, 再拓展部分过滤的操作.
这种艺术在一同数据或增量消费的情景极度符合,
这里只用于记录表或权限的转移确实是黄钟毁弃, 线上实例比较多的话也不行取.
规范的工具备 myreplication, tungsten-replicator 以及Ali的 canal 等.

5. mysqldiff

这需要开发人员做更多的配合澳门凯旋门注册网址。骨子里权限和表改动自个儿是低频率的操作事件,
上述的三种方式就算都得以达到指标, 但本质上都是很开支能源的操作.
思考到那一点, 我们得以经过对照的章程来落到实处权力及表结构改造的追踪,
详见 这需要开发人员做更多的配合澳门凯旋门注册网址。这需要开发人员做更多的配合澳门凯旋门注册网址。sys-mysql-diff 工具.
思量到通用性, sys-mysql-diff 工具每一趟都亟待获得钦点库的全数表的概念语句,
通过相比来变化对应的 DDL
语句. mysqldiff 则是对
sys-mysql-diff 工具的包裹, 能够批量追踪多少个实例.

这需要开发人员做更多的配合澳门凯旋门注册网址。哪些使用 mysqldiff

mysqldiff 工具是在
sys-mysql-diff 工具的根基上拓展了一层封装, 所以本质上是透过
sys-mysql-diff 工具追踪线上库的变化. 在事实上的选取中, 供给注意以下几点:

1. 计划文件

mysqldiff 所要求的配备参谋以下:

[backend]
dsn = user_mysqlmon:xxxxxxxx@tcp(10.0.21.17:3306)/mysqldiff?charset=utf8

[test3301]
host = 10.0.21.5
port = 3301
db   = test
user = user_mysqldiff
pass = xxxxxxxx
tag  = host_location

[test3306]
host = 10.0.21.7
port = 3306
db   = percona
user = user_mysqldiff
pass = xxxxxxxx
tag  = host_location

2. 权限

全数的变动结果都会保留到钦命的 MySQL
库中的 mysql_diff 表,
即上述的 [backend] 部分,
对于该表要求 select, insert, update 相关的权限.
被追踪的实例则是 [testXXXX] 部分, 由于须求查看表结交涉用户权限所以须求select 和 grant option 权限. 大家以 user_mysqlmon
用户为 [backend] 的用户, 以 user_mysqldiff
为 [testXXXX] 部分的用户为例, 须求予以他们以下放权力限:

grant select,insert,update on mysqldiff.* to user_mysqlmon@`10.0.21.%`;
grant select on *.* to user_mysqldiff@`10.0.21.%` with grant option;

布置中的 db = information_schema 则象征追踪全数的数据库;

3. 运行

运营 mysqldiff 命令进行追踪:

# ./mysqldiff -conf conf.cnf -verbose
2017/03/20 16:31:27 ---------------------------
changes from 10.0.21.5:3301 
changes from 10.0.21.7:3306 
DROP TABLE `emp`;
SET GLOBAL wait_timeout = 1000;
2017/03/20 16:31:27 insert 10.0.21.17:3306/percona ok
2017/03/20 16:31:27 ---------------------------

insert ... ok 一行表示将结果插入到了 [backend] 中.

总结

以 mysqldiff 格局追踪库表及权限的变通相对简单方便,
比起其它方法算得上轻易. 其它也不受业务场景和领队习于旧贯的牵制,
绝对很通用. 可是其也会有小编的弱项, 在短期内一时转移的表则很难跟踪,
mysqldiff 仅能记录最后一遍的退换. 其余管理员供给从严限定配置文件的权能,
最佳给予 0600 的权能只限当前用户查看. 不过全体来说,
要追踪线上库表权限的更换, mysqldiff 是二个相比适宜且通用的工具.

相关文章