schema数据库管理工具

2018-06-04 fishedee 后端

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放到本地

Screen Shot 2018-06-04 at 7.59.23 A

一旦操作完成后,目录中会出现.skeema文件夹,其会显示当前的schema名字,以及production环境下连接配置。另外,每个sql文件代表一个表的结构。

2.2 diff

Screen Shot 2018-06-04 at 8.02.09 A
skeema diff

一开始时输入diff就会将本地的sql文件和数据库作对比,并显示没有变化。

Screen Shot 2018-06-04 at 8.03.36 A

当你更改本地的.sql文件,增加了一列时,它就会显示需要往当前的数据库新增一列。

Screen Shot 2018-06-04 at 8.04.35 A

但是,当你删除了本地.sql文件的一列时,它就显示目前这个操作是unsafe的,不推荐使用。

skeema认为以下操作为危险操作:

  • 删除表格
  • 删除列
  • 任何可能导致数据丢失的修改列操作,例如,缩短字符串长度,减少数字精度等等
  • 修改列的字符集
  • 修改表格的engine
skeema diff --allow-unsafe

危险操作,skeema默认是提示失败的,如要强制执行,需要加上–allow-unsafe操作

2.3 push

Screen Shot 2018-06-04 at 8.11.19 A
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的方法要好得多,至少它是无状态的。

参考资料

相关文章