liquibase是一个数据库变更的版本控制工具。项目中通过liquibase解析用户编写的liquibase的配置文件,生成sql语句,并执行和记录。执行是根据记录确定sql语句是否曾经执行过,和配置文件里的预判断语句确定sql是否执行。liquibase开源版使用Apache 2.0协议。
官网地址:https://www.liquibase.org/
1、配置文件支持SQL、XML、JSON 或者 YAML2、版本控制按序执行3、可以用上下文控制sql在何时何地如何执行。4、支持schmea的变更5、根据配置文件自动生成sql语句用于预览6、可重复执行迁移7、可插件拓展8、可回滚9、可兼容14种主流数据库如oracle,mysql,pg等,支持平滑迁移10、支持schema方式的多租户(multi-tenant)
1、changeSet 执行sql的并记录、版本控制的最小单元。即每条changeSet生成1条执行记录,版本控制是基于执行记录的。 2、changelog 即执行记录。由changeSet执行后产生的记录。记录默认保存在databasechangelog表中,此表由liquibase自动生成。包含id,author,filename,dateexcuted,orderexcuted,exectype,md5sum等字段。 3、databasechangeloglock。liquibase的锁表。liquibase在执行前更新此表的locked为true,执行完liquibase的工作,将locked更新为false,适合集群使用
https://www.liquibase.org/
Liquibase的changelog文件放在resources/db/changelog目录下,如下图所示,我们只需要追加更改这些文件来更新数据库。db.changelog-master.xml是主文件,只用于包含文件,一般不做更改。根据修改类型:增加,修改,删除表对象和数据导入分别在各自文件添加。数据文件以csv格式放到csv目录下。
# 数据源
spring:
datasource:
pig:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: org.postgresql.Driver
username: postgres
password: 123456
jdbc-url: jdbc:postgresql://${POSTGRE_HOST:pig-postgre}:${POSTGRE_PORT:5432}/${POSTGRE_DB:pig}?currentSchema=pig
liquibase:
enabled: true
change-log: classpath:/db/liquibase/db.changelog-master.xml
db.changelog-master.xml文件配置:
<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.4.xsd">
<includeAll path="./init-sql/" relativeToChangelogFile="true"/>
<includeAll path="./sqlchangelog/" relativeToChangelogFile="true"/>
databaseChangeLog>
CREATE TABLE "pig_config"."databasechangelog" (
"id" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
"author" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
"filename" varchar(255) COLLATE "pg_catalog"."default" NOT NULL,
"dateexecuted" timestamp(6) NOT NULL,
"orderexecuted" int4 NOT NULL,
"exectype" varchar(10) COLLATE "pg_catalog"."default" NOT NULL,
"md5sum" varchar(35) COLLATE "pg_catalog"."default",
"description" varchar(255) COLLATE "pg_catalog"."default",
"comments" varchar(255) COLLATE "pg_catalog"."default",
"tag" varchar(255) COLLATE "pg_catalog"."default",
"liquibase" varchar(20) COLLATE "pg_catalog"."default",
"contexts" varchar(255) COLLATE "pg_catalog"."default",
"labels" varchar(255) COLLATE "pg_catalog"."default",
"deployment_id" varchar(10) COLLATE "pg_catalog"."default"
)
;
ALTER TABLE "pig_config"."databasechangelog"
OWNER TO "cloud_dev_pg";
CREATE TABLE "pig_config"."databasechangeloglock" (
"id" int4 NOT NULL,
"locked" bool NOT NULL,
"lockgranted" timestamp(6),
"lockedby" varchar(255) COLLATE "pg_catalog"."default",
CONSTRAINT "databasechangeloglock_pkey" PRIMARY KEY ("id")
)
;
ALTER TABLE "pig_config"."databasechangeloglock"
OWNER TO "cloud_dev_pg";
如下所示SQL方式:
--liquibase formatted sql
--changeset test:20230607_1
-- 2023年6月7日 崔辛福 告警通知规则新增组织名称代码
ALTER TABLE "aio_event"."rule_config" ADD COLUMN org_name varchar(100);
COMMENT ON COLUMN "aio_event"."rule_config"."org_name" is '机构昵称';
--changeset test:20230612_1
-- 2023年6月12日 崔辛福 值守报告推送新增日周月cron表达式
ALTER TABLE "aio_event"."report_push_set" ADD COLUMN day_cron varchar(50);
COMMENT ON COLUMN "aio_event"."report_push_set"."day_cron" is '日报接收时间表达式';
ALTER TABLE "aio_event"."report_push_set" ADD COLUMN week_cron varchar(50);
COMMENT ON COLUMN "aio_event"."report_push_set"."week_cron" is '周报接收时间表达式';
ALTER TABLE "aio_event"."report_push_set" ADD COLUMN month_cron varchar(50);
COMMENT ON COLUMN "aio_event"."report_push_set"."month_cron" is '月报接收时间表达式';
说明例如:
–changeset test:20230612_1
– 2023年6月7日 说明
具体说明:
changset 为一条记录标识
test作者信息
20230612_1 执行id
– 2023年6月7日 为用户自己添加的注释,不会参与入库和其他操作,只是纯粹的注释一下
如下所示XML方式:
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:xsi="h