数据库管理工具

Liquibase是一个用于跟踪、管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化(包括结构和数据)都保存在XML文件中,便于版本控制。

Liquibase具备如下特性:

     * 不依赖于特定的数据库,目前支持包括Oracle/Sql Server/DB2/MySql/Sybase/PostgreSQL/Caché等12种数据库,这样在数据库的部署和升级环节可帮助应用系统支持多数据库。
     * 提供数据库比较功能,比较结果保存在XML中,基于该XML你可用Liquibase轻松部署或升级数据库。
     * 以XML存储数据库变化,其中以作者和ID唯一标识一个变化(ChangSet),支持数据库变化的合并,因此支持多开发人员同时工作。
     * 在数据库中保存数据库修改历史(DatabaseChangeHistory),在数据库升级时自动跳过已应用的变化(ChangSet)。
     * 提供变化应用的回滚功能,可按时间、数量或标签(tag)回滚已应用的变化。通过这种方式,开发人员可轻易的还原数据库在任何时间点的状态。
     * 可生成数据库修改文档(HTML格式)
     * 提供数据重构的独立的IDE和Eclipse插件





1.2.1 下载
官网下载地址:http://www.liquibase.org/download/index.html
1.2.2 安装
解压缩下载的liquibase.zip,本文测试选择的是最新版本的,也就是liquibase-3.0.2版本,解压后的javadoc文件目录可以手工删除掉。假设安装目录是F:\liquibase。
配置环境变量,添加LIQUIBASE_HOME,值为F:\liquibase。添加到 Path变量,编辑此变量,在其前面加%LIQUIBASE_HOME%;

2 使用
要开始使用 LiquiBase,需要以下四个步骤:
1)创建一个数据库 变更日志(change log)文件;
2)在变更日志文件内部创建一个 变更集(change set);
3)通过命令行或构建脚本对数据库运行变更集;
3)检验数据库中的变更。
2.1 创建一个变更日志和变更集
要运行 LiquiBase,首先要创建一个数据库变更日志文件,我们采取SQL格式来创建。
官方手册参考:http://www.liquibase.org/documentation/sql_format.html
格式化SQL文件
关于SQL语句的语法依赖于选择的数据库类型,以下语法仅适用于mysql为例。Liquibase是通过SQL注释“--”来标记标签的,每个SQL文件必须开头加入一下声明:
--liquibase formatted sql
Changesets变更集
每个变更集开始处都必须添加一些声明信息:
--changeset author:id attribute1:value1 attribute2:value2 [...]
其中,author:id是必须的,其他的参数可以使用默认值,暂不修改。每个变更集可以带一个或者多个SQL声明,默认使用“;”隔开,每个变更集生成一条对应的记录。
示例一:一个SQL文件一个changeset、一个changeset执行多条SQL语句的情况,以下示例数据库里面只会生成一条记录。
Release0003.sql
01
--liquibase formatted sql
02

03
--changeset gpl:Release0003-1
04
CREATE TABLE table3 (
05
  id int(11) NOT NULL,
06
  name varchar(255) NOT NULL,
07
  PRIMARY KEY (id)
08
) ENGINE=MyISAM;
09
ALTER TABLE  table3 CHANGE  id  id INT( 11 ) AUTO_INCREMENT;
10
ALTER TABLE  table3 CHANGE  name  firstname VARCHAR( 255 );
11
INSERT INTO table3 (id, firstname) VALUES (NULL, 'name1'),(NULL, 'name2'), (NULL, 'name3');
12
--rollback drop table table3;
示例二:一个SQL文件多个changeset、一个changeset执行一条SQL语句的情况。
Release0004.sql
01
--liquibase formatted sql
02
 
03
--changeset gpl:Release0004-1
04
CREATE TABLE table2 (
05
  id int(11) NOT NULL,
06
  name varchar(255) NOT NULL,
07
  PRIMARY KEY (id)
08
) ENGINE=MyISAM;
09
--rollback drop table table2;
10
 
11
--changeset gpl:Release0004-2
12
ALTER TABLE  table2 CHANGE  id  id INT( 11 ) AUTO_INCREMENT;
13
--rollback ALTER TABLE  table2 CHANGE  id  id INT( 11 ) NOT NULL;
14
 
15
--changeset gpl:Release0004-3
16
ALTER TABLE  table2 CHANGE  name  firstname VARCHAR( 255 );
17
--rollback ALTER TABLE  table2 CHANGE  firstname  name VARCHAR( 255 );
18
 
19
--changeset gpl:Release0004-4
20
INSERT INTO table2 (id, firstname) VALUES (NULL, 'name1'),(NULL, 'name2'), (NULL, 'name3');
21
--rollback DELETE FROM table2 WHERE firstname IN('name1','name2','name3');
我们实际使用时候也可以是一个SQL文件多个changeset、一个changeset多个SQL,具体使用根据怎么样写对于回滚更方便,目前我们看到的是一个changeset只能执行一次回滚命令。所以,对于一个changeset多条SQL命令的情况,还不知道怎么写回滚,除非是针对一个表的操作,如上述示例一所示。
2.2 从命令行运行 LiquiBase
定义完变更集后,可以从命令行运行 LiquiBase。
MySQL:
1
liquibase --changeLogFile=F:/liquibase/Release0003.sql --driver=com.mysql.jdbc.Driver --classpath=F:/liquibase/lib/mysql-connector-java-5.1.10-bin.jar --url="jdbc:mysql://localhost/liquibaseuseUnicode=true&characterEncoding=UTF-8" --username=test --password=123456 update
Oracle:
1
liquibase --changeLogFile=F:/liquibase/Release0003.sql --driver=oracle.jdbc.OracleDriver --classpath=F:/liquibase/lib/ojdbc6.jar --url="jdbc:oracle:thin:@localhost:1521:liquibase" --username=test --password=123456 update
在本例中,运行 LiquiBase 传入的内容:
  数据库驱动器
  数据库驱动器 JAR 文件的位置所在的类路径
  所创建的变更日志文件名称为 Release0003.sql
  数据库的 URL
  用户名和密码
关于以上URL的value值,下面简单说一下:
Mysql:jdbc:mysql://localhost/liquibase localhost改成实际的数据库URL,liquibase改成实际数据库的名称。
Oracle:jdbc:oracle:thin:@localhost:1521:liquibase localhost:1521改成实际的数据库URL,1521表示数据库的端口号,liquibase改成实际数据库的SID。
对于以上classpath的路径,官方手册上面说明的是放到lib目录下可以自动加载,但是实际上却未加载,所以暂时只能写完整路径了。涉及到的驱动可以到附件中下载。

最后,清单 2 调用 update命令告诉 LiquiBase 将变更应用到数据库中。
2.3 数据库的回滚操作
在上述的变更日志和变更集中我们注意到每个变更集后面都加了一个--rollback注释,后面的SQL表示当执行回滚命令时,需要执行的SQL语句。对于我们确定以后不会撤销的操作,变更日志文件中的changeset后面页可以不用定义rollback,也就是说我们可以在需要执行rollback的时候再添加相应changeset的rollback,不影响我们部署SQL,只是当我们部署SQL时候要根据rollback的方便性来格式化SQL语句。
假如我们想撤销对于Release0003.sql的操作,我们就可以使用rollback了。
执行命令
1
liquibase --changeLogFile=F:/liquibase/Release0003.sql --driver=com.mysql.jdbc.Driver --classpath=F:/liquibase/lib/mysql-connector-java-5.1.10-bin.jar --url="jdbc:mysql://localhost/liquibase?useUnicode=true&characterEncoding=UTF-8" --username=test --password=123456  rollbackToDate 2013-07-16T16:55:37
执行以上命令的意义:我们可以撤销变更日志文件./Release0003.sql中2013-07-16 16:55:37之后进行的操作。
里面的参数基本和update一致,关于rollback的参数暂时还没有找到一种更方便的方式来针对SQL格式的回滚,针对tag的形式尙需要进一步探究。

猜你喜欢

转载自xls9577087.iteye.com/blog/2219272