一、Liquibase
Liquibase是一个用于跟踪、管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化(包括结构和数据)都保存在XML文件中,便于版本控制。
Liquibase具备如下特性:
* 不依赖于特定的数据库,目前支持包括Oracle/Sql Server/DB2/MySql/Sybase/PostgreSQL/Caché等12种 数据库,这样在数据库的部署和升级环节可帮助应用系统支持多数据库。
* 提供数据库比较功能,比较结果保存在XML中,基于该XML你可用Liquibase轻松部署或升级数据库。
* 以XML存储数据库变化,其中以作者和ID唯一标识一个变化(ChangSet),支持数据库变化的合并,因此 支持多开发人员同时工作。
* 在数据库中保存数据库修改历史(DatabaseChangeHistory),在数据库升级时自动跳过已应用的变化 (ChangSet)。
* 提供变化应用的回滚功能,可按时间、数量或标签(tag)回滚已应用的变化。通过这种方式,开发人员可 轻易的还原数据库在任何时间点的状态。
* 可生成数据库修改文档(HTML格式)
* 提供数据重构的独立的IDE和Eclipse插件
二、使用在使用的过程中,Liquibase的作用就像是写好sql或者DML语句来完成数据库的更新,那么通俗些来说:将数据库schema的改变(table的创建、column的改变、index的改变......)以及数据本身内容的改变(insert 、 update 、 delete),用Liquibase定义的语法写成xml格式的=change log,同时也会在数据库中创建一张databasechangelog的table,用来记录db更新了那些change log,当xml新增更多的change log后,跟db里的版本比较,就可得知那些未同步的change log有哪些,下次同步时,就会同步这些未同步的change log,在这点上,Liquibase和现在大名鼎鼎的git很相似。
在这里需要注意一点:change log的文档,一旦同步过后,文档中对应的id以及文档路径等tag改变,那么文档中的改变就会当成新的change log,再次被同步到数据库中
三、使用
1、同步xml到db
(1) 创建table
<?xml version="1.0" encoding="UTF-8"?> <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> <!-- 建立 uesr table --> <changeSet id="create-user-table" author="kent"> <createTable tableName="user"> <column name="first_name" type="varchar(50)"> <constraints nullable="false"/> </column> <column name="last_name" type="varchar(50)"> </column> </createTable> </changeSet> </databaseChangeLog>
如上操作即可完成 create table的操作 在结合maven使用时,执行mvn liquibase:update,db里面会产生三张table
databasechangelog是記錄同步用的,
databasechangeloglock是做locking的
user 則是上面的change log中的createTable建立的
其中前两个时liquibase管理,不需要管理,不过有兴趣的话 可以看下对应的表记录,就可以发现每次同步的操作都有记录
(2) update table
若是这个时候xml文档中添加如下的内容
<?xml version="1.0" encoding="UTF-8"?> <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> <!--省略前面的create table的操作--> <!-- 在user table加入 address column --> <changeSet id="addColumn-example" author="kent"> <addColumn catalogName="mydb" schemaName="public" tableName="user"> <column name="address" type="varchar(255)"/> </addColumn> </changeSet> </databaseChangeLog>
那么在此执行 mvn liquibase:update 后,user table就会多出新增的column。在这里需要注意点,由于create-user-table author="kent"前面被执行过来,同时对应的内容未发生改变,所以不会在此被执行。
(3) insert table
<?xml version="1.0" encoding="UTF-8"?> <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> <!-- insert兩筆測試資料 --> <changeSet id="insert-example" author="kent" > <insert catalogName="mydb" schemaName="public" tableName="user"> <column name="first_name" value="kent"/> <column name="last_name" value="chiu"/> </insert> <insert catalogName="mydb" schemaName="public" tableName="user"> <column name="first_name" value="cindy"/> <column name="last_name" value="chiu"/> </insert> </changeSet> </databaseChangeLog>
mvn liquibase:update 之后 数据库会增加两条记录
关于版本说明
在实际上,只要db的schema有做改变的,都是从xml进行改变,那么若是资料内容发生改变,则根据实际情况看要不要从change log改变。必要的预设资料可以在change log中进行设定。通过insert tag来建,减少每次重建table都要重新添加数据的步骤;同时也可结合其他指令,使数据库回到特定的版本,是不是和git很像
四、从数据库产生changelog.xml
对于现有的db,可以通过generateChangeLog从数据库中产生change log ,再以这个change log为基础,针对后续的改变,再通过liquibase管理(xml -- db);需要注意在通过generateChangeLog进行导出时,预设时只有schema(table/view/column/index/foreignkey/primarykey/uniqueconstraint),在产生数据时,不需要指定diffTypes参数,若是有其他的内容需要产生,则必须指定diffTypes参数
若是想只导出数据
diffTypes = data,只有数据,没有schema的信息;数据也可导出csv或者导入csv
只生成数据
mvn liquibase:generateChangeLog -Dliquibase.diffTypes=data
同时生产schema和datas
mvn liquibase:generateChangeLog -Dliquibase.diffTypes=tables,views,columns,indexs,foreignkeys,primarykeys,uniqueconstraints,data
----------------------------------------------------------------------------------
以上只是liquibase的简单描述,详情请见:http://www.liquibase.org/documentation/databasechangelog.html