From 4176597ca463e126d7352b3d4ff633f0e513c064 Mon Sep 17 00:00:00 2001 From: inrgihc Date: Sat, 22 Oct 2022 23:59:17 +0800 Subject: [PATCH] =?UTF-8?q?v1.6.16:=E5=90=8C=E6=97=B6=E6=94=AF=E6=8C=81mys?= =?UTF-8?q?ql=E5=92=8Cpostgresql=E6=95=B0=E6=8D=AE=E5=BA=93=E4=BD=9C?= =?UTF-8?q?=E4=B8=BA=E9=85=8D=E7=BD=AE=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 +- .../dbswitch/admin/config/DbswitchConfig.java | 22 ++ .../dbswitch/admin/config/QuartzConfig.java | 19 +- .../dbswitch/admin/dao/SystemUserDAO.java | 19 +- .../admin/mapper/AssignmentJobMapper.java | 36 +++- .../admin/mapper/SystemUserMapper.java | 9 - .../src/main/resources/application.yml | 2 +- .../resources/application_sample_mysql.yml | 35 ++++ .../resources/application_sample_postgres.yml | 35 ++++ .../db/postgres/V1_0_0__quartz-ddl.sql | 194 ++++++++++++++++++ .../db/postgres/V1_0_1__system-ddl.sql | 173 ++++++++++++++++ .../db/postgres/V1_0_2__system-dml.sql | 2 + dbswitch-core/pom.xml | 4 + package-tool/src/main/assembly/assembly.xml | 2 +- 14 files changed, 535 insertions(+), 32 deletions(-) create mode 100644 dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/config/DbswitchConfig.java create mode 100644 dbswitch-admin/src/main/resources/application_sample_mysql.yml create mode 100644 dbswitch-admin/src/main/resources/application_sample_postgres.yml create mode 100644 dbswitch-admin/src/main/resources/db/postgres/V1_0_0__quartz-ddl.sql create mode 100644 dbswitch-admin/src/main/resources/db/postgres/V1_0_1__system-ddl.sql create mode 100644 dbswitch-admin/src/main/resources/db/postgres/V1_0_2__system-dml.sql diff --git a/README.md b/README.md index 42ac9134..e6bb77de 100644 --- a/README.md +++ b/README.md @@ -375,9 +375,13 @@ dbswitch.target.writer-engine-insert=true ### 2、基于conf/application.yml配置的dbswitch-admin模块启动的WEB使用方式 -#### (1)、准备一个MySQL(建议为:版本为 5.7+ )的数据库 +#### (1)、准备一个MySQL(建议版本为: 5.7+ )或PostgreSQL(建议版本:11.7+ )的数据库 -#### (2)、配置conf/application.yml +> dbswitch-admin模块后端同时支持MySQL、PostgreSQL作为配置数据库。 + +#### (2)、配置conf/application.yml(MySQL可参考application_sample_mysql.yml配置,PostgreSQL可参考application_sample_postgresql.yml配置) + +MySQL的application.yml配置内容示例如下: ``` server: @@ -526,16 +530,19 @@ cd dbswitch && mvn clean install ### 3、代码集成开发 ``` +// 构建任务执行的线程池 +AsyncTaskExecutor taskExecutor=new ThreadPoolTaskExecutor(); +taskExecutor.setXXXX(); + // 构造dbswitch所需的配置参数,参数说明请参考第三章第1小节 DbswichProperties properties = new DbswichProperties(); properties.setXXXX(); // 将参数传递给dbswitch启动同步方式执行 -MigrationService service = new MigrationService(properties); +MigrationService service = new MigrationService(properties, taskExecutor); service.run(); ``` - ## 五、常见问题解决 ### 1、执行启动脚本报错 diff --git a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/config/DbswitchConfig.java b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/config/DbswitchConfig.java new file mode 100644 index 00000000..e0bde1f0 --- /dev/null +++ b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/config/DbswitchConfig.java @@ -0,0 +1,22 @@ +package com.gitee.dbswitch.admin.config; + +import java.util.Properties; +import org.apache.ibatis.mapping.DatabaseIdProvider; +import org.apache.ibatis.mapping.VendorDatabaseIdProvider; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class DbswitchConfig { + + @Bean + public DatabaseIdProvider getDatabaseIdProvider() { + DatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider(); + Properties props = new Properties(); + props.setProperty("PostgreSQL", "postgresql"); + props.setProperty("MySQL", "mysql"); + databaseIdProvider.setProperties(props); + return databaseIdProvider; + } + +} diff --git a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/config/QuartzConfig.java b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/config/QuartzConfig.java index 91b83c6f..e629feae 100644 --- a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/config/QuartzConfig.java +++ b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/config/QuartzConfig.java @@ -13,10 +13,12 @@ import java.io.IOException; import java.util.Properties; import javax.sql.DataSource; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.quartz.spi.JobFactory; import org.quartz.spi.TriggerFiredBundle; import org.springframework.beans.factory.config.AutowireCapableBeanFactory; import org.springframework.beans.factory.config.PropertiesFactoryBean; +import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Bean; @@ -28,8 +30,8 @@ import org.springframework.scheduling.quartz.SpringBeanJobFactory; @Configuration("dbswitchQuartzConfig") public class QuartzConfig { - @Bean - public Properties quartzProperties() throws IOException { + @Bean("quartzProperties") + public Properties quartzProperties(DataSourceProperties dataSourceProperties) throws IOException { PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean(); Properties prop = new Properties(); @@ -76,6 +78,13 @@ public class QuartzConfig { //quartz相关数据表前缀名 prop.put("org.quartz.jobStore.tablePrefix", "DBSWITCH_"); + // 如果使用的PostgreSQL作为配置数据库,则需要补充如下配置: + // https://blog.csdn.net/wsdhla/article/details/122460119 + if (StringUtils.isNotBlank(dataSourceProperties.getUrl()) + && dataSourceProperties.getUrl().startsWith("jdbc:postgresql://")) { + prop.put("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.PostgreSQLDelegate"); + } + propertiesFactoryBean.setProperties(prop); propertiesFactoryBean.afterPropertiesSet(); @@ -86,14 +95,14 @@ public class QuartzConfig { * SchedulerFactoryBean提供了对org.quartz.Scheduler的创建与配置,并且会管理它的生命周期与Spring同步 */ @Bean - public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource, JobFactory jobFactory) - throws IOException { + public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource, JobFactory jobFactory, + Properties quartzProperties) { SchedulerFactoryBean factory = new SchedulerFactoryBean(); factory.setOverwriteExistingJobs(true); factory.setAutoStartup(true); factory.setDataSource(dataSource); factory.setJobFactory(jobFactory); - factory.setQuartzProperties(quartzProperties()); + factory.setQuartzProperties(quartzProperties); return factory; } diff --git a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/dao/SystemUserDAO.java b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/dao/SystemUserDAO.java index 535157e9..ec1c21db 100644 --- a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/dao/SystemUserDAO.java +++ b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/dao/SystemUserDAO.java @@ -11,8 +11,11 @@ package com.gitee.dbswitch.admin.dao; import com.gitee.dbswitch.admin.entity.SystemUserEntity; import com.gitee.dbswitch.admin.mapper.SystemUserMapper; +import java.util.Objects; import javax.annotation.Resource; import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; +import tk.mybatis.mapper.util.Sqls; @Repository public class SystemUserDAO { @@ -25,10 +28,22 @@ public class SystemUserDAO { } public SystemUserEntity findByUsername(String username) { - return systemUserMapper.findByUsername(username); + return systemUserMapper.selectOneByExample( + Example.builder(SystemUserEntity.class) + .where( + Sqls.custom() + .andEqualTo("username", username) + ) + .build() + ); } public void updateUserPassword(String username, String newPassword) { - systemUserMapper.updateUserPassword(username, newPassword); + SystemUserEntity userEntity = findByUsername(username); + if (Objects.nonNull(userEntity)) { + userEntity.setPassword(newPassword); + systemUserMapper.updateByPrimaryKeySelective(userEntity); + } } + } diff --git a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/mapper/AssignmentJobMapper.java b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/mapper/AssignmentJobMapper.java index 4fa9bb13..5713a689 100644 --- a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/mapper/AssignmentJobMapper.java +++ b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/mapper/AssignmentJobMapper.java @@ -20,16 +20,32 @@ import tk.mybatis.mapper.common.Mapper; public interface AssignmentJobMapper extends Mapper { - @Select("SELECT \n" - + "\t DATE_FORMAT(create_time,'%Y-%m-%d') as of_date , \n" - + "\t count(*) as count_of_job,\n" - + "\t count(DISTINCT assignment_id) as count_of_task \n" - + " FROM \n" - + "( \n" - + "\t SELECT * FROM DBSWITCH_ASSIGNMENT_JOB\n" - + "\t WHERE DATE_SUB( CURDATE(), INTERVAL ${days} DAY ) <= date(create_time)\n" - + ") t \n" - + " GROUP BY of_date ") + @Select("") @Results({ @Result(column = "of_date", property = "dateOfDay"), @Result(column = "count_of_job", property = "countOfJob"), diff --git a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/mapper/SystemUserMapper.java b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/mapper/SystemUserMapper.java index 5d55fcd7..6073935e 100644 --- a/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/mapper/SystemUserMapper.java +++ b/dbswitch-admin/src/main/java/com/gitee/dbswitch/admin/mapper/SystemUserMapper.java @@ -10,17 +10,8 @@ package com.gitee.dbswitch.admin.mapper; import com.gitee.dbswitch.admin.entity.SystemUserEntity; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; -import org.apache.ibatis.annotations.Update; import tk.mybatis.mapper.common.Mapper; public interface SystemUserMapper extends Mapper { - @Select("select * from `DBSWITCH_SYSTEM_USER` where username=#{username} limit 1") - SystemUserEntity findByUsername(@Param("username") String username); - - @Update("update `DBSWITCH_SYSTEM_USER` set password=#{password} where username=#{username} ") - void updateUserPassword(@Param("username") String username, @Param("password") String password); - } diff --git a/dbswitch-admin/src/main/resources/application.yml b/dbswitch-admin/src/main/resources/application.yml index 0491e694..a57efdc0 100644 --- a/dbswitch-admin/src/main/resources/application.yml +++ b/dbswitch-admin/src/main/resources/application.yml @@ -32,4 +32,4 @@ mybatis: mapper: wrap-keyword: "`{0}`" - enable-method-annotation: true \ No newline at end of file + enable-method-annotation: true diff --git a/dbswitch-admin/src/main/resources/application_sample_mysql.yml b/dbswitch-admin/src/main/resources/application_sample_mysql.yml new file mode 100644 index 00000000..a57efdc0 --- /dev/null +++ b/dbswitch-admin/src/main/resources/application_sample_mysql.yml @@ -0,0 +1,35 @@ +server: + port: 9088 + +spring: + application: + name: dbswitch-admin + tomcat: + uri-encoding: UTF-8 + max-http-header-size: 8096 + mvc: + throw-exception-if-no-handler-found: true + static-path-pattern: /statics/** + datasource: + driver-class-name: com.mysql.jdbc.Driver + url: jdbc:mysql://192.168.31.57:3306/dbswitch?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF8&autoReconnect=true&useSSL=false&allowMultiQueries=true&failOverReadOnly=false&connectTimeout=30000 + username: tangyibo + password: 123456 + validation-query: SELECT 1 + test-on-borrow: true + flyway: + locations: classpath:db/migration + baseline-on-migrate: true + table: DBSWITCH_SCHEMA_HISTORY + enabled: true + +mybatis: + configuration: + lazy-loading-enabled: true + aggressive-lazy-loading: false + map-underscore-to-camel-case: true + #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + +mapper: + wrap-keyword: "`{0}`" + enable-method-annotation: true diff --git a/dbswitch-admin/src/main/resources/application_sample_postgres.yml b/dbswitch-admin/src/main/resources/application_sample_postgres.yml new file mode 100644 index 00000000..18b5a126 --- /dev/null +++ b/dbswitch-admin/src/main/resources/application_sample_postgres.yml @@ -0,0 +1,35 @@ +server: + port: 9088 + +spring: + application: + name: dbswitch-admin + tomcat: + uri-encoding: UTF-8 + max-http-header-size: 8096 + mvc: + throw-exception-if-no-handler-found: true + static-path-pattern: /statics/** + datasource: + driver-class-name: org.postgresql.Driver + url: jdbc:postgresql://192.168.31.57:5432/dbswitch?currentSchema=public + username: tangyibo + password: 123456 + validation-query: SELECT 1 + test-on-borrow: true + flyway: + locations: classpath:db/postgres + baseline-on-migrate: true + table: dbswitch_schema_history + enabled: true + +mybatis: + configuration: + lazy-loading-enabled: true + aggressive-lazy-loading: false + map-underscore-to-camel-case: true + #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + +mapper: + wrap-keyword: "\"{0}\"" + enable-method-annotation: true diff --git a/dbswitch-admin/src/main/resources/db/postgres/V1_0_0__quartz-ddl.sql b/dbswitch-admin/src/main/resources/db/postgres/V1_0_0__quartz-ddl.sql new file mode 100644 index 00000000..929cd440 --- /dev/null +++ b/dbswitch-admin/src/main/resources/db/postgres/V1_0_0__quartz-ddl.sql @@ -0,0 +1,194 @@ +-- Thanks to Patrick Lightbody for submitting this... +-- +-- In your Quartz properties file, you'll need to set +-- org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate + +CREATE TABLE IF NOT EXISTS DBSWITCH_JOB_DETAILS +( + SCHED_NAME VARCHAR(120) NOT NULL, + JOB_NAME VARCHAR(200) NOT NULL, + JOB_GROUP VARCHAR(200) NOT NULL, + DESCRIPTION VARCHAR(250) NULL, + JOB_CLASS_NAME VARCHAR(250) NOT NULL, + IS_DURABLE BOOL NOT NULL, + IS_NONCONCURRENT BOOL NOT NULL, + IS_UPDATE_DATA BOOL NOT NULL, + REQUESTS_RECOVERY BOOL NOT NULL, + JOB_DATA BYTEA NULL, + PRIMARY KEY (SCHED_NAME, JOB_NAME, JOB_GROUP) +); + +CREATE TABLE IF NOT EXISTS DBSWITCH_TRIGGERS +( + SCHED_NAME VARCHAR(120) NOT NULL, + TRIGGER_NAME VARCHAR(200) NOT NULL, + TRIGGER_GROUP VARCHAR(200) NOT NULL, + JOB_NAME VARCHAR(200) NOT NULL, + JOB_GROUP VARCHAR(200) NOT NULL, + DESCRIPTION VARCHAR(250) NULL, + NEXT_FIRE_TIME BIGINT NULL, + PREV_FIRE_TIME BIGINT NULL, + PRIORITY INTEGER NULL, + TRIGGER_STATE VARCHAR(16) NOT NULL, + TRIGGER_TYPE VARCHAR(8) NOT NULL, + START_TIME BIGINT NOT NULL, + END_TIME BIGINT NULL, + CALENDAR_NAME VARCHAR(200) NULL, + MISFIRE_INSTR SMALLINT NULL, + JOB_DATA BYTEA NULL, + PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP), + FOREIGN KEY (SCHED_NAME, JOB_NAME, JOB_GROUP) + REFERENCES DBSWITCH_JOB_DETAILS (SCHED_NAME, JOB_NAME, JOB_GROUP) +); + +CREATE TABLE IF NOT EXISTS DBSWITCH_SIMPLE_TRIGGERS +( + SCHED_NAME VARCHAR(120) NOT NULL, + TRIGGER_NAME VARCHAR(200) NOT NULL, + TRIGGER_GROUP VARCHAR(200) NOT NULL, + REPEAT_COUNT BIGINT NOT NULL, + REPEAT_INTERVAL BIGINT NOT NULL, + TIMES_TRIGGERED BIGINT NOT NULL, + PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP), + FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) + REFERENCES DBSWITCH_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) +); + +CREATE TABLE IF NOT EXISTS DBSWITCH_CRON_TRIGGERS +( + SCHED_NAME VARCHAR(120) NOT NULL, + TRIGGER_NAME VARCHAR(200) NOT NULL, + TRIGGER_GROUP VARCHAR(200) NOT NULL, + CRON_EXPRESSION VARCHAR(120) NOT NULL, + TIME_ZONE_ID VARCHAR(80), + PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP), + FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) + REFERENCES DBSWITCH_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) +); + +CREATE TABLE IF NOT EXISTS DBSWITCH_SIMPROP_TRIGGERS +( + SCHED_NAME VARCHAR(120) NOT NULL, + TRIGGER_NAME VARCHAR(200) NOT NULL, + TRIGGER_GROUP VARCHAR(200) NOT NULL, + STR_PROP_1 VARCHAR(512) NULL, + STR_PROP_2 VARCHAR(512) NULL, + STR_PROP_3 VARCHAR(512) NULL, + INT_PROP_1 INT NULL, + INT_PROP_2 INT NULL, + LONG_PROP_1 BIGINT NULL, + LONG_PROP_2 BIGINT NULL, + DEC_PROP_1 NUMERIC(13, 4) NULL, + DEC_PROP_2 NUMERIC(13, 4) NULL, + BOOL_PROP_1 BOOL NULL, + BOOL_PROP_2 BOOL NULL, + PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP), + FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) + REFERENCES DBSWITCH_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) +); + +CREATE IF NOT EXISTS DBSWITCH_BLOB_TRIGGERS +( + SCHED_NAME VARCHAR(120) NOT NULL, + TRIGGER_NAME VARCHAR(200) NOT NULL, + TRIGGER_GROUP VARCHAR(200) NOT NULL, + BLOB_DATA BYTEA NULL, + PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP), + FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) + REFERENCES DBSWITCH_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) +); + +CREATE TABLE IF NOT EXISTS DBSWITCH_CALENDARS +( + SCHED_NAME VARCHAR(120) NOT NULL, + CALENDAR_NAME VARCHAR(200) NOT NULL, + CALENDAR BYTEA NOT NULL, + PRIMARY KEY (SCHED_NAME, CALENDAR_NAME) +); + + +CREATE TABLE IF NOT EXISTS DBSWITCH_PAUSED_TRIGGER_GRPS +( + SCHED_NAME VARCHAR(120) NOT NULL, + TRIGGER_GROUP VARCHAR(200) NOT NULL, + PRIMARY KEY (SCHED_NAME, TRIGGER_GROUP) +); + +CREATE TABLE IF NOT EXISTS DBSWITCH_FIRED_TRIGGERS +( + SCHED_NAME VARCHAR(120) NOT NULL, + ENTRY_ID VARCHAR(95) NOT NULL, + TRIGGER_NAME VARCHAR(200) NOT NULL, + TRIGGER_GROUP VARCHAR(200) NOT NULL, + INSTANCE_NAME VARCHAR(200) NOT NULL, + FIRED_TIME BIGINT NOT NULL, + SCHED_TIME BIGINT NOT NULL, + PRIORITY INTEGER NOT NULL, + STATE VARCHAR(16) NOT NULL, + JOB_NAME VARCHAR(200) NULL, + JOB_GROUP VARCHAR(200) NULL, + IS_NONCONCURRENT BOOL NULL, + REQUESTS_RECOVERY BOOL NULL, + PRIMARY KEY (SCHED_NAME, ENTRY_ID) +); + +CREATE TABLE IF NOT EXISTS DBSWITCH_SCHEDULER_STATE +( + SCHED_NAME VARCHAR(120) NOT NULL, + INSTANCE_NAME VARCHAR(200) NOT NULL, + LAST_CHECKIN_TIME BIGINT NOT NULL, + CHECKIN_INTERVAL BIGINT NOT NULL, + PRIMARY KEY (SCHED_NAME, INSTANCE_NAME) +); + +CREATE TABLE IF NOT EXISTS DBSWITCH_LOCKS +( + SCHED_NAME VARCHAR(120) NOT NULL, + LOCK_NAME VARCHAR(40) NOT NULL, + PRIMARY KEY (SCHED_NAME, LOCK_NAME) +); + +CREATE INDEX IDX_DBSWITCH_J_REQ_RECOVERY + ON DBSWITCH_JOB_DETAILS (SCHED_NAME, REQUESTS_RECOVERY); +CREATE INDEX IDX_DBSWITCH_J_GRP + ON DBSWITCH_JOB_DETAILS (SCHED_NAME, JOB_GROUP); + +CREATE INDEX IDX_DBSWITCH_T_J + ON DBSWITCH_TRIGGERS (SCHED_NAME, JOB_NAME, JOB_GROUP); +CREATE INDEX IDX_DBSWITCH_T_JG + ON DBSWITCH_TRIGGERS (SCHED_NAME, JOB_GROUP); +CREATE INDEX IDX_DBSWITCH_T_C + ON DBSWITCH_TRIGGERS (SCHED_NAME, CALENDAR_NAME); +CREATE INDEX IDX_DBSWITCH_T_G + ON DBSWITCH_TRIGGERS (SCHED_NAME, TRIGGER_GROUP); +CREATE INDEX IDX_DBSWITCH_T_STATE + ON DBSWITCH_TRIGGERS (SCHED_NAME, TRIGGER_STATE); +CREATE INDEX IDX_DBSWITCH_T_N_STATE + ON DBSWITCH_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP, TRIGGER_STATE); +CREATE INDEX IDX_DBSWITCH_T_N_G_STATE + ON DBSWITCH_TRIGGERS (SCHED_NAME, TRIGGER_GROUP, TRIGGER_STATE); +CREATE INDEX IDX_DBSWITCH_T_NEXT_FIRE_TIME + ON DBSWITCH_TRIGGERS (SCHED_NAME, NEXT_FIRE_TIME); +CREATE INDEX IDX_DBSWITCH_T_NFT_ST + ON DBSWITCH_TRIGGERS (SCHED_NAME, TRIGGER_STATE, NEXT_FIRE_TIME); +CREATE INDEX IDX_DBSWITCH_T_NFT_MISFIRE + ON DBSWITCH_TRIGGERS (SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME); +CREATE INDEX IDX_DBSWITCH_T_NFT_ST_MISFIRE + ON DBSWITCH_TRIGGERS (SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME, TRIGGER_STATE); +CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP + ON DBSWITCH_TRIGGERS (SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME, TRIGGER_GROUP, TRIGGER_STATE); + +CREATE INDEX IDX_DBSWITCH_FT_TRIG_INST_NAME + ON DBSWITCH_FIRED_TRIGGERS (SCHED_NAME, INSTANCE_NAME); +CREATE INDEX IDX_DBSWITCH_FT_INST_JOB_REQ_RCVRY + ON DBSWITCH_FIRED_TRIGGERS (SCHED_NAME, INSTANCE_NAME, REQUESTS_RECOVERY); +CREATE INDEX IDX_DBSWITCH_FT_J_G + ON DBSWITCH_FIRED_TRIGGERS (SCHED_NAME, JOB_NAME, JOB_GROUP); +CREATE INDEX IDX_DBSWITCH_FT_JG + ON DBSWITCH_FIRED_TRIGGERS (SCHED_NAME, JOB_GROUP); +CREATE INDEX IDX_DBSWITCH_FT_T_G + ON DBSWITCH_FIRED_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP); +CREATE INDEX IDX_DBSWITCH_FT_TG + ON DBSWITCH_FIRED_TRIGGERS (SCHED_NAME, TRIGGER_GROUP); + +COMMIT; diff --git a/dbswitch-admin/src/main/resources/db/postgres/V1_0_1__system-ddl.sql b/dbswitch-admin/src/main/resources/db/postgres/V1_0_1__system-ddl.sql new file mode 100644 index 00000000..3e2c2471 --- /dev/null +++ b/dbswitch-admin/src/main/resources/db/postgres/V1_0_1__system-ddl.sql @@ -0,0 +1,173 @@ +CREATE TABLE IF NOT EXISTS DBSWITCH_SYSTEM_USER ( + "id" bigserial not null, + "username" varchar(255) not null, + "password" varchar(128) not null, + "salt" varchar(128) not null, + "real_name" varchar(255) not null default '', + "email" varchar(255) not null default '', + "address" varchar(255) not null default '', + "locked" boolean not null default false, + "create_time" timestamp(6) not null default (CURRENT_TIMESTAMP(0))::timestamp(0) without time zone, + "update_time" timestamp(6) not null default (CURRENT_TIMESTAMP(0))::timestamp(0) without time zone, + PRIMARY KEY ("id") +); + +CREATE UNIQUE INDEX DBSWITCH_SYSTEM_USER_USERNAME_IDX ON DBSWITCH_SYSTEM_USER("username"); +COMMENT ON TABLE DBSWITCH_SYSTEM_USER IS '系统用户表'; +COMMENT ON COLUMN DBSWITCH_SYSTEM_USER."id" IS '主键id'; +COMMENT ON COLUMN DBSWITCH_SYSTEM_USER."username" IS '登录名称'; +COMMENT ON COLUMN DBSWITCH_SYSTEM_USER."password" IS '登录密码'; +COMMENT ON COLUMN DBSWITCH_SYSTEM_USER."salt" IS '密码盐值'; +COMMENT ON COLUMN DBSWITCH_SYSTEM_USER."real_name" IS '实际姓名'; +COMMENT ON COLUMN DBSWITCH_SYSTEM_USER."email" IS '电子邮箱'; +COMMENT ON COLUMN DBSWITCH_SYSTEM_USER."address" IS '所在地址'; +COMMENT ON COLUMN DBSWITCH_SYSTEM_USER."locked" IS '是否锁定'; +COMMENT ON COLUMN DBSWITCH_SYSTEM_USER."create_time" IS '创建时间'; +COMMENT ON COLUMN DBSWITCH_SYSTEM_USER."update_time" IS '修改时间'; + +CREATE TABLE IF NOT EXISTS DBSWITCH_SYSTEM_LOG ( + "id" bigserial not null, + "type" int2 not null default 0, + "username" varchar(64) not null default '', + "ip_address" varchar(64) not null default '', + "module_name" varchar(64) not null default '', + "content" text , + "url_path" varchar(64) not null default '', + "user_agent" varchar(255) not null default '', + "failed" boolean not null default false, + "exception" text , + "elapse_seconds" int8 not null default 0, + "create_time" timestamp(6) not null default (CURRENT_TIMESTAMP(0))::timestamp(0) without time zone, + PRIMARY KEY ("id") +); + +COMMENT ON TABLE DBSWITCH_SYSTEM_LOG IS '操作日志'; +COMMENT ON COLUMN DBSWITCH_SYSTEM_LOG."id" IS '主键'; +COMMENT ON COLUMN DBSWITCH_SYSTEM_LOG."type" IS '日志类型:0-访问日志;1-操作日志'; +COMMENT ON COLUMN DBSWITCH_SYSTEM_LOG."username" IS '操作用户'; +COMMENT ON COLUMN DBSWITCH_SYSTEM_LOG."ip_address" IS '客户端ip'; +COMMENT ON COLUMN DBSWITCH_SYSTEM_LOG."module_name" IS '模块名'; +COMMENT ON COLUMN DBSWITCH_SYSTEM_LOG."content" IS '日志描述'; +COMMENT ON COLUMN DBSWITCH_SYSTEM_LOG."url_path" IS 'path路径'; +COMMENT ON COLUMN DBSWITCH_SYSTEM_LOG."user_agent" IS '客户端agent'; +COMMENT ON COLUMN DBSWITCH_SYSTEM_LOG."failed" IS '是否异常(0:否 1:是)'; +COMMENT ON COLUMN DBSWITCH_SYSTEM_LOG."exception" IS '异常堆栈信息'; +COMMENT ON COLUMN DBSWITCH_SYSTEM_LOG."elapse_seconds" IS '执行时间(单位毫秒)'; +COMMENT ON COLUMN DBSWITCH_SYSTEM_LOG."create_time" IS '创建时间'; + +CREATE TABLE IF NOT EXISTS DBSWITCH_DATABASE_CONNECTION ( + "id" bigserial not null, + "name" varchar(200) not null default '', + "type" varchar(200) not null default '', + "driver" varchar(200) not null default '', + "url" text , + "username" varchar(200) not null default '', + "password" varchar(200) not null default '', + "create_time" timestamp(6) not null default (CURRENT_TIMESTAMP(0))::timestamp(0) without time zone, + "update_time" timestamp(6) not null default (CURRENT_TIMESTAMP(0))::timestamp(0) without time zone, + primary key ("id") +); +CREATE UNIQUE INDEX DBSWITCH_DATABASE_CONNECTION_NAME_IDX ON DBSWITCH_DATABASE_CONNECTION("name"); +COMMENT ON TABLE DBSWITCH_DATABASE_CONNECTION IS '数据库连接'; +COMMENT ON COLUMN DBSWITCH_DATABASE_CONNECTION."id" IS '主键'; +COMMENT ON COLUMN DBSWITCH_DATABASE_CONNECTION."name" IS '连接名称'; +COMMENT ON COLUMN DBSWITCH_DATABASE_CONNECTION."type" IS '数据库类型'; +COMMENT ON COLUMN DBSWITCH_DATABASE_CONNECTION."driver" IS '驱动类名称'; +COMMENT ON COLUMN DBSWITCH_DATABASE_CONNECTION."url" IS 'jdbc-url连接串'; +COMMENT ON COLUMN DBSWITCH_DATABASE_CONNECTION."username" IS '连接账号'; +COMMENT ON COLUMN DBSWITCH_DATABASE_CONNECTION."password" IS '账号密码'; +COMMENT ON COLUMN DBSWITCH_DATABASE_CONNECTION."create_time" IS '创建时间'; +COMMENT ON COLUMN DBSWITCH_DATABASE_CONNECTION."update_time" IS '修改时间'; + +CREATE TABLE IF NOT EXISTS DBSWITCH_ASSIGNMENT_TASK ( + "id" bigserial not null, + "name" varchar(200) not null default '', + "description" text , + "schedule_mode" varchar(50) null default null, + "cron_expression" varchar(200) not null default '', + "published" boolean not null default false, + "content" text , + "job_key" varchar(128) DEFAULT '', + "create_time" timestamp(6) not null default (CURRENT_TIMESTAMP(0))::timestamp(0) without time zone, + "update_time" timestamp(6) not null default (CURRENT_TIMESTAMP(0))::timestamp(0) without time zone, + primary key ("id") +); +COMMENT ON TABLE DBSWITCH_ASSIGNMENT_TASK IS '任务信息表'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_TASK."id" IS '主键'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_TASK."name" IS '任务名称'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_TASK."description" IS '任务描述'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_TASK."schedule_mode" IS '调度方式(cron/无调度)'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_TASK."cron_expression" IS '调度cron表达式'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_TASK."published" IS '是否已发布(0:否 1:是)'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_TASK."content" IS '发布的配置JSON格式'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_TASK."job_key" IS 'JOB KEY'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_TASK."create_time" IS '创建时间'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_TASK."update_time" IS '修改时间'; + +CREATE TABLE IF NOT EXISTS DBSWITCH_ASSIGNMENT_CONFIG ( + "id" bigserial not null, + "assignment_id" int8 not null, + "source_connection_id" int8 not null, + "source_schema" varchar(1024) not null, + "table_type" varchar(32) not null default 'TABLE', + "source_tables" text , + "excluded" boolean not null default false, + "target_connection_id" int8 not null, + "target_schema" varchar(200) not null, + "table_name_map" text , + "column_name_map" text , + "target_drop_table" boolean not null default false, + "target_only_create" boolean not null default false, + "batch_size" int8 not null default 10000, + "first_flag" boolean not null default false, + "create_time" timestamp(6) not null default (CURRENT_TIMESTAMP(0))::timestamp(0) without time zone, + primary key ("id"), + foreign key ("assignment_id") references DBSWITCH_ASSIGNMENT_TASK ("id") on delete cascade on update cascade, + foreign key ("source_connection_id") references DBSWITCH_DATABASE_CONNECTION ("id") on delete cascade on update cascade, + foreign key ("target_connection_id") references DBSWITCH_DATABASE_CONNECTION ("id") on delete cascade on update cascade +); +CREATE UNIQUE INDEX DBSWITCH_ASSIGNMENT_CONFIG_AID_UNIQUE_IDX ON DBSWITCH_ASSIGNMENT_CONFIG ("assignment_id"); +COMMENT ON TABLE DBSWITCH_ASSIGNMENT_CONFIG IS '任务配置表'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_CONFIG."id" IS '主键'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_CONFIG."assignment_id" IS '任务ID'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_CONFIG."source_connection_id" IS '来源端连接ID'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_CONFIG."source_schema" IS '来源端的schema'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_CONFIG."table_type" IS '表类型:TABLE;VIEW'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_CONFIG."source_tables" IS '来源端的table列表'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_CONFIG."excluded" IS '是否排除(0:否 1:是)'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_CONFIG."target_connection_id" IS '目的端连接ID'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_CONFIG."target_schema" IS '目的端的schema(一个)'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_CONFIG."table_name_map" IS '表名映射关系'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_CONFIG."column_name_map" IS '字段名映射关系'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_CONFIG."target_drop_table" IS '同步前是否先删除目的表(0:否 1:是)'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_CONFIG."target_only_create" IS '是否只建表'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_CONFIG."batch_size" IS '处理批次大小'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_CONFIG."first_flag" IS '首次加载数据'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_CONFIG."create_time" IS '创建时间'; + +CREATE TABLE IF NOT EXISTS DBSWITCH_ASSIGNMENT_JOB ( + "id" bigserial not null, + "assignment_id" int8 not null, + "job_key" varchar(200) not null default '', + "start_time" timestamp not null default (CURRENT_TIMESTAMP(0))::timestamp(0) without time zone, + "finish_time" timestamp not null default (CURRENT_TIMESTAMP(0))::timestamp(0) without time zone, + "schedule_mode" smallint not null default 0, + "status" smallint not null default 0, + "error_log" text , + "create_time" timestamp(6) not null default (CURRENT_TIMESTAMP(0))::timestamp(0) without time zone, + "update_time" timestamp(6) not null default (CURRENT_TIMESTAMP(0))::timestamp(0) without time zone, + primary key ("id"), + foreign key ("assignment_id") references DBSWITCH_ASSIGNMENT_TASK ("id") on delete cascade on update cascade +); + +COMMENT ON TABLE DBSWITCH_ASSIGNMENT_JOB IS 'JOB日志表'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_JOB."id" IS '主键'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_JOB."assignment_id" IS '任务ID'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_JOB."job_key" IS 'Quartz的Job名'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_JOB."start_time" IS '执行开始时间'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_JOB."finish_time" IS '执行结束时间'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_JOB."schedule_mode" IS '调度模式'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_JOB."status" IS '执行状态:0-未执行;1-执行中;2-执行失败;3-执行成功'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_JOB."error_log" IS '异常日志'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_JOB."create_time" IS '创建时间'; +COMMENT ON COLUMN DBSWITCH_ASSIGNMENT_JOB."update_time" IS '修改时间'; diff --git a/dbswitch-admin/src/main/resources/db/postgres/V1_0_2__system-dml.sql b/dbswitch-admin/src/main/resources/db/postgres/V1_0_2__system-dml.sql new file mode 100644 index 00000000..53cd3c4a --- /dev/null +++ b/dbswitch-admin/src/main/resources/db/postgres/V1_0_2__system-dml.sql @@ -0,0 +1,2 @@ +insert into DBSWITCH_SYSTEM_USER("username","password","salt","real_name","locked","email") +values ('admin', '$2a$10$eUanVjvzV27BBxAb4zuBCugwnngHkRZ7ZB4iI5tdx9ETJ2tnXJJDy', '$2a$10$eUanVjvzV27BBxAb4zuBCu', '管理员', false,'admin@126.com'); diff --git a/dbswitch-core/pom.xml b/dbswitch-core/pom.xml index b78809dd..28f14c91 100644 --- a/dbswitch-core/pom.xml +++ b/dbswitch-core/pom.xml @@ -200,6 +200,10 @@ guava com.google.guava + + derby + org.apache.derby + diff --git a/package-tool/src/main/assembly/assembly.xml b/package-tool/src/main/assembly/assembly.xml index cf89c800..73798c09 100644 --- a/package-tool/src/main/assembly/assembly.xml +++ b/package-tool/src/main/assembly/assembly.xml @@ -78,7 +78,7 @@ - + ${project.parent.basedir}/dbswitch-admin/target