前沿拓展:
一、工具介紹1、功能描述
一句話,dbswitch工具提供源端數(shù)據(jù)庫向目的端數(shù)據(jù)庫的批量遷移同步功能,支持?jǐn)?shù)據(jù)的全量和增量方式同步。包括:
結(jié)構(gòu)遷移
支持字段類型、主鍵信息、建表語句等的轉(zhuǎn)換,并生成建表SQL語句。
支持基于正則表達(dá)式轉(zhuǎn)換的表名與字段名映射轉(zhuǎn)換。
數(shù)據(jù)同步。
基于JDBC的分批次讀取源端數(shù)據(jù)庫數(shù)據(jù),并基于insert/copy方式將數(shù)據(jù)分批次寫入目的數(shù)據(jù)庫。
支持有主鍵表的 增量變更同步 (變化數(shù)據(jù)計(jì)算Change Data Calculate)功能(千萬級以上數(shù)據(jù)量的性能尚需在生產(chǎn)環(huán)境驗(yàn)證)
2、功能設(shè)計(jì)
結(jié)構(gòu)設(shè)計(jì)模塊結(jié)構(gòu)設(shè)計(jì)模塊結(jié)構(gòu)功能└── dbswitch
├── dbswitch-common // dbswitch通用定義模塊
├── dbswitch-pgwriter // PostgreSQL的二進(jìn)制寫入封裝模塊
├── dbswitch-dbwriter // 數(shù)據(jù)庫的通用批量Insert封裝模塊
├── dbswitch-core // 數(shù)據(jù)庫元數(shù)據(jù)抽取與建表結(jié)構(gòu)語句轉(zhuǎn)換模塊
├── dbswitch-sql // 基于calcite的DML語句轉(zhuǎn)換與DDL拼接模塊
├── dbswitch-dbcommon // 數(shù)據(jù)庫**作通用封裝模塊
├── dbswitch-dbchange // 基于全量比對計(jì)算變更(變化量)數(shù)據(jù)模塊
├── dbswitch-dbsynch // 將dbchange模塊計(jì)算的變更數(shù)據(jù)同步入庫模塊
├── dbswitch-data // 工具入口模塊,讀取配置文件中的參數(shù)執(zhí)行異構(gòu)遷移同步
├── dbswitch-admin // 在以上模塊的基礎(chǔ)上引入Quartz的調(diào)度服務(wù)與接口
├── dbswitch-admin-ui // 基于Vue2的前段WEB交互頁面
├── package-tool // 基于maven-assembly-plugin插件的項(xiàng)目打包模塊二、編譯打包
本工具純Java語言開發(fā),代碼中的依賴全部來自于開源項(xiàng)目。
1、編譯打包環(huán)境要求:JDK:>=1.8 (建議用JDK 1.8)maven:>=3.6
Maven 倉庫默認(rèn)在國外, 國內(nèi)使用難免很慢,可以更換為阿里云的倉庫。 參考教程: 配置阿里云的倉庫教程
編譯命令:
(1) windows下:
雙擊build.cmd腳本文件即可編譯打包
(2) Linux下:
git clone https://gitee.com/inrgihc/dbswitch.git
cd dbswitch/
sh ./build.sh
(3) Docker下:
git clone https://gitee.com/inrgihc/dbswitch.git
cd dbswitch/
sh ./docker-maven-build.sh
特別注意: 在Java9及以上版本默認(rèn)情況下不允許應(yīng)用程序查看來自JDK的所有類,但在dbswitch中利用反射計(jì)算對象的字節(jié)大小,所以需要在JVM啟動(dòng)時(shí)需要增加如下參數(shù):
–add-opens java.base/jdk.internal.loader=ALL-UNNAMED –add-opens jdk.zipfs/jdk.nio.zipfs=ALL-UNNAMED2、安裝部署
(1) 當(dāng)編譯打包命令執(zhí)行完成后,會(huì)在dbswitch/target/目錄下生成dbswitch-relase-x.x.x.tar.gz的打包文件,將文件拷貝到已安裝JRE的部署機(jī)器上解壓即可。
(2) 基于docker-compose提供linux聯(lián)網(wǎng)環(huán)境下的一鍵安裝,安裝命令見 發(fā)行版鏈接地址
文檔詳見: build-docker/install/README.md
三、工具使用
dbswitch工具提供基于conf/config.yml配置的dbswitch-data模塊啟動(dòng)方式和基于conf/application.yml的dbswitch-admin模塊的WEB端使用方式;
1、基于conf/config.yml配置的dbswitch-data模塊啟動(dòng)命令**作方式(1)、配置文件
配置文件信息請見部署包中的:conf/config.yml(注:也同時(shí)支持使用conf/config.properties配置文件名的properties格式),示例配置如下:
dbswitch:
source:
# source database connection information
## support MySQL/MariaDB/DB2/DM/Kingbase8/Oracle/SQLServer/PostgreSQL/Greenplum etc.
## support multiple source database connection
– url: jdbc:oracle:thin:@172.17.2.10:1521:ORCL
driver-class-name: 'oracle.jdbc.driver.OracleDriver'
username: 'system'
password: '123456'
# source database configuration parameters
## fetch size for query source database
fetch-size: 10000
## schema name for query source schemas, separate by ','
source-schema: 'TANG'
## table type which include or exclude,option: TABLE,VIEW
table-type: 'TABLE'
## table name include from table lists, separate by ','
source-includes: ''
## table name exclude from table lists, separate by ','
source-excludes: ''
## table name convert mapper by regular expression
regex-table-mapper:
– from-pattern: '^'
to-value: 'T_'
## columns name convert mapper by regular expression like regex-table-mapper
regex-column-mapper:
target:
# target database connection information
## Best support for Oracle/PostgreSQL/Greenplum/DM etc.
url: jdbc:postgresql://172.17.2.10:5432/test
driver-class-name: org.postgresql.Driver
username: tang
password: 123456
# target database configuration parameters
## schema name for create/insert table data
target-schema: public
## whether drop-create table when target table exist
target-drop: true
## whether create table support auto increment for primary key field
create-table-auto-increment: false
## whether use insert engine to write data for target database
## Only useful for PostgreSQL/Greenplum database
writer-engine-insert: false
## whether use change data synchronize to target database table
change-data-sync: true
配置參數(shù)
配置說明
示例
備注
dbswitch.source[i].url
來源端JDBC連接的URL
jdbc:oracle:thin:@10.17.1.158:1521:ORCL
可為:oracle/mysql/mariadb/sqlserver/postgresql/db2/dm/kingbase8/highgo
dbswitch.source[i].driver-class-name
來源端數(shù)據(jù)庫的驅(qū)動(dòng)類名稱
oracle.jdbc.driver.OracleDriver
對應(yīng)數(shù)據(jù)庫的驅(qū)動(dòng)類
dbswitch.source[i].username
來源端連接帳號名
tangyibo
無
dbswitch.source[i].password
來源端連接帳號密碼
tangyibo
無
dbswitch.source[i].fetch-size
來源端數(shù)據(jù)庫查詢時(shí)的fetch_size設(shè)置
10000
需要大于100有效
dbswitch.source[i].source-schema
來源端的schema名稱
dbo,test
多個(gè)之間用英文逗號分隔
dbswitch.source[i].table-type
來源端表的類型
TABLE
可選值為:TABLE、VIEW ,分別代表物理表和試圖表
dbswitch.source[i].source-includes
來源端schema下的表中需要包含的表名稱
users1,orgs1
支持多個(gè)表(多個(gè)之間用英文逗號分隔);支持支持正則表達(dá)式(不能含有逗號)
dbswitch.source[i].source-excludes
來源端schema下的表中需要過濾的表名稱
users,orgs
不包含的表名稱,多個(gè)之間用英文逗號分隔
dbswitch.source[i].regex-table-mapper
基于正則表達(dá)式的表名稱映射關(guān)系
[{"from-pattern": "^","to-value": "T_"}]
為list類型,元素存在順序關(guān)系
dbswitch.source[i].regex-column-mapper
基于正則表達(dá)式的字段名映射關(guān)系
[{"from-pattern": "#34;,"to-value": "_x"}]
為list類型,元素存在順序關(guān)系
dbswitch.target.url
目的端JDBC連接的URL
jdbc:postgresql://10.17.1.90:5432/study
可為:oracle/sqlserver/postgresql/greenplum,mysql/mariadb/db2/dm/kingbase8/highgo也支持,但字段類型兼容性問題比較多
dbswitch.target.driver-class-name
目的端 數(shù)據(jù)庫的驅(qū)動(dòng)類名稱
org.postgresql.Driver
對應(yīng)數(shù)據(jù)庫的驅(qū)動(dòng)類
dbswitch.target.username
目的端連接帳號名
study
無
dbswitch.target.password
目的端連接帳號密碼
123456
無
dbswitch.target.target-schema
目的端的schema名稱
public
目的端的schema名稱只能有且只有一個(gè)
dbswitch.target.target-drop
是否執(zhí)行先drop表第二create表命令,當(dāng)target.datasource-target.drop=true時(shí)有效
true
可選值為:true、false
dbswitch.target.create-table-auto-increment
是否執(zhí)啟用支持create表時(shí)主鍵自增
true
可選值為:true、false
dbswitch.target.writer-engine-insert
是否使用insert寫入數(shù)據(jù)
false
可選值為:true為insert寫入、false為copy寫入,只針對目的端數(shù)據(jù)庫為PostgreSQL/Greenplum的有效
dbswitch.target.change-data-sync
是否啟用增量變更同步,dbswitch.target.target-drop為false時(shí)且表有主鍵情況下有效,千萬級以上數(shù)據(jù)量建議設(shè)為false
false
可選值為:true、false
注意:
(1)支持源端為多個(gè)數(shù)據(jù)源類型,如果dbswitch.source[i]為數(shù)組類型,i為編號,從0開始的整數(shù);(2)如果dbswitch.source[i].source-includes不為空,則按照包含表的方式來執(zhí)行;(3)如果dbswitch.source[i].source-includes為空,則按照dbswitch.source[i].source-excludes排除表的方式來執(zhí)行。(4)如果dbswitch.target.target-drop=false,dbswitch.target.change-data-synch=true;時(shí)會(huì)對有主鍵表啟用增量變更方式同步(5)對于regex-table-mapper和regex-column-mappe,為基于正則表達(dá)式替換的表名映射和字段名映射,均可以為空(代表原名映射,即源的表t_a映射到目的端也為t_a)
提示:如果要將源端所有表名(或者字段名)添加前綴,可以配置"from-pattern": "^","to-value": "T_";
(6)支持的數(shù)據(jù)庫產(chǎn)品及其JDBC驅(qū)動(dòng)連接示例如下:
MySQL/MariaDB數(shù)據(jù)庫
jdbc連接地址:jdbc:mysql://172.17.2.10:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&tinyInt1i**it=false&rewriteBatchedStatements=true&u**pression=true
jdbc驅(qū)動(dòng)名稱: com.mysql.jdbc.Driver
與:
jdbc連接地址:jdbc:mariadb://172.17.2.10:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&tinyInt1i**it=false&rewriteBatchedStatements=true&u**pression=true
jdbc驅(qū)動(dòng)名稱: org.mariadb.jdbc.Driver
Oracle數(shù)據(jù)庫
jdbc連接地址:jdbc:oracle:thin:@172.17.2.10:1521:ORCL 或 jdbc:oracle:thin:@//172.17.2.10:1521/ORCL
jdbc驅(qū)動(dòng)名稱:oracle.jdbc.driver.OracleDriver
SQL Server(>=2005)數(shù)據(jù)庫
jdbc連接地址:jdbc:sqlserver://172.17.2.10:1433;DatabaseName=test
jdbc驅(qū)動(dòng)名稱:com.microsoft.sqlserver.jdbc.SQLServerDriver
Sybase數(shù)據(jù)庫
jdbc連接地址:jdbc:sybase:Tds:172.17.2.10:5000/test
jdbc驅(qū)動(dòng)名稱:com.sybase.jdbc4.jdbc.SybDriver
PostgreSQL/Greenplum數(shù)據(jù)庫
jdbc連接地址:jdbc:postgresql://172.17.2.10:5432/test
jdbc驅(qū)動(dòng)名稱:org.postgresql.Driver
DB2數(shù)據(jù)庫
jdbc連接地址:jdbc:db2://172.17.2.10:50000/testdb:driverType=4;fullyMaterializeLobData=true;fullyMaterializeInputStreams=true;progressiveStreaming=2;progresssiveLocators=2;
jdbc驅(qū)動(dòng)名稱:com.ibm.db2.jcc.DB2Driver
達(dá)夢DMDB數(shù)據(jù)庫
jdbc連接地址:jdbc:dm://172.17.2.10:5236
jdbc驅(qū)動(dòng)名稱:dm.jdbc.driver.DmDriver
人大金倉Kingbase8數(shù)據(jù)庫
jdbc連接地址:jdbc:kingbase8://172.17.2.10:54321/MYTEST
jdbc驅(qū)動(dòng)名稱:com.kingbase8.Driver
神通Oscar數(shù)據(jù)庫
jdbc連接地址:jdbc:oscar://172.17.2.1:2003/OSRDB
jdbc驅(qū)動(dòng)名稱:com.oscar.Driver
南大通用GBase8a數(shù)據(jù)庫
jdbc連接地址:jdbc:gbase://172.17.2.1:5258/gbase
jdbc驅(qū)動(dòng)名稱:com.gbase.jdbc.Driver
翰高HighGo數(shù)據(jù)庫(可按PostgreSQL使用)
jdbc連接地址:jdbc:postgresql://172.17.2.10:5866/highgo
jdbc驅(qū)動(dòng)名稱:org.postgresql.Driver
Apache Hive數(shù)據(jù)庫
jdbc連接地址:jdbc:hive2://172.17.2.12:10000/default
jdbc驅(qū)動(dòng)名稱:org.apache.hive.jdbc.HiveDriver
注意:當(dāng)前只支持hive version 3.x的賬號密碼認(rèn)證方式。
SQLite數(shù)據(jù)庫
jdbc連接地址:jdbc:sqlite:/tmp/test.db 或者 jdbc:sqlite::resource:http://172.17.2.12:8080/test.db
jdbc驅(qū)動(dòng)名稱:org.sqlite.JDBC
注意:
(a) 本地文件方式:jdbc:sqlite:/tmp/test.db , 該方式適用于dbswitch為實(shí)體機(jī)器部署的場景。
(b) 遠(yuǎn)程文件方式: jdbc:sqlite::resource:http://172.17.2.12:8080/test.db ,該方式適用于容器方式部署的場景, 搭建文件服務(wù)器的方法可使 用如下docker方式快速部署(/home/sqlites為服務(wù)器上存放sqlite數(shù)據(jù)庫文件的目錄):
docker run -d –name http_file_server -p 8080:8080 -v /home/sqlites:/data inrgihc/http_file_server:latest
說明:遠(yuǎn)程服務(wù)器文件將會(huì)被下載到本地System.getProperty("java.io.tmpdir")所指定的目錄下(linux為/tmp/,Windows為C:/temp/),并以 sqlite-jdbc-tmp-{XXX}.db的方式進(jìn)行文件命名,其中{XXX}為文件網(wǎng)絡(luò)地址(例如上述為http://192.168.31.57:8080/test.db) 的字符串哈希值, 如果本地文件已經(jīng)存在則不會(huì)再次進(jìn)行下載而是直接使用該文件(當(dāng)已經(jīng)下載過文件后,遠(yuǎn)程服務(wù)器即使關(guān)閉了,該sqlite的jdbc-url任然可 用,直至本地的sqlite-jdbc-tmp-XXX.db文件被人為手動(dòng)刪除)
(c) 不支持內(nèi)存及其他方式;本地文件方式可以作為源端和目的端,而遠(yuǎn)程服務(wù)器方式只能作為源端。
(d) SQLite為單寫多讀方式,禁止人為方式造成多寫導(dǎo)致鎖表。
(2)、啟動(dòng)方法linux系統(tǒng)下:cd dbswitch-release-X.X.X/
bin/datasync.shwindows系統(tǒng)下:切換到dbswitch-release-X.X.X/bin/目錄下,雙擊datasync.cmd腳本文件即可啟動(dòng)(3)、額外說明1、對于向目的庫為PostgreSQL/Greenplum的數(shù)據(jù)離線同步默認(rèn)采用copy方式寫入數(shù)據(jù),說明如下:(a) 如若使用copy方式寫入,配置文件中需配置為postgresql的jdbc url和驅(qū)動(dòng)類(不能為greenplum的驅(qū)動(dòng)包),(b) 如若使用insert方式寫入,需要在config.properties配置文件中設(shè)置如下參數(shù)為true:dbswitch.target.writer-engine-insert=true2、dbswitch離線同步工具支持的數(shù)據(jù)類型包括:整型、時(shí)間、文本、二進(jìn)制等常用數(shù)據(jù)類型;3、Oracle的表雖然設(shè)置了主鍵,如果主鍵約束實(shí)際為DISABLED狀態(tài),那在進(jìn)行結(jié)構(gòu)轉(zhuǎn)換時(shí)會(huì)按照沒有此主鍵處理。4、關(guān)于增量變更同步方式的使用說明
步驟A:先通過設(shè)置dbswitch.target.target-drop=true,dbswitch.target.change-data-sync=false;啟動(dòng)程序進(jìn)行表結(jié)構(gòu)和數(shù)據(jù)的全量同步;
步驟B:第二設(shè)置dbswitch.target.target-drop=false,dbswitch.target.change-data-sync=true;再啟動(dòng)程序?qū)Γㄓ兄麈I表)數(shù)據(jù)進(jìn)行增量變更同步。
注:如果待同步的兩端表結(jié)構(gòu)已經(jīng)一致或源端字段是目的端字段的子集,也可直接用步驟B配置進(jìn)行變更同步
2、基于conf/application.yml配置的dbswitch-admin模塊啟動(dòng)的WEB使用方式(1)、準(zhǔn)備一個(gè)MySQL(建議為:版本為 5.7+ )的數(shù)據(jù)庫(2)、配置conf/application.ymlserver:
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&useSSL=false
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
按照上述配置,修改conf/application.yml配置文件中的spring.datasource.url和spring.datasource.username及spring.datasource.password三個(gè)字段值的配置。
(3)、啟動(dòng)dbswitch-admin系統(tǒng)linux系統(tǒng)下:cd dbswitch-release-X.X.X/
bin/startup.shwindows系統(tǒng)下:切換到dbswitch-release-X.X.X/bin/目錄下,雙擊startup.cmd腳本文件即可啟動(dòng)(4)、補(bǔ)充說明dbswitch-admin的WEB端會(huì)根據(jù)用戶的配置調(diào)用dbswitch-data模塊執(zhí)行數(shù)據(jù)遷移同步;dbswitch-admin服務(wù)啟動(dòng)時(shí)會(huì)基于flyway自動(dòng)建庫建表,需要保證配置的mysql連接賬號具有建庫建表等權(quán)限;dbswitch離線同步工具提供各種數(shù)據(jù)庫間表結(jié)構(gòu)轉(zhuǎn)換RESTful在線API接口如下:(詳見接口文檔)WEB系統(tǒng)的訪問如下:
URL地址: http://127.0.0.1:9088 登陸賬號:admin 登陸密碼:123456
Swagger在線接口地址: http://127.0.0.1:9088/swagger-ui/
注意:如果為服務(wù)器部署時(shí),需要將127.0.0.1替換為服務(wù)器的IP地址。
WEB系統(tǒng)的使用流程為:
建立源端數(shù)據(jù)庫的連接 -> 建立目的斷數(shù)據(jù)庫的連接 -> 配置任務(wù) -> 發(fā)布任務(wù) -> 手動(dòng)/系統(tǒng)調(diào)度執(zhí)行任務(wù) -> 查看調(diào)度記錄 -> 數(shù)據(jù)目錄查看數(shù)據(jù)結(jié)果
WEB系統(tǒng)的部分截圖:
3、兩種方式的適用場景方式一:基于conf/config.yml配置的dbswitch-data模塊啟動(dòng)的命令**作方式式
優(yōu)點(diǎn):
當(dāng)需要配置的表或字段等數(shù)量較大時(shí),該方式便于在yml中配置;
只需一個(gè)配置文件即可進(jìn)行啟動(dòng)執(zhí)行任務(wù);
缺點(diǎn):
只能運(yùn)行單個(gè)任務(wù),任務(wù)執(zhí)行完立即停止;
不支持CRON表達(dá)式的周期執(zhí)行;
方式二:基于conf/application.yml配置的dbswitch-admin模塊啟動(dòng)的WEB使用方式
優(yōu)點(diǎn):
提供WEB**作來配置(方式一的YAML中的參數(shù)),只需點(diǎn)擊即可完成配置;
支持多個(gè)任務(wù)并發(fā)執(zhí)行(在硬件資源足夠的條件下)
支持CRON表達(dá)式的周期執(zhí)行
缺點(diǎn):
當(dāng)數(shù)據(jù)庫內(nèi)的表或字段數(shù)量較大時(shí),WEB方式卡頓嚴(yán)重;
多個(gè)任務(wù)并發(fā)執(zhí)行不易于分析任務(wù)錯(cuò)誤原因;
四、模塊集成開發(fā)說明1、dbswitch安裝到本地倉庫cd dbswitch && mvn clean install2、pom.xml中引入dbswitch模塊依賴<dependency>
<groupId>com.gitee.dbswitch</groupId>
<artifactId>dbswitch-data</artifactId>
<version>${dbswitch.version}</version>
</dependency>3、代碼集成開發(fā)// 構(gòu)造dbswitch所需的配置參數(shù),參數(shù)說明請參考第三章第1小節(jié)
DbswichProperties properties = new DbswichProperties();
properties.setXXXX();
// 將參數(shù)傳遞給dbswitch啟動(dòng)同步方式執(zhí)行
MigrationService service = new MigrationService(properties);
service.run();五、常見問題解決(1)在Windows下,執(zhí)行startup.cmd或datasync.cmd腳本報(bào)錯(cuò)
解決辦法:將腳本的內(nèi)容**后,刪除原腳本文件,第二再創(chuàng)建一個(gè)同名腳本文件后,將原內(nèi)容粘貼進(jìn)去后,再執(zhí)行腳本。
(2)在Linux下,執(zhí)行startup.sh或datasync.sh腳本報(bào)錯(cuò)
解決辦法:用vi/vim工具打開腳本,第二命令模式下設(shè)置 set ff=unix后,第二保存退出,再執(zhí)行腳本。
最后
就先更到這里了,有需要異構(gòu)數(shù)據(jù)庫遷移同步工具的朋友關(guān)注+轉(zhuǎn)發(fā)+評論之后私信我【異構(gòu)數(shù)據(jù)庫】即可。
拓展知識(shí):
原創(chuàng)文章,作者:九賢生活小編,如若轉(zhuǎn)載,請注明出處:http://xiesong.cn/125540.html