1 概述
skeema是mysql上的schema管理工具。
为什么需要这样的工具:
- 在开发环境下,我们需要记录当前的数据库schema结构,并同步到本地的.sql文件中
- 在生产环境下,我们需要同步本地的.sql文件到生产数据库的schema去
- 对于分库分表的结构,我们需要批量地将这些.sql文件同步到很多个数据库去。
在以前的工具中,我们只能通过手工比较来实现,有了skeema下,这些操作都可以一键式完成了。
2 命令
2.1 init
skeema init -h localhost -uroot -p
将本地localhost的整个数据库schema都dump到本地
skeema init -h localhost -uroot -p -d mm
将本地localhost的整个数据库schema都dump到本地,并放入到mm文件中
skeema init -h localhost -uroot -p --schema ryo
将本地localhost的数据库中的ryo的schema放到本地
一旦操作完成后,目录中会出现.skeema文件夹,其会显示当前的schema名字,以及production环境下连接配置。另外,每个sql文件代表一个表的结构。
2.2 diff
skeema diff
一开始时输入diff就会将本地的sql文件和数据库作对比,并显示没有变化。
当你更改本地的.sql文件,增加了一列时,它就会显示需要往当前的数据库新增一列。
但是,当你删除了本地.sql文件的一列时,它就显示目前这个操作是unsafe的,不推荐使用。
skeema认为以下操作为危险操作:
- 删除表格
- 删除列
- 任何可能导致数据丢失的修改列操作,例如,缩短字符串长度,减少数字精度等等
- 修改列的字符集
- 修改表格的engine
skeema diff --allow-unsafe
危险操作,skeema默认是提示失败的,如要强制执行,需要加上–allow-unsafe操作
2.3 push
skeema push
push命令就是将diff的变化推送到数据库去,再次diff以后你发现已经没有变化了
skeema push --allow-unsafe
push命令遇到危险操作时,需要和diff一样加上–allow-unsafe强制执行
2.4 pull
skeema pull
就是push的反向操作了,相当简单,强制性地将数据库的schema结构同步到本地的.sql文件
3 配置
alter-wrapper="/usr/local/bin/pt-online-schema-change --execute --alter {CLAUSES} D={SCHEMA},t={TABLE},h={HOST},P={PORT},u={USER},p={PASSWORDX}"
alter-wrapper-min-size=1g
alter-algorithm=inplace
alter-lock=none
safe-below-size=1
[development]
host=localhost
socket=/var/lib/mysql/mysql.sock
allow-unsafe
skip-alter-wrapper
skip-alter-algorithm
skip-alter-lock
[staging]
host=staging-db.mycompany.com
port=3333
[production]
host=prod-db.mycompany.com
这是一个常见的skeema配置,development环境下默认允许allow-unsafe操作。另外,在skeema push更新数据库时默认使用mysql的online DDL操作,所以指定了alter-algorithm和alter-lock,也可以使用第三方的online DDL操作,所以指定了alter-wrapper为pt-online-schema-change。
4 最佳实践
4.1 开发环境
开发环境下,首先使用skeema init
来初始化schema。后续修改数据库结构时,可以用两种办法:
- 直接修改数据库,然后用
skeema pull development
同步数据库到本地的.sql文件 - 修改本地的.sql文件,然后用
skeema push development
来推送更新到数据库
换句话说,开发时务必让数据库结构与本地的.sql文件是同步的。
4.2 正式环境
正式发布时,使用skeema diff
查看更新的DDL操作有没有问题,没有问题后就使用skeema push
来正式更新数据库。
5 总结
这是一个相当简单和方便的工具了,比schema version的方法要好得多,至少它是无状态的。
参考资料
- 本文作者: fishedee
- 版权声明: 本博客所有文章均采用 CC BY-NC-SA 3.0 CN 许可协议,转载必须注明出处!