From f0d0905912a55b5a1bb6b4149d963b1fc8a763ef Mon Sep 17 00:00:00 2001 From: travelliu Date: Wed, 8 Jun 2022 14:40:56 +0800 Subject: [PATCH] update(mtk): update mtk config --- .../docs-mtk/v2.0/mtk-oracle-to-openGauss.md | 2 +- product/zh/docs-mtk/v2.0/mtk-config.md | 2335 +++++++++++++---- product/zh/docs-mtk/v2.0/mtk-db2-to-mysql.md | 2 +- .../v2.0/mtk-informix-to-openGauss.md | 453 ++++ .../docs-mtk/v2.0/mtk-oracle-to-openGauss.md | 2 +- 5 files changed, 2209 insertions(+), 585 deletions(-) create mode 100644 product/zh/docs-mtk/v2.0/mtk-informix-to-openGauss.md diff --git a/product/en/docs-mtk/v2.0/mtk-oracle-to-openGauss.md b/product/en/docs-mtk/v2.0/mtk-oracle-to-openGauss.md index 4db8c66a..63c0479b 100644 --- a/product/en/docs-mtk/v2.0/mtk-oracle-to-openGauss.md +++ b/product/en/docs-mtk/v2.0/mtk-oracle-to-openGauss.md @@ -198,7 +198,7 @@ If the current value is greater than 9223372036854775807, an error will occur. F | INTERVAL YEAR TO MONTH | interval | | IDTS INTERVAL DAY TO SECOND | interval | | LONG | text | -| RAW(111) | bytea | +| RAW(111) | RAW | | LONG RAW | bytea | | CLOB | text/CLOB | | BLOB | bytea/BLOB | diff --git a/product/zh/docs-mtk/v2.0/mtk-config.md b/product/zh/docs-mtk/v2.0/mtk-config.md index 33eaea25..0651783c 100644 --- a/product/zh/docs-mtk/v2.0/mtk-config.md +++ b/product/zh/docs-mtk/v2.0/mtk-config.md @@ -1,66 +1,1145 @@ --- -title: 数据迁移工具 MTK 配置文件说明 -summary: 数据迁移工具 MTK 配置文件说明 -author: Liu Xu -date: 2021-03-04 +title: MTK配置文件说明 +summary: 配置文件说明 +author: mtk +date: 2022-06-08 14:34:38 --- -# MTK配置说明 +# MTK配置文件说明 -MTK配置文件主要包含以下内容 +## Config + +Config MTK迁移配置文件. + +| Field | Type | Description | +|-------|------|-------------| +| source |Option |源数据库配置信息. | +| target |Option |目标数据库配置信息. | +| limit |Limit |迁移并发配置. | +| object |Object |迁移对象配置. | +| dataOnly |bool |是否只迁移数据. | +| schemaOnly |bool |是否只迁移数据结构. | +| disableTableDataComp |bool |当数据迁移完成后,MTK会统计两边的行数进行对比. | +| disableCollStatistics |bool |当数据迁移完成后,MTK会收集目标端统计信息. | +| reportFile |string |迁移报告目录. | +| debug |bool |是否开启日志debug模式. | +| preRun |bool |预运行. | +| test |bool |试迁移. | +| disableIgnoreCase |bool |关闭在源库查询忽略大小写功能. | +| disableSelectPart |bool |关闭分区查询功能. | +| disableFKCons |bool |禁用外键同步. | + +**示例**: + +```json +{ + "source": { + "type": "oracle", + "connect": { + "host": "127.0.0.1", + "user": "system", + "port": 1521, + "password": "******", + "dbName": "orcl" + } + }, + "target": { + "type": "opengauss", + "connect": { + "version": "3.0.0", + "host": "127.0.0.1", + "user": "gaussdb", + "port": 26000, + "password": "******", + "dbName": "postgres" + }, + "parameter": { + "parallelInsert": 1, + "dropExistingObject": false, + "truncTable": false, + "caseSensitive": 0, + "colKeyWords": {}, + "objKeyWords": {}, + "quoteMark": false, + "path": "./data", + "schemaPath": "", + "dataPath": "", + "fileType": "", + "fileSize": "", + "csvHeader": false, + "csvNullValue": "", + "csvFieldDelimiter": ",", + "csvOptionallyEnclosed": "\"", + "excludeSysTable": [], + "remapSchema": {}, + "remapTable": {}, + "remapTablespace": {}, + "enableSyncTabTbsPro": false, + "enableSyncCompTabPro": false, + "timeFormat": "HH:MI:SS", + "dateFormat": "YYYY-MM-DD", + "dateTimeFormat": "YYYY-MM-DD HH24:MI:SS", + "noSupportPartTabToNormalTab": false, + "ignoreDB2PartInclusive": false, + "igNotSupportIntervalPart": false, + "igErrorData": false, + "ignoreTabPartition": false, + "autoAddMaxvaluePart": false, + "autoAddMySQLAutoIncr": false, + "autoAddMySQLAutoIncrTabList": null, + "ignoreNotSupportDefault": false, + "replaceZeroDate": "", + "virtualColToNormalCol": false, + "virtualColConv": {}, + "mySQLSkipErrorDateTimeData": false, + "ignoreTableDDLCompErr": false, + "convertPackageMethod": "", + "enableOgBlobClob": false, + "enableConvertSrid": false, + "defaultSrid": "4326", + "seqLastNumAddNum": 0, + "skipColumnType": {}, + "skipColumnName": {}, + "templateSeqName": "", + "charAppendEmptyString": false, + "tableOptions": null, + "indexOptions": null + } + }, + "limit": { + "parallel": 2, + "fetchSize": 1000, + "batchSize": 1000, + "bufferSize": 8, + "cpBufferSize": 8, + "oracleSelectParallel": 2, + "channelCacheNum": 10000, + "limit": 0 + }, + "object": { + "tables": [ + "MTK.TAB1", + "MTK.TAB111%", + "MTK1.*" + ], + "schemas": [ + "SCHEMA1", + "SCHEMA2" + ], + "excludeTable": { + "SCHEMA1": [ + "TABLE_SKIP1", + "TABLE_SKIP1" + ], + "SCHEMA2": [ + "TABLE_SKIP1", + "TABLE_SKIP1" + ] + }, + "tableSplit": { + "SCHEMA1": { + "TAB_1": [ + "ID \u003c 10000 ", + "ID \u003c 20000 AND ID \u003e=10000", + "ID \u003e= 90000" + ], + "TAB_2": [ + "ID \u003c 10000 ", + "ID \u003c 20000 AND ID \u003e=10000", + "ID \u003e= 90000" + ] + }, + "SCHEMA2": { + "TAB_1": [ + "ID \u003c 10000 ", + "ID \u003c 20000 AND ID \u003e=10000", + "ID \u003e= 90000" + ], + "TAB_2": [ + "ID \u003c 10000 ", + "ID \u003c 20000 AND ID \u003e=10000", + "ID \u003e= 90000" + ] + } + } + }, + "dataOnly": false, + "schemaOnly": false, + "disableTableDataComp": false, + "disableCollStatistics": false, + "reportFile": "./report/", + "debug": false, + "preRun": false, + "test": false, + "disableIgnoreCase": false, + "disableSelectPart": false, + "disableFKCons": false +} +``` + +### source + +**类型**: Option + +**描述**: 源数据库配置信息. + +**示例**: + +source database config example + +```json +{ + "source": { + "type": "oracle", + "connect": { + "host": "127.0.0.1", + "user": "system", + "port": 1521, + "password": "******", + "dbName": "orcl" + } + } +} +``` + +### target + +**类型**: Option + +**描述**: 目标数据库配置信息. + +**示例**: + +target database config example + +```json +{ + "target": { + "type": "opengauss", + "connect": { + "version": "3.0.0", + "host": "127.0.0.1", + "user": "gaussdb", + "port": 26000, + "password": "******", + "dbName": "postgres" + }, + "parameter": { + "parallelInsert": 1, + "dropExistingObject": false, + "truncTable": false, + "caseSensitive": 0, + "colKeyWords": {}, + "objKeyWords": {}, + "quoteMark": false, + "path": "./data", + "schemaPath": "", + "dataPath": "", + "fileType": "", + "fileSize": "", + "csvHeader": false, + "csvNullValue": "", + "csvFieldDelimiter": ",", + "csvOptionallyEnclosed": "\"", + "excludeSysTable": [], + "remapSchema": {}, + "remapTable": {}, + "remapTablespace": {}, + "enableSyncTabTbsPro": false, + "enableSyncCompTabPro": false, + "timeFormat": "HH:MI:SS", + "dateFormat": "YYYY-MM-DD", + "dateTimeFormat": "YYYY-MM-DD HH24:MI:SS", + "noSupportPartTabToNormalTab": false, + "ignoreDB2PartInclusive": false, + "igNotSupportIntervalPart": false, + "igErrorData": false, + "ignoreTabPartition": false, + "autoAddMaxvaluePart": false, + "autoAddMySQLAutoIncr": false, + "autoAddMySQLAutoIncrTabList": null, + "ignoreNotSupportDefault": false, + "replaceZeroDate": "", + "virtualColToNormalCol": false, + "virtualColConv": {}, + "mySQLSkipErrorDateTimeData": false, + "ignoreTableDDLCompErr": false, + "convertPackageMethod": "", + "enableOgBlobClob": false, + "enableConvertSrid": false, + "defaultSrid": "4326", + "seqLastNumAddNum": 0, + "skipColumnType": {}, + "skipColumnName": {}, + "templateSeqName": "", + "charAppendEmptyString": false, + "tableOptions": null, + "indexOptions": null + } + } +} +``` + +### limit + +**类型**: Limit + +**描述**: 迁移并发配置. + +**示例**: + +limit example + +```json +{ + "limit": { + "parallel": 2, + "fetchSize": 1000, + "batchSize": 1000, + "bufferSize": 8, + "cpBufferSize": 8, + "oracleSelectParallel": 2, + "channelCacheNum": 10000, + "limit": 0 + } +} +``` + +### object + +**类型**: Object + +**描述**: 迁移对象配置. + +**示例**: + +object example + +```json +{ + "object": { + "tables": [ + "MTK.TAB1", + "MTK.TAB111%", + "MTK1.*" + ], + "schemas": [ + "SCHEMA1", + "SCHEMA2" + ], + "excludeTable": { + "SCHEMA1": [ + "TABLE_SKIP1", + "TABLE_SKIP1" + ], + "SCHEMA2": [ + "TABLE_SKIP1", + "TABLE_SKIP1" + ] + }, + "tableSplit": { + "SCHEMA1": { + "TAB_1": [ + "ID \u003c 10000 ", + "ID \u003c 20000 AND ID \u003e=10000", + "ID \u003e= 90000" + ], + "TAB_2": [ + "ID \u003c 10000 ", + "ID \u003c 20000 AND ID \u003e=10000", + "ID \u003e= 90000" + ] + }, + "SCHEMA2": { + "TAB_1": [ + "ID \u003c 10000 ", + "ID \u003c 20000 AND ID \u003e=10000", + "ID \u003e= 90000" + ], + "TAB_2": [ + "ID \u003c 10000 ", + "ID \u003c 20000 AND ID \u003e=10000", + "ID \u003e= 90000" + ] + } + } + } +} +``` + +### dataOnly + +**类型**: bool + +**描述**: 是否只迁移数据. + +**默认值**: `false` + +**可选值**: + +- true +- false + +### schemaOnly + +**类型**: bool + +**描述**: 是否只迁移数据结构. + +**默认值**: `false` + +**可选值**: + +- true +- false + +### disableTableDataComp + +**类型**: bool + +**描述**: 当数据迁移完成后,MTK会统计两边的行数进行对比. +此参数可以禁用表数据select对比 + +**默认值**: `false` + +**可选值**: + +- true +- false + +### disableCollStatistics + +**类型**: bool + +**描述**: 当数据迁移完成后,MTK会收集目标端统计信息. +此参数可以禁用收集统计信息 + +**默认值**: `false` + +**可选值**: + +- true +- false + +### reportFile + +**类型**: string + +**描述**: 迁移报告目录. +v0.0.18之前为单个html报告 +v0.0.18后是一个目录 + +### debug + +**类型**: bool + +**描述**: 是否开启日志debug模式. + +**默认值**: `false` + +**可选值**: + +- true +- false + +### preRun + +**类型**: bool + +**描述**: 预运行. + +**默认值**: `false` + +**可选值**: + +- true +- false + +### test + +**类型**: bool + +**描述**: 试迁移. +迁移参数`limit.limit`行数据. 此模式下数据不就行提交,会自动回退数据. +只是测试是否正常插入数据 + +**默认值**: `false` + +**可选值**: + +- true +- false + +### disableIgnoreCase + +**类型**: bool + +**描述**: 关闭在源库查询忽略大小写功能. + +**默认值**: `false` + +**可选值**: + +- true +- false + +### disableSelectPart + +**类型**: bool + +**描述**: 关闭分区查询功能. + +**默认值**: `false` + +**可选值**: + +- true +- false + +### disableFKCons + +**类型**: bool + +**描述**: 禁用外键同步. + +**默认值**: `false` + +**可选值**: + +- true +- false + +## Object + +Object 迁移对象 +迁移对象定义 + +- 注意区分大小写 +- 迁移用户、database、schema, +- schema = mysql database +- schema = oracle user +- schema = postgres schema +- schema = db2 schema + +> schemas和tables参数互斥 +> 如果两个参数都填入了值,在执行MTK时会遇到“mtk-1002 schema and table cannot exist together”错误 +> +> 没有定义迁移对象,则会报错 "not define Migrate object" + +| Field | Type | Description | +|-------|------|-------------| +| tables |[]string |定义要迁移的表. | +| schemas |[]string | | +| excludeTable |map[string][]string |定义排除哪些表. | +| tableSplit |map[string]map[string][]string |定义表粒度并行. | + +Appears in: + +- Config.object + +**示例**: + +object example + +```json +{ + "tables": [ + "MTK.TAB1", + "MTK.TAB111%", + "MTK1.*" + ], + "schemas": [ + "SCHEMA1", + "SCHEMA2" + ], + "excludeTable": { + "SCHEMA1": [ + "TABLE_SKIP1", + "TABLE_SKIP1" + ], + "SCHEMA2": [ + "TABLE_SKIP1", + "TABLE_SKIP1" + ] + }, + "tableSplit": { + "SCHEMA1": { + "TAB_1": [ + "ID \u003c 10000 ", + "ID \u003c 20000 AND ID \u003e=10000", + "ID \u003e= 90000" + ], + "TAB_2": [ + "ID \u003c 10000 ", + "ID \u003c 20000 AND ID \u003e=10000", + "ID \u003e= 90000" + ] + }, + "SCHEMA2": { + "TAB_1": [ + "ID \u003c 10000 ", + "ID \u003c 20000 AND ID \u003e=10000", + "ID \u003e= 90000" + ], + "TAB_2": [ + "ID \u003c 10000 ", + "ID \u003c 20000 AND ID \u003e=10000", + "ID \u003e= 90000" + ] + } + } +} +``` + +### tables + +**类型**: []string + +**描述**: 定义要迁移的表. + +当运行子命令迁移时,如 sync-function 并且配置了tables( MTK.XXX ) 就是迁移 Schema MTK下的 XXX 函数. 序列除外. + +**可选值**: + +- 完整表名 +- 支持schema.* +- 支持schema.TAB% + +**示例**: + +tables example + +```json +{ + "tables": [ + "MTK.TAB1", + "MTK.TAB111%", + "MTK1.*" + ] +} +``` + +### schemas + +**类型**: []string + +**描述**: + +**示例**: + +schema example + +```json +{ + "schemas": [ + "SCHEMA1", + "SCHEMA2" + ] +} +``` + +### excludeTable + +**类型**: map[string][]string + +**描述**: 定义排除哪些表. + +**示例**: + +exclude Table example + +```json +{ + "excludeTable": { + "SCHEMA1": [ + "TABLE_SKIP1", + "TABLE_SKIP1" + ], + "SCHEMA2": [ + "TABLE_SKIP1", + "TABLE_SKIP1" + ] + } +} +``` + +### tableSplit + +**类型**: map[string]map[string][]string + +**描述**: 定义表粒度并行. +可使用[mtk show-table-split](mtk_show-table-split)自动生成 +定义表迁移查询条件 + +**示例**: + +tableSplit example + +```json +{ + "tableSplit": { + "SCHEMA1": { + "TAB_1": [ + "ID \u003c 10000 ", + "ID \u003c 20000 AND ID \u003e=10000", + "ID \u003e= 90000" + ], + "TAB_2": [ + "ID \u003c 10000 ", + "ID \u003c 20000 AND ID \u003e=10000", + "ID \u003e= 90000" + ] + }, + "SCHEMA2": { + "TAB_1": [ + "ID \u003c 10000 ", + "ID \u003c 20000 AND ID \u003e=10000", + "ID \u003e= 90000" + ], + "TAB_2": [ + "ID \u003c 10000 ", + "ID \u003c 20000 AND ID \u003e=10000", + "ID \u003e= 90000" + ] + } + } +} +``` + +## Limit + +Limit 并发配置 + +| Field | Type | Description | +|-------|------|-------------| +| parallel |int |并行度. | +| fetchSize |int |指定一次行提取行数大小. | +| batchSize |int |指定批量插入或Copy条数大小. | +| bufferSize |int |指定查询或者批量插入时缓存大小. | +| cpBufferSize |int |定义Copy命令中使用的缓存大小(以MB为单位). | +| oracleSelectParallel |int |Oracle查询语句中增加hint `/* +parallel(t,n) */` | +| limit |int64 |定义每张表迁移多少行. | + +Appears in: + +- Config.limit + +**示例**: + +limit example + +```json +{ + "parallel": 2, + "fetchSize": 1000, + "batchSize": 1000, + "bufferSize": 8, + "cpBufferSize": 8, + "oracleSelectParallel": 2, + "channelCacheNum": 10000, + "limit": 0 +} +``` + +### parallel + +**类型**: int + +**描述**: 并行度. + +迁移数据时执行数据加载的作业(线程)数目. + +**默认值**: 1 + +### fetchSize + +**类型**: int + +**描述**: 指定一次行提取行数大小. + +有效值为 1-50000 + +支持 Oracle. + +**默认值**: 1000 + +### batchSize + +**类型**: int + +**描述**: 指定批量插入或Copy条数大小. + +有效值为 1-50000 +支持Oracle、Postgres、openGauss、Mysql. + +**默认值**: 1000 + +### bufferSize + +**类型**: int + +**描述**: 指定查询或者批量插入时缓存大小. + +有效值为 1-50000 + +支持Oracle、Postgres、openGauss、Mysql. + +**默认值**: 1000 + +### cpBufferSize + +**类型**: int + +**描述**: 定义Copy命令中使用的缓存大小(以MB为单位). + +有效值为1-1024 + +支持 Postgres、openGauss. + +**默认值**: 8 MB + +### oracleSelectParallel + +**类型**: int + +**描述**: Oracle查询语句中增加hint `/* +parallel(t,n) */` + +### limit + +**类型**: int64 + +**描述**: 定义每张表迁移多少行. +定义此参数不再进行表并发迁移. + +## Connect + +Connect 数据库连接信息 + +| Field | Type | Description | +|-------|------|-------------| +| version |string |数据库版本. | +| vendor |string |数据库发行厂家. | +| host |string |数据库主机 | +| user |string |数据库用户 | +| port |int |数据库端口 | +| password |Password |数据库用户密码 | +| dbName |string |数据库名称 | +| dsn |string |用户指定连接字符串. | +| timeout |Duration |连接超时时间. | +| charset |string |数据库字符集. | +| datCompatibility |string |针对openGauss 数据库兼容模式. | +| sqlMode |string |针对 MySQL 数据库 `sql_mode`. | +| clientCharset |string |针对数据库编码转换场景使用,一般情况下不需要设置. | + +Appears in: + +- Option.connect + +### version + +**类型**: string + +**描述**: 数据库版本. + +无需指定. 连接数据库时自动查询 + +迁移成文件是需要手工指定版本 + +**示例**: + +version example + +```json +{ + "version": "2.1.0" +} +``` + +### vendor + +**类型**: string + +**描述**: 数据库发行厂家. + +无需指定. 连接数据库时自动查询 + +**示例**: + +vendor example + +```json +{ + "vendor": "MySQL" +} +``` + +### host + +**类型**: string + +**描述**: 数据库主机 + +**可选值**: + +- ip +- 域名 + +**示例**: + +host example + +```json +{ + "host": "127.0.0.1" +} +``` + +### user + +**类型**: string + +**描述**: 数据库用户 + +**示例**: + +host example + +```json +{ + "user": "system" +} +``` + +### port + +**类型**: int + +**描述**: 数据库端口 + +**示例**: + +port example + +```json +{ + "port": 1521 +} +``` + +### password + +**类型**: Password + +**描述**: 数据库用户密码 + +### dbName + +**类型**: string + +**描述**: 数据库名称 + +**示例**: + +dbName example ```json { - "source": { - }, - "target": { - }, - "limit": { - }, - "object": { - }, - "dataOnly": false, - "schemaOnly": false, - "reportFile": "./mtk_report", - "debug": false + "dbName": "orcl" +} +``` + +### dsn + +**类型**: string + +**描述**: 用户指定连接字符串. + +默认情况下无需指定.针对特殊场景预留功能 + +### timeout + +**类型**: Duration + +**描述**: 连接超时时间. + +无需配置 + +**默认值**: 30s + +### charset + +**类型**: string + +**描述**: 数据库字符集. + +默认不用配置,连接数据库查询 + +**可选值**: + +- gbk +- utf8 + +**示例**: + +charset example + +```json +{ + "charset": "gbk" +} +``` + +### datCompatibility + +**类型**: string + +**描述**: 针对openGauss 数据库兼容模式. + +默认不用配置,连接数据库查询. + +迁移成文件需要配置 + +**可选值**: + +- A +- B +- PG + +**示例**: + +charset example + +```json +{ + "datCompatibility": "A" } ``` -- source [数据库配置信息](#数据库配置参数) -- target [数据库配置信息](#数据库配置参数) -- limit [并发配置](#limit) -- object [对象定义](#object) -- dataOnly [是否只迁移数据](#dataOnly) -- schemaOnly [是否只迁移数据结构](#schemaOnly) -- disableTableDataComp [禁用表数据select对比](#disableTableDataComp) -- disableCollStatistics [禁用收集统计信息](#disableCollStatistics) -- reportFile [迁移报告目录](#reportFile) -- debug [debug](#debug) +### sqlMode + +**类型**: string + +**描述**: 针对 MySQL 数据库 `sql_mode`. + +默认不用配置,连接数据库查询. + +迁移成文件需要配置 + +### clientCharset + +**类型**: string + +**描述**: 针对数据库编码转换场景使用,一般情况下不需要设置. + +如Oracle ZHS16GBK编码迁移到openGauss UTF8. 遇到`ORA-29275: partial multibyte character`. + +## Option + +Option 数据库配置 + +| Field | Type | Description | +|-------|------|-------------| +| type |string |数据库类型,不区分大小写 | +| connect |Connect |数据库连接信息 | +| parameter |Parameter |参数配置 | + +Appears in: + +- Config.source +- Config.target + +**示例**: -## 数据库配置参数 +source database config example ```json { "type": "oracle", "connect": { - "host": "127.0.0.1", - "user": "system", - "port": 1521, - "password": "oracle", - "dbName": "orcl" + "host": "127.0.0.1", + "user": "system", + "port": 1521, + "password": "******", + "dbName": "orcl" + } +} +``` + +target database config example + +```json +{ + "type": "opengauss", + "connect": { + "version": "3.0.0", + "host": "127.0.0.1", + "user": "gaussdb", + "port": 26000, + "password": "******", + "dbName": "postgres" }, "parameter": { + "parallelInsert": 1, + "dropExistingObject": false, + "truncTable": false, + "caseSensitive": 0, + "colKeyWords": {}, + "objKeyWords": {}, + "quoteMark": false, + "path": "./data", + "schemaPath": "", + "dataPath": "", + "fileType": "", + "fileSize": "", + "csvHeader": false, + "csvNullValue": "", + "csvFieldDelimiter": ",", + "csvOptionallyEnclosed": "\"", + "excludeSysTable": [], + "remapSchema": {}, + "remapTable": {}, + "remapTablespace": {}, + "enableSyncTabTbsPro": false, + "enableSyncCompTabPro": false, + "timeFormat": "HH:MI:SS", + "dateFormat": "YYYY-MM-DD", + "dateTimeFormat": "YYYY-MM-DD HH24:MI:SS", + "noSupportPartTabToNormalTab": false, + "ignoreDB2PartInclusive": false, + "igNotSupportIntervalPart": false, + "igErrorData": false, + "ignoreTabPartition": false, + "autoAddMaxvaluePart": false, + "autoAddMySQLAutoIncr": false, + "autoAddMySQLAutoIncrTabList": null, + "ignoreNotSupportDefault": false, + "replaceZeroDate": "", + "virtualColToNormalCol": false, + "virtualColConv": {}, + "mySQLSkipErrorDateTimeData": false, + "ignoreTableDDLCompErr": false, + "convertPackageMethod": "", + "enableOgBlobClob": false, + "enableConvertSrid": false, + "defaultSrid": "4326", + "seqLastNumAddNum": 0, + "skipColumnType": {}, + "skipColumnName": {}, + "templateSeqName": "", + "charAppendEmptyString": false, + "tableOptions": null, + "indexOptions": null } } ``` -- type [数据库类型](#type) -- connect [连接信息](#connect) -- parameter [参数](##parameter) - ### type -数据库类型,不区分大小写。支持: +**类型**: string + +**描述**: 数据库类型,不区分大小写 + +**可选值**: - MySQL - Oracle @@ -69,57 +1148,226 @@ MTK配置文件主要包含以下内容 - MogDB - DB2 - sqlServer -- file 只在target下使用,导出成文件 +- file +- informix -### connect +**示例**: + +type example ```json { - "host": "127.0.0.1", - "user": "system", - "port": 1521, - "password": "oracle", - "dbName": "orcl", - "clientCharset":"" + "type": "Oracle" } ``` -| 参数名称 | 参数说明 | -| :------------ | :-------------------------------------- | -| version | 数据库版本,无需指定。连接数据库时自动查询 | -| host | 数据库主机。支持ip、主机名、域名 | -| user | 数据库用户,必须具有查询数据字典和数据权限 | -| port | 数据库端口号 | -| password | 数据库用户密码 | -| dbName | 数据库名称 | -| dsn | 数据库完整连接字符串,特定场景使用 | +### connect + +**类型**: Connect -### clientCharset +**描述**: 数据库连接信息 -string +### parameter + +**类型**: Parameter + +**描述**: 参数配置 + +## Parameter + +Parameter 参数配置 + +| Field | Type | Description | +|-------|------|-------------| +| enableTableParallelQuery |int |查询表信息的方式. | +| parallelInsert |int |并行插入并行度. | +| dropExistingObject |bool |若对象已存在于目标数据库中,则删除此对象. | +| truncTable |bool |当只迁移数据时,防止数据冲突使用. | +| caseSensitive |int |针对生成的对象名进行大小写转换. | +| colKeyWords |map[string]int |列名关键字。 | +| objKeyWords |map[string]int |预留对象关键字。 | +| quoteMark |bool |针对生成的对象名是否进行双引号或者反引号包含. | +| path |string |数据导出为文件时,指定导出目录. | +| schemaPath |string |sql脚本目录 | +| fileType |string |数据导出为文件时,文件类型 | +| fileSize |string |数据导出为文件时,单个文件大小。不指定则不限制. | +| sqlDBType |string |数据导出为文件时,指定生成那种数据库的语法. | +| csvHeader |bool |导出文件为csv时,指定是否包含csv文件头。默认不导出。 | +| csvNullValue |string |csv空值展示 | +| csvFieldDelimiter |string |csv默认间隔符。 | +| csvOptionallyEnclosed |string |数据包裹符。 | +| excludeSysTable |[]string |排除系统对象定义。不配置则使用默认值 | +| remapSchema |map[string]string |迁移过程中是否对数据库schema进行改名操作。 | +| remapTable |map[string]string |迁移过程中是否对表名进行改名操作 | +| remapTablespace |map[string]string |迁移过程中是否对表空间名进行改名操作。 | +| enableSyncTabTbsPro |bool |是否配置生成DDL包含表空间语法。 默认不生成 | +| enableSyncCompTabPro |bool |是否配置生成DDL包含表压缩属性语法。 默认不生成。 | +| timeFormat |string |定义时间格式 | +| dateFormat |string |定义日期格式 | +| dateTimeFormat |string |定义时间完整格式 | +| noSupportPartTabToNormalTab |bool |把目标端不支持的分区表转换普通表 | +| ignoreDB2PartInclusive |bool |是否忽略DB2分区键值ENDING的包含属性 | +| igNotSupportIntervalPart |bool |支持忽略部分不支持的`interval分`区属性 | +| igErrorData |bool |忽略插入失败的数据并记录到文件`interval分`区属性 | +| ignoreTabPartition |bool |支持迁移到目标端数据库忽略分区语法, 现在只支持迁移到MySQL. | +| autoAddMaxvaluePart |bool |参数`autoAddMaxvaluePart`允许不存在`maxvalue`分区的分区表自动添加`maxvalue`分区. | +| autoAddMySQLAutoIncr |bool |迁移到MySQL自动添加MySQL `AUTO_INCREMENT` 列 | +| autoAddMySQLAutoIncrTabList |[]string |配合`autoAddMySQLAutoIncr`参数使用. | +| ignoreNotSupportDefault |bool |支持忽略部分不支持列默认值.如Oracle的`sys_guid`。MTK会内嵌白名单进行忽略 | +| replaceZeroDate |string |openGauss不支持时间格式为0000-00-00格式,默认替换为1970-01-01,此参数可以定义默认替换的值,如2021-01-01 | +| virtualColToNormalCol |bool |是否把源库虚拟列转成目标库的正常列。 | +| virtualColConv |map[string]string |虚拟列表达转换功能 | +| mySQLToOgCharExpression |string |mysql 迁移到 openGauss 针对 char/varchar列进行计算列长表达式. 默认不计算 如 `* 3` 表示原来到长度`*3` | +| mySQLSkipErrorDateTimeData |bool |自动跳过mysql错误时间。 | +| ignoreTableDDLCompErr |bool |是否忽略表结构对比错误 | +| convertPackageMethod |string |迁移 Oracle Package 到 openGauss/MogDB 的方式 | +| enableOgBlobClob |bool |迁移其他数据库的Blob、Clob为openGauss的Blob、Clob. | +| enableConvertSrid |bool |Enable Convert Srid | +| defaultSrid |string |PostGis Default Srid | +| seqLastNumAddNum |int |同步序录最后值时增加多少. | +| skipColumnType |map[string]int |迁移时跳过某个数据类型列 | +| skipColumnName |map[string]int |迁移时跳过某个列 | +| templateSeqName |string |MySQL 自增列转为序列,序列名的模版 | +| charAppendEmptyString |bool |针对ORA-29275: partial multibyte character 错误. 在oracle查询是拼接字符串 | +| tableOptions |map[string]string |配置在创建表的时候添加表属性选项.暂时只支持openGauss/MogDB. | +| indexOptions |map[string]string |和tableOptions选项配置一样,只针对索引生效. 未完成功能开发. | + +Appears in: + +- Option.parameter + +### enableTableParallelQuery + +**类型**: int + +**描述**: 查询表信息的方式. + +测试特性. 无需修改 + +**可选值**: + +- 0 一次性查询出来,然后并发创建 +- 1 并行查询,先查询表的基本信息,然后并发查询+目标端创建 -`v2.2.2`之后的版本支持本参数。 +### parallelInsert -针对数据库编码转换场景使用,一般情况下不需要设置. -如 Oracle ZHS16GBK 编码迁移到 openGauss UTF8. 遇到`ORA-29275: partial multibyte character` +**类型**: int -### parameter +**描述**: 并行插入并行度. + +测试特性. 无需修改 + +**默认值**: `false` + +**可选值**: + +- true +- false ### dropExistingObject -删除已存在对象,存在一定风险时请手工删除 +**类型**: bool -默认值: `false` +**描述**: 若对象已存在于目标数据库中,则删除此对象. + +一般在数据重新初始化时使用. 请谨慎慎用. + +测试特性. 无需修改 + +**默认值**: `false` + +**可选值**: + +- true +- false ### truncTable -当只迁移数据时,防止数据冲突使用。 +**类型**: bool + +**描述**: 当只迁移数据时,防止数据冲突使用. + +**默认值**: `false` + +**可选值**: + +- true +- false + +### caseSensitive + +**类型**: int + +**描述**: 针对生成的对象名进行大小写转换. + +**默认值**: 0 + +**可选值**: + +- 0 即不进行处理 +- 1 代表小写 +- 2 代表大写 +- 其他为保持不变 + +### colKeyWords + +**类型**: map[string]int + +**描述**: 列名关键字。 + +在目标端创建时会自动增加""或并将关键字进行大小写转换 + +**可选值**: + +- 1 代表小写 +- 2 代表大写 +- 其他为保持不变 + +**示例**: + +Column KeyWords example + +```json +{ + "colKeyWords": { + "STREAM": 1, + "TID": 1 + } +} +``` + +### objKeyWords + +**类型**: map[string]int + +**描述**: 预留对象关键字。 + +在目标端创建时会自动增加""或并将关键字进行大小写转换 + +**可选值**: + +- 1 代表小写 +- 2 代表大写 +- 其他为保持不变 + +**示例**: + +Column KeyWords example -默认值: `true` +```json +{ + "objKeyWords": { + "STREAM": 1, + "TID": 1 + } +} +``` ### quoteMark -针对SQL语句中对象名是否使用双引号或反引号包含. +**类型**: bool + +**描述**: 针对生成的对象名是否进行双引号或者反引号包含. ```sql -- MySQl @@ -128,27 +1376,23 @@ MTK配置文件主要包含以下内容 "a1" ``` -默认值: `false` - -Example: - ```sql -- quoteMark: false CREATE TABLE mtk.t_pri ( -id DECIMAL(38) NOT NULL, -id2 DECIMAL(38) NOT NULL, -id3 DECIMAL(38), -id4 DECIMAL(38), -id5 DECIMAL(38) + id DECIMAL(38) NOT NULL, + id2 DECIMAL(38) NOT NULL, + id3 DECIMAL(38), + id4 DECIMAL(38), + id5 DECIMAL(38) ); -- quoteMark: true CREATE TABLE "mtk"."t_pri" ( -"id" DECIMAL(38) NOT NULL, -"id2" DECIMAL(38) NOT NULL, -"id3" DECIMAL(38), -"id4" DECIMAL(38), -"id5" DECIMAL(38) + "id" DECIMAL(38) NOT NULL, + "id2" DECIMAL(38) NOT NULL, + "id3" DECIMAL(38), + "id4" DECIMAL(38), + "id5" DECIMAL(38) ); ``` @@ -164,79 +1408,50 @@ CREATE TABLE "mtk"."t_pri" ( |true |1|创建语句带双引号或反引号,
对象名全部转为小写| |true |2|创建语句带双引号或反引号,
对象名全部转为大写| -### caseSensitive - -针对生成的对象名进行大小写转换。 - -- 0 即不进行处理 -- 1 代表小写 -- 2 代表大写 -- 其他为保持不变 - -### colKeyWords +**默认值**: `false` -列名关键字。 +**可选值**: -在目标端创建时会自动增加""或``并将关键字进行大小写转换 +- true +- false -格式 列名: 大小写标识. +### path -- 1 代表小写 -- 2 代表大写 -- 其他为保持不变 +**类型**: string -```json -"colKeyWords": { - "STREAM": 1, - "TID": 1 -} -``` +**描述**: 数据导出为文件时,指定导出目录. -### objKeyWords +在进行数据迁移时,遇到错误数据会记录到这个目录下到`err_data_`目录下 -预留对象关键字。 +**默认值**: `./data` -在目标端创建时会自动增加""或\`\`并将关键字进行大小写转换 +**可选值**: -格式列名: 大小写标识。1代表小写,2代表大写,其他为保持不变 +- true +- false -```json -"objKeyWords": { - "STREAM": 1, - "TID": 1 -} -``` +### schemaPath -### path +**类型**: string -数据导出为文件时,指定导出目录 +**描述**: sql脚本目录 -```json -{ - "type": "file", - "parameter": { - "fileType": "csv", - "path": "./data", - "fileSize": "5000MiB", - "sqlDBType": "opengauss", - "csvHeader": true, - "csvFieldDelimiter": ",", - "csvOptionallyEnclosed": "\"", - } -} +### fileType -``` +**类型**: string -### fileType +**描述**: 数据导出为文件时,文件类型 -数据导出为文件时,文件类型。支持: +**可选值**: - csv - sql ### fileSize -数据导出为文件时,单个文件大小。不指定则不限制 +**类型**: string + +**描述**: 数据导出为文件时,单个文件大小。不指定则不限制. 支持以下格式: @@ -251,176 +1466,208 @@ CREATE TABLE "mtk"."t_pri" ( - TB - PB -KB == 1000 +KB == 1000 KiB == 1024 +**示例**: + +fileSize example + +```json +{ + "fileSize": "2048MiB" +} +``` + ### sqlDBType -数据导出为文件时,指定生成那种数据库的语法。 +**类型**: string + +**描述**: 数据导出为文件时,指定生成那种数据库的语法. 如从Oracle迁移到MySQL,默认生成MySQL的插入数据语法 ### csvHeader -导出文件为csv时,指定是否包含csv文件头。默认不导出。 +**类型**: bool -默认值: `false` +**描述**: 导出文件为csv时,指定是否包含csv文件头。默认不导出。 -### csvFieldDelimiter +**默认值**: `false` -csv默认间隔符。 +### csvNullValue -默认值: `,` +**类型**: string -### csvOptionallyEnclosed +**描述**: csv空值展示 -数据包裹符。 +### csvFieldDelimiter -默认值: `"` +**类型**: string -### parallelInsert +**描述**: csv默认间隔符。 -并行插入度。测试特性,无需配置 +**默认值**: `,` -### timeFormat +### csvOptionallyEnclosed -定义时间格式 +**类型**: string -默认值: `HH:MI:SS` +**描述**: 数据包裹符。 -### dateFormat +**默认值**: `"` -定义日期格式 +### excludeSysTable -默认值: `YYYY-MM-DD` +**类型**: []string -### dateTimeFormat +**描述**: 排除系统对象定义。不配置则使用默认值 -定义时间完整格式 +**示例**: -默认值: `YYYY-MM-DD HH24:MI:SS` +DB2 Exclude System Table example -### noSupportPartTabToNormalTab +```json +{ + "excludeSysTable": [ + "EXPLAIN_ACTUALS", + "ADVISE_TABLE", + "ADVISE_PARTITION", + "ADVISE_MQT", + "ADVISE_WORKLOAD", + "ADVISE_INDEX", + "ADVISE_INSTANCE", + "OBJECT_METRICS", + "EXPLAIN_DIAGNOSTIC_DATA", + "EXPLAIN_DIAGNOSTIC", + "EXPLAIN_STREAM", + "EXPLAIN_PREDICATE", + "EXPLAIN_OPERATOR", + "EXPLAIN_OBJECT", + "EXPLAIN_ARGUMENT", + "EXPLAIN_STATEMENT", + "EXPLAIN_INSTANCE" + ] +} +``` -- 是否把目标端不支持的分区表转换普通表 -- 是否把目标端不支持的子分区表属性自动移除 +### remapSchema -Oracle的List分区和Hash分区表在MogDB里为普通表。 +**类型**: map[string]string -Oracle的Range List复合分区表在MogDB里为Range分区表,子分区表自动移除 +**描述**: 迁移过程中是否对数据库schema进行改名操作。 -### mySQLToOgCharExpression +格式为 原方案名:新方案名 -会自动把MySQL原数据库长度*3。 这个参数只针对于源数据库为mysql字段类型为varchar/char -已不再支持。 +如 MTK1更名为 MTK1_NEW, SOE更名为 SOE_NEW -### mySQLSkipErrorDateTimeData +**示例**: -自动跳过mysql错误时间。 +remap schema examples -如 datetime 类型里 `0000-00-00 13:14:15` +```json +{ + "remapSchema": { + "MTK1": "MTK1_NEW", + "SOE": "SOE_NEW" + } +} +``` -### autoAddMySQLAutoIncr +### remapTable -Supported after `v2.1.0` version +**类型**: map[string]string -迁移到MySQL自动添加MySQL `AUTO_INCREMENT` 列. +**描述**: 迁移过程中是否对表名进行改名操作 -参数为`true`,当原表不存在自增主键列,自动增加`AUTO_INCREMENT`列,并把原来当主键改为唯一键. +**Deprecated**: 已不再支持 -```sql -PK_ID BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL [INVISIBLE] -``` +### remapTablespace -- MySQl 8.0.23 之前为 `visible` -- MySQl 8.0.23 为 `invisible column` +**类型**: map[string]string -> MySQL supports invisible columns as of MySQL 8.0.23.
-> An invisible column is normally hidden to queries, but can be accessed if explicitly referenced.
-> Prior to MySQL 8.0.23, all columns are visible. +**描述**: 迁移过程中是否对表空间名进行改名操作。 -配合[ignoreTabPartition](#ignoretabpartition)参数使用. +配合[enableSyncTabTbsPro](#enablesynctabtbspro)使用 -默认值: `false` +如 USERSPACE1更名为 TBS01 -示例: +**示例**: -- DB2迁移到MySQL +remap tablespace example - - DB2 +```json +{ + "remapTablespace": { + "USERSPACE1": "TBS01" + } +} +``` - ```sql - CREATE TABLE MTK1.TAB_PK_TEST ( - COL1 VARCHAR(10) NOT NULL, - ID BIGINT NOT NULL, - COL2 VARCHAR(10), - COL3 VARCHAR(10) - ) IN USERSPACE1 ORGANIZE BY ROW - ``` +### enableSyncTabTbsPro - - MySQL +**类型**: bool - ```sql - CREATE TABLE db2_mtk.tab_pk_test ( - -- 自动增加主键列 - pk_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL INVISIBLE, - col1 VARCHAR(10) NOT NULL, - id BIGINT NOT NULL, - col2 VARCHAR(10), - col3 VARCHAR(10), - -- 原主键变为唯一键 - UNIQUE KEY ( col1 ) - ) - ``` +**描述**: 是否配置生成DDL包含表空间语法。 默认不生成 + +**默认值**: `false` -### autoAddMySQLAutoIncrTabList +### enableSyncCompTabPro -[]string +**类型**: bool -Supported after `v2.2.0` version +**描述**: 是否配置生成DDL包含表压缩属性语法。 默认不生成。 -配合`AutoAddMySQLAutoIncr`参数使用. +**默认值**: `false` -配置哪些表自动增加`auto_incr`列,如果表已存在自增列则忽略. 默认为空代表为全部表. +### timeFormat -参数不区分大小写 +**类型**: string -默认值: 空 +**描述**: 定义时间格式 -Examples: +**默认值**: `HH:MI:SS` -```json -"autoAddMySQLAutoIncrTabList":[ - "TABLE_1", - "Schema1.TABLE_1" -] -``` +### dateFormat + +**类型**: string -- "TABLE_1" +**描述**: 定义日期格式 - 允许迁移对象中所有表名为TABLE_1的表添加自增列 +**默认值**: `YYYY-MM-DD` -- "Schema1.TABLE_1" +### dateTimeFormat - 允许迁移对象中Schema1下的TABLE_1的表添加自增列 +**类型**: string -### ignoreTableDDLCompErr +**描述**: 定义时间完整格式 + +**默认值**: `YYYY-MM-DD HH24:MI:SS` + +### noSupportPartTabToNormalTab + +**类型**: bool -表结构对比功能已废弃。 默认值: `false` +**描述**: 把目标端不支持的分区表转换普通表 -是否忽略表结构对比错误 +把目标端不支持的子分区表属性自动移除 + +Oracle的List分区和Hash分区表在MogDB里为普通表。 + +Oracle的Range List复合分区表在MogDB里为Range分区表,子分区表自动移除 ### ignoreDB2PartInclusive -是否忽略DB2分区键值`ENDING`的包含属性 +**类型**: bool -默认值: `false` +**描述**: 是否忽略DB2分区键值ENDING的包含属性 如下面DB2建表语句分区语法中`ENDING`包含属性`INCLUSIVE`定义则此分区包含`20180101`数据 + 但是在openGauss数据库中范围分区不支持包含属性只能`less than` -这种情况下会遇到报错`the part DATAMIN is included high value for db2 inclusive option` -可以配置此参数忽略上面错误 + +这种情况下会遇到报错 `the part DATAMIN is included high value for db2 inclusive option` 可以配置此参数忽略上面错误 ```sql CREATE TABLE MTK1.TABLE_TEST_HAOTD @@ -431,30 +1678,36 @@ CREATE TABLE MTK1.TABLE_TEST_HAOTD ) PARTITION BY RANGE(DATADATE) ( PART "DATAMIN" STARTING(MINVALUE) ENDING('20180101') INCLUSIVE , PART "P20180101" STARTING('20180101') ENDING('20180102') INCLUSIVE -); +) ``` -### ignoreNotSupportDefault +**默认值**: `false` + +### igNotSupportIntervalPart -支持忽略部分不支持列默认值.如Oracle的`sys_guid`。MTK会内嵌白名单进行忽略 +**类型**: bool -默认值: `false` +**描述**: 支持忽略部分不支持的`interval分`区属性 -### igNotSupportIntervalPart +**默认值**: `false` -支持忽略部分不支持的interval分区属性 +### igErrorData + +**类型**: bool -默认值: `false` +**描述**: 忽略插入失败的数据并记录到文件`interval分`区属性 + +**默认值**: `false` ### ignoreTabPartition -支持迁移到目标端数据库忽略分区语法,现在只支持迁移到MySQL。 +**类型**: bool -默认值: `false` +**描述**: 支持迁移到目标端数据库忽略分区语法, 现在只支持迁移到MySQL. 如Oracle分区表迁移到MySQL变成非分区表 -Oracle: +Oracle ```sql CREATE TABLE "MTK"."TAB_PART_LIST" ( @@ -462,7 +1715,7 @@ CREATE TABLE "MTK"."TAB_PART_LIST" ( "DEPTNAME" VARCHAR2(20 BYTE), "QUARTERLY_SALES" NUMBER(10,2), "STATE" VARCHAR2(2 BYTE) -)PARTITION BY LIST ("STATE") +) PARTITION BY LIST ("STATE") ( PARTITION "Q1_NORTHWEST" VALUES ('OR', 'WA') TABLESPACE "USERS", PARTITION "Q1_SOUTHWEST" VALUES ('AZ', 'CA', 'NM') TABLESPACE "USERS", @@ -473,7 +1726,7 @@ CREATE TABLE "MTK"."TAB_PART_LIST" ( ) ``` -MySQL: +MySQL ```sql CREATE TABLE mtk.tab_part_list ( @@ -484,43 +1737,37 @@ CREATE TABLE mtk.tab_part_list ( ) ``` -### igErrorData - -bool - -`v2.2.2`之后的版本支持本参数。 - -忽略插入失败的数据并记录到文件. 只支持openGauss/MogDB 2.1.0 之后版本 +**默认值**: `false` ### autoAddMaxvaluePart -`v0.0.35`之后的版本支持本参数。 +**类型**: bool -参数`autoAddMaxvaluePart`允许不存在`maxvalue`分区的分区表自动添加`maxvalue`分区。 +**描述**: 参数`autoAddMaxvaluePart`允许不存在`maxvalue`分区的分区表自动添加`maxvalue`分区. 如 DB2分区表迁移到openGauss -DB2允许定义`minvalue`分区,openGauss不支持。 +DB2允许定义`minvalue`分区,openGauss不支持. -DB2在定义`minvalue`分区未定义`maxvalue`分区时null值可以插入到`minvalue`分区,openGauss会报错。 +DB2在定义`minvalue`分区未定义`maxvalue`分区时null值可以插入到`minvalue`分区,openGauss会报错. -但是openGauss分区允许null值插入到`maxvalue`分区。可通过此参数开启自动添加`maxvalue`分区 +但是openGauss分区允许null插入到`maxvalue`分区. 可通过此参数开启自动添加`maxvalue`分区 DB2未定义`maxvalue`分区 ```sql CREATE TABLE MTK1.PART_TAB_TEST02 ( - ID INTEGER NOT NULL, - SALES_PERSON VARCHAR(50), - REGION VARCHAR(50), - SALES_DATE DATE + ID INTEGER NOT NULL, + SALES_PERSON VARCHAR(50), + REGION VARCHAR(50), + SALES_DATE DATE ) PARTITION BY RANGE(SALES_DATE) ( - PART PJAN STARTING('2017-01-01') ENDING('2017-03-31') INCLUSIVE IN USERSPACE1, - PART PFEB STARTING('2017-04-01') ENDING('2017-07-31') INCLUSIVE IN USERSPACE1, - PART PMAR STARTING('2017-08-01') ENDING('2017-12-31') INCLUSIVE IN USERSPACE1, - PART PAPR STARTING('2018-01-01') ENDING('2018-12-31') INCLUSIVE IN USERSPACE1 + PART PJAN STARTING('2017-01-01') ENDING('2017-03-31') INCLUSIVE IN USERSPACE1, + PART PFEB STARTING('2017-04-01') ENDING('2017-07-31') INCLUSIVE IN USERSPACE1, + PART PMAR STARTING('2017-08-01') ENDING('2017-12-31') INCLUSIVE IN USERSPACE1, + PART PAPR STARTING('2018-01-01') ENDING('2018-12-31') INCLUSIVE IN USERSPACE1 ) ORGANIZE BY ROW ``` @@ -528,10 +1775,10 @@ openGauss ```sql CREATE TABLE DB2_MTK.PART_TAB_TEST02 ( - ID INTEGER NOT NULL, - SALES_PERSON VARCHAR(50), - REGION VARCHAR(50), - SALES_DATE DATE + ID INTEGER NOT NULL, + SALES_PERSON VARCHAR(50), + REGION VARCHAR(50), + SALES_DATE DATE ) PARTITION BY RANGE (SALES_DATE) ( PARTITION PJAN VALUES LESS THAN('2017-03-31'), @@ -542,483 +1789,407 @@ CREATE TABLE DB2_MTK.PART_TAB_TEST02 ( ) ``` -### virtualColToNormalCol +**新增于**: v0.0.36 -是否把源库虚拟列转成目标库的正常列。 +### autoAddMySQLAutoIncr -默认值: `false` +**类型**: bool -### virtualColConv +**描述**: 迁移到MySQL自动添加MySQL `AUTO_INCREMENT` 列 -虚拟列表达转换功能 +参数为`true`,当原表不存在自增主键列,自动增加`AUTO_INCREMENT`列,并把原来当主键改为唯一键. -```json -"virtualColConv": { - "TRUNC_TIMESTAMP(SNAPTIME,'HH')+ (MINUTE(SNAPTIME)/10*10 +10) MINUTES": "date_trunc('hour',snaptime) + (date_part('minute',snaptime) / 10 +1)::int * interval '10 min'", - "TRUNC_TIMESTAMP(SNAPTIME,'HH')+ (MINUTE(SNAPTIME)/10*10 +10) minutes": "date_trunc('hour',snaptime) + (date_part('minute',snaptime) / 10 +1)::int * interval '10 min'", - "TRUNC_TIMESTAMP(SNAPTIME, 'HH') + (MINUTE(SNAPTIME) / 10 * 10 + 10) MINUTES": "date_trunc('hour',snaptime) + (date_part('minute',snaptime) / 10 +1)::int * interval '10 min'", - "TRUNC_TIMESTAMP(SNAPTIME,'HH') + (MINUTE(SNAPTIME) / 10 * 10 + 10) minutes": "date_trunc('hour',snaptime) + (date_part('minute',snaptime) / 10 +1)::int * interval '10 min'", - "LEFT(HOST,POSSTR(HOST,':')-1)": "SPLIT_PART(HOST,':',1)" -} +```sql +PK_ID BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL [INVISIBLE] ``` -### replaceZeroDate +- MySQl 8.0.23 之前为 `visible` +- MySQl 8.0.23 为 `invisible column` -openGauss不支持时间格式为0000-00-00格式,默认替换为1970-01-01,此参数可以定义默认替换的值,如2021-01-01。 +> MySQL supports invisible columns as of MySQL 8.0.23.
+> An invisible column is normally hidden to queries, but can be accessed if explicitly referenced.
+> Prior to MySQL 8.0.23, all columns are visible. -### remapTable +配合[ignoreTabPartition](#ignoretabpartition)参数使用. -已不再支持 +- DB2迁移到MySQL -迁移过程中是否对表名进行改名操作 + - DB2 -### remapSchema + ```sql + CREATE TABLE MTK1.TAB_PK_TEST ( + COL1 VARCHAR(10) NOT NULL, + ID BIGINT NOT NULL, + COL2 VARCHAR(10), + COL3 VARCHAR(10) + ) IN USERSPACE1 ORGANIZE BY ROW + ``` -迁移过程中是否对数据库`schema`进行改名操作。 + - MySQL -格式为 原方案名:新方案名 + ```sql + CREATE TABLE db2_mtk.tab_pk_test ( + -- 自动增加主键列 + pk_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL INVISIBLE, + col1 VARCHAR(10) NOT NULL, + id BIGINT NOT NULL, + col2 VARCHAR(10), + col3 VARCHAR(10), + -- 原主键变为唯一键 + UNIQUE KEY ( col1 ) + ) + ``` -如 `MTK1`更名为 `MTK1_NEW`, `SOE`更名为 `SOE_NEW` +**默认值**: `false` -```json -"remapSchema":{ - "MTK1":"MTK1_NEW", - "SOE":"SOE_NEW" -} -``` +**新增于**: v2.1.1 -### remapTablespace +### autoAddMySQLAutoIncrTabList + +**类型**: []string + +**描述**: 配合`autoAddMySQLAutoIncr`参数使用. + +配置哪些表自动增加`auto_incr`列. 默认为空代表为全部表. -迁移过程中是否对表空间名进行改名操作。 +参数不区分大小写 + +- "TABLE_1" 迁移对象中所有表名为TABLE_1的表 +- "Schema1.TABLE_1" 迁移对象中Schema1下的TABLE_1的表 -配合[enableSyncTabTbsPro](#enableSyncTabTbsPro)使用 +**默认值**: 空 -格式为 原表空间名:新表空间名 +**示例**: -如 `USERSPACE1`更名为 `TBS01` +autoAddMySQLAutoIncrTabList examples ```json -"remapTablespace":{ - "USERSPACE1":"TBS01", +{ + "autoAddMySQLAutoIncrTabList": [ + "TABLE_1", + "Schema1.TABLE_1" + ] } ``` -### enableSyncTabTbsPro - -是否配置生成DDL包含表空间语法。 默认不生成 +**新增于**: v2.2.1 -默认值: `false` - -### enableSyncCompTabPro +### ignoreNotSupportDefault -是否配置生成DDL包含表压缩属性语法。 默认不生成 +**类型**: bool -默认值: `false` +**描述**: 支持忽略部分不支持列默认值.如Oracle的`sys_guid`。MTK会内嵌白名单进行忽略 -### excludeSysTable +**默认值**: `false` -排除系统对象定义。不配置则使用默认值 +### replaceZeroDate -- DB2 - - "EXPLAIN_ACTUALS", - - "ADVISE_TABLE", - - "ADVISE_PARTITION", - - "ADVISE_MQT", - - "ADVISE_WORKLOAD", - - "ADVISE_INDEX", - - "ADVISE_INSTANCE", - - "OBJECT_METRICS", - - "EXPLAIN_DIAGNOSTIC_DATA", - - "EXPLAIN_DIAGNOSTIC", - - "EXPLAIN_STREAM", - - "EXPLAIN_PREDICATE", - - "EXPLAIN_OPERATOR", - - "EXPLAIN_OBJECT", - - "EXPLAIN_ARGUMENT", - - "EXPLAIN_STATEMENT", - - "EXPLAIN_INSTANCE", +**类型**: string -### enableOgBlobClob +**描述**: openGauss不支持时间格式为0000-00-00格式,默认替换为1970-01-01,此参数可以定义默认替换的值,如2021-01-01 -`v2.0.0`之后的版本支持本参数。 +> When find a "zero" date: 0000-00-00 00:00:00 it is replaced by a NULL. +> +> This could be a problem if your column is defined with NOT NULL constraint. +> If you can not remove the constraint, +> +> use this directive to set an arbitral date that will be used instead. +> +> You can also use -INFINITY if you don't want to use a fake date. -迁移其他数据库的`Blob`、`Clob`为openGauss的`Blob`、`Clob`. +### virtualColToNormalCol -默认转换为`bytea`、`text` +**类型**: bool -默认值: `false` +**描述**: 是否把源库虚拟列转成目标库的正常列。 -### enableConvertSrid +**默认值**: `false` -`v2.0.0`之后的版本支持本参数。 +**可选值**: -此参数允许您控制 Oracle SRID 到标准 EPSG 的自动转换。 +- true +- false -如果该值为 true,则所有 SRID 都将强制为`defaultSrid`。 +### virtualColConv -默认值: `false` +**类型**: map[string]string -### defaultSrid +**描述**: 虚拟列表达转换功能 -`v2.0.0`之后的版本支持本参数。 +**示例**: -使用此参数将默认 EPSG SRID进行重启 -可以被"enableConvertSrid"控制. 见[enableConvertSrid](#enableconvertsrid) +virtualColConv example -默认值: `4326` +```json +{ + "virtualColConv": { + "LEFT(HOST,POSSTR(HOST,':')-1)": "SPLIT_PART(HOST,':',1)", + "TRUNC_TIMESTAMP(SNAPTIME, 'HH') + (MINUTE(SNAPTIME) / 10 * 10 + 10) MINUTES": "date_trunc('hour',snaptime) + (date_part('minute',snaptime) / 10 +1)::int * interval '10 min'", + "TRUNC_TIMESTAMP(SNAPTIME,'HH') + (MINUTE(SNAPTIME) / 10 * 10 + 10) minutes": "date_trunc('hour',snaptime) + (date_part('minute',snaptime) / 10 +1)::int * interval '10 min'", + "TRUNC_TIMESTAMP(SNAPTIME,'HH')+ (MINUTE(SNAPTIME)/10*10 +10) MINUTES": "date_trunc('hour',snaptime) + (date_part('minute',snaptime) / 10 +1)::int * interval '10 min'", + "TRUNC_TIMESTAMP(SNAPTIME,'HH')+ (MINUTE(SNAPTIME)/10*10 +10) minutes": "date_trunc('hour',snaptime) + (date_part('minute',snaptime) / 10 +1)::int * interval '10 min'" + } +} +``` -### skipColumnType +### mySQLToOgCharExpression -控制迁移时跳过某个数据类型的列. +**类型**: string -格式为: "列类型": int +**描述**: mysql 迁移到 openGauss 针对 char/varchar列进行计算列长表达式. 默认不计算 如 `* 3` 表示原来到长度`*3` -int +**Deprecated**: mtk scales up the length based on the db type,column type, db compatibility mode -- 1 不创建列并不迁移数据 -- 2 创建列但不迁移数据 +### mySQLSkipErrorDateTimeData -Examples: +**类型**: bool -```json -"skipColumnType":{ - "blob": 1, - "clob": 2 -} -``` +**描述**: 自动跳过mysql错误时间。 -### skipColumnName +如 `datetime` 类型里 `0000-00-00 13:14:15` -控制迁移时跳过迁移表的具体列. +**默认值**: `false` -优先级高于 `skipColumnType` +**可选值**: -格式为: "schema.table_name.column": int +- true +- false -int +### ignoreTableDDLCompErr -- 1 不创建列并不迁移数据 -- 2 创建列但不迁移数据 +**类型**: bool -Examples: +**描述**: 是否忽略表结构对比错误 -```json -"skipColumnName":{ - "schema1.tab_01.col1": 1, - "schema1.tab_01.col2": 2 -} -``` +**默认值**: `false` -### templateSeqName +**Deprecated**: 功能废弃 -Supported after `v2.1.5` version +**可选值**: -MySQL 自增列转为序列,序列名的模版 +- true +- false -默认值: `SEQ_{{.TabName}}_{{.ColName}}` +### convertPackageMethod -仅支持以下两个变量 +**类型**: string -- {{.TabName}} 表名 -- {{.ColName}} 列名 +**描述**: 迁移 Oracle Package 到 openGauss/MogDB 的方式 -Examples: +openGauss数据库版本大于等于2.1.0可配置为 `package` 或 `schema` -```json -"templateSeqName": "{{.TabName}}_{{.ColName}}_SEQ" -``` +openGauss数据库小于2.1.0 只能配置为 `schema` -### charAppendEmptyString +**默认值**: `schema` -bool +**可选值**: -`v2.2.2`之后的版本支持本参数。 +- schema +- package -针对ORA-29275: partial multibyte character 错误. -启用参数后在Oracle查询语句会拼接空字符串.主要针对以下列类型 +### enableOgBlobClob -- Char -- Character -- NChar -- Varchar -- NVarchar -- Varchar2 -- NVarchar2 +**类型**: bool -Examples: +**描述**: 迁移其他数据库的Blob、Clob为openGauss的Blob、Clob. -```sql -select chr(195) from dual; -- 报错 -select chr(195)||'' from dual; -- 不报错 +**默认值**: `false` --- 中文GBK编码 证券投 -select utl_raw.cast_to_varchar2(hextoraw('D6A4C8AFCDB6D6')) from dual; -- 报错 -select utl_raw.cast_to_varchar2(hextoraw('D6A4C8AFCDB6D6'))||'' from dual; -- 不报错 -``` +**可选值**: -### convertPackageMethod +- true +- false -string +### enableConvertSrid -`v2.2.5`之后的版本支持本参数。 +**类型**: bool -迁移 Oracle Package 到 openGauss/MogDB 的方式 +**描述**: Enable Convert Srid -- schema -- package +**默认值**: `false` -默认值: `schema` +**可选值**: -openGauss 数据库版本大于等于2.1.0可配置为 `package` 或 `schema` +- true +- false -openGauss 数据库小于2.1.0 只能配置为 `schema` +### defaultSrid -### tableOptions +**类型**: string -map[string]string +**描述**: PostGis Default Srid -Supported after `v2.3.2` version +**默认值**: `4326` -配置在创建表的时候添加表属性选项.暂时只支持openGauss/MogDB. +### seqLastNumAddNum -- openGauss/MogDB `create table xxx() with (xx)`; +**类型**: int -参数不区分大小写 +**描述**: 同步序录最后值时增加多少. -默认值: 空 +仅支持openGauss/MogDB 目标端 -Examples: +**默认值**: `0` -```json -"tableOptions": { - "*": "orientation=row, compression=no", - "Schema1.*": "orientation=row, compression=no", - "Schema1.Table": "orientation=row, compression=no" -} -``` +### skipColumnType -- "*", // 迁移对象中所有表 -- "Schema1.*" // 迁移对象中Schema1下所有表 -- "Schema1.Table" // 迁移对象中Schema1下table表 +**类型**: map[string]int -选项特殊值 remove +**描述**: 迁移时跳过某个数据类型列 -如`compression=remove` 会移除压缩属性 +格式为: "列类型": int -### indexOptions +**默认值**: `0` -map[string]string +**可选值**: -Supported after `v2.3.2` version +- 1 不创建列并不迁移数据 +- 2 创建列但不迁移数据 -和tableOptions选项配置一样,只针对索引生效. +**示例**: -## limit +skipColumnType example ```json -"limit": { - "parallel": 2, - "fetchSize": 1000, - "batchSize": 1000, - "bufferSize": 4, - "cpBufferSize": 8, - "oracleSelectParallel": 2, +{ + "skipColumnType": { + "blob": 1, + "clob": 2 + } } ``` -### parallel - -并行度。并行创建表,索引等 - -### fetchSize - -指定提取大小(每次应从结果集中提取的行数) +### skipColumnName -当数据表含有数百万个行,而您想避免发生内存不足错误时,可以使用此选项。 +**类型**: map[string]int -### batchSize +**描述**: 迁移时跳过某个列 -指定“批量插入”要使用的“批次大小”。 +优先级高于 `skipColumnType` -默认批次大小为1000,如果出现“内存不足”异常,则可以降低此值 +格式为 "schema.table_name.column": int -### cpBufferSize +**默认值**: `0` -支持copy功能的数据库,一次性提交多大的数据 +**可选值**: -### oracleSelectParallel +- 1 不创建列并不迁移数据 +- 2 创建列但不迁移数据 -Oracle查询语句中增加hint `/* +parallel(t,n) */` +**示例**: -## object +skipColumnName example ```json -"object": { - "tables": [], - "schemas": [ - "A!" - ], - "excludeTable": { - "MTK": [ - "MTK_TAB1", - "MTK_TAB2" - ], - "SYS": [ - "TAB$", - "OBJ$" - ] - }, - "tableSplit": { - "MTK": { - "TAB_1": [ - " rowid between 'AAAeoSAAEAAAACpAAA' and 'AAAeoSAAEAAAA4oEI/'", - " rowid between 'AAAeoSAAEAAAA4pAAA' and 'AAAeoSAAEAABVSoEI/'", - " rowid between 'AAAeoSAAEAABVSpAAA' and 'AAAeoSAAFAABOEoEI/'", - " rowid between 'AAAeoSAAFAABOEpAAA' and 'AAAeoSAAFAABOGIEI/'" - ], - "TAB_2": [ - "MOD(\"ID\",4)=0", - "MOD(\"ID\",4)=1", - "MOD(\"ID\",4)=2", - "MOD(\"ID\",4)=3" - ], - "TAB_3": [ - "MOD(`ID`,4)=0", - "MOD(`ID`,4)=1", - "MOD(`ID`,,4)=2", - "MOD(`ID`,4)=3" - ] - } +{ + "skipColumnName": { + "schema1.tab_01.col1": 1, + "schema1.tab_01.col2": 2 } - } +} ``` -迁移对象定义 +### templateSeqName -- 注意区分大小写 -- 迁移用户、database、schema, -- schema = mysql database -- schema = oracle user -- schema = postgres schema -- schema = db2 schema +**类型**: string -> schemas和tables参数互斥 -> 如果两个参数都填入了值,在执行MTK时会遇到“mtk-1002 schema and table cannot exist together”错误 -> -> 没有定义迁移对象,则会报错 "not define Migrate object" +**描述**: MySQL 自增列转为序列,序列名的模版 -### schema +{{.TabName}}_{{.ColName}}_SEQ -定义要迁移schema +仅支持以下两个变量 -```json -"schemas": [ - "SOE", - "BT_X", - "CUST_X" -] -``` +- {{.TabName}} 表名 +- {{.ColName}} 列名 -### tables +**默认值**: SEQ_{{.TabName}}_{{.ColName}} -定义要迁移那些表。支持: +**示例**: -- 完整表名 -- 支持schema.* 迁移schema下的全部对象 -- 支持schema.TAB% 迁移schema下的TAB开头的对象 +templateSeqName example ```json -"tables": [ - "MTK.TAB1" - "MTK.TAB111%" - "MTK1.*" -], +{ + "templateSeqName": "{{.TabName}}_{{.ColName}}_SEQ" +} ``` -> 当运行子命令迁移时,如 `sync-function` 并且配置了tables( `MTK.XXX` ) 就是迁移 Schema `MTK`下的 `XXX` 函数. -> 序列除外. - -### excludeTable - -定义排除哪些表 +**新增于**: v2.1.6 -```json -"excludeTable":{ - "MTK":[ - "TABLE_SKIP1", - "TABLE_SKIP2" - ] -} -``` +### charAppendEmptyString -### tableSplit +**类型**: bool -- 定义表粒度并行。可使用[mtk show-table-split](mtk_show-table-split)自动生成 -- 定义表迁移查询条件 +**描述**: 针对ORA-29275: partial multibyte character 错误. 在oracle查询是拼接字符串 -```json -"tableSplit":{ - "MTK":{ - "TABLE_4":[ - "ID < 10000 ", - "ID < 20000 AND ID >=10000", - "ID < 30000 AND ID >=20000", - "ID < 40000 AND ID >=30000", - "ID < 50000 AND ID >=40000", - "ID < 60000 AND ID >=50000", - "ID < 70000 AND ID >=60000", - "ID < 80000 AND ID >=70000", - "ID < 90000 AND ID >=80000", - "ID >= 90000" - ] - } -} -``` +主要针对以下列类型 -## dataOnly +- Char +- Character +- NChar +- Varchar +- NVarchar +- Varchar2 +- NVarchar2 -是否只迁移数据。 +```sql +select chr(195) from dual; -- 报错 +select chr(195)||'' from dual; -- 不报错 -默认值:`false` +-- 中文GBK编码 证券投 +select utl_raw.cast_to_varchar2(hextoraw('D6A4C8AFCDB6D6')) from dual; -- 报错 +select utl_raw.cast_to_varchar2(hextoraw('D6A4C8AFCDB6D6'))||'' from dual; -- 不报错 +``` -## schemaOnly +**默认值**: `false` -是否只迁移数据结构。 +**可选值**: -默认值:`false` +- true +- false -## reportFile +### tableOptions -迁移报告目录 +**类型**: map[string]string -v0.0.18之前为单个html报告 +**描述**: 配置在创建表的时候添加表属性选项.暂时只支持openGauss/MogDB. -v0.0.18后是一个目录 +- openGauss/MogDB `create table xxx() with (xx)`; -## debug +参数不区分大小写 -是否开启日志debug模式。 +- "*" 迁移对象中所有表 +- "Schema1.*" 迁移对象中Schema1下所有表 +- "Schema1.TABLE_1" 迁移对象中Schema1下table表 -默认值:`false` +选项特殊值 remove -## disableTableDataComp +如 `compression=remove` 会移除压缩属性 -当数据迁移完成后,MTK会统计两边的行数进行对比。 +**默认值**: 空 -此参数可以禁用表数据select对比。 +**示例**: -默认值: `false` +tableOptions example -## disableCollStatistics +```json +{ + "tableOptions": { + "*": "orientation=row, compression=no", + "Schema1.*": "orientation=row, compression=no", + "Schema1.TABLE_1": "orientation=row, compression=no" + } +} +``` -当数据迁移完成后,MTK会收集目标端统计信息。 +**新增于**: v2.3.2 -此参数可以禁用收集统计信息。 +### indexOptions -默认值: `false` +**类型**: map[string]string -## disableFKCons +**描述**: 和tableOptions选项配置一样,只针对索引生效. 未完成功能开发. -禁止迁移表外键约束. +**默认值**: 空 -默认值:`false` +**新增于**: v2.3.2 diff --git a/product/zh/docs-mtk/v2.0/mtk-db2-to-mysql.md b/product/zh/docs-mtk/v2.0/mtk-db2-to-mysql.md index f0baa9b3..6d01e4c9 100644 --- a/product/zh/docs-mtk/v2.0/mtk-db2-to-mysql.md +++ b/product/zh/docs-mtk/v2.0/mtk-db2-to-mysql.md @@ -18,7 +18,7 @@ date: 2021-03-04 ## 注意事项 -## 名称 +### 名称 MySQL中表名、索引名、列名、约束名等不支持后缀带空格,mtk会自动截取右侧空格 diff --git a/product/zh/docs-mtk/v2.0/mtk-informix-to-openGauss.md b/product/zh/docs-mtk/v2.0/mtk-informix-to-openGauss.md new file mode 100644 index 00000000..1f463bde --- /dev/null +++ b/product/zh/docs-mtk/v2.0/mtk-informix-to-openGauss.md @@ -0,0 +1,453 @@ +--- +title: MTK 迁移Informix到openGauss +summary: MTK 迁移Informix到openGauss +author: Bin Liu +date: 2022-05-28 +--- + +# 使用MTK迁移Informix到openGauss/MogDB + +## 支持版本 + +- 12.10 + +## 驱动 + +### Informix ODBC + +不支持. 未研发成功 + +### DB2 ODBC + +支持. + +> Port allow remote connections from DRDA clients + +## 注意事项 + +### 序列 + +> informix 的序列是一张表,只是表上只有一个自增列 + +- 最后值 + + 无法批量获取最后值. 为保证性能没有遍历序列获取current值. 批量获取最后的cache值,所以迁移后会比之前大 + +### 表 + +- 分区表不支持,只能迁移为普通表 +- 外部表不支持 +- 统一处理为bigint类型加默认序列,并调整序列开始值为源库最后值 + +### 表数据 + +- 支持中文. UTF8字符集 + + ```jdbc + # jdbc 中文字符测试 + jdbc:informix-sqli://localhost:19088/sysadmin:INFORMIXSERVER=dev;NEWCODESET=utf8,8859-1,819;CLIENT_LOCALE=en_US.utf8;DB_LOCALE=en_US.utf8; + ``` + +### 列 + +#### 列对应 + +| Informix column type | DB Length | SCALE | openGauss column type | data_precision | data_scal | +|:------------------------|:----------|:------|:----------------------|:---------------|:----------| +| BIGINT | 0 | 0 | bigint | 0 | 0 | +| [BIGSERIAL](#bigserial) | 0 | 0 | bigint + sequence.nextval| 0 | 0 | +| BLOB | 0 | 0 | bytes/blob | 0 | 0 | +| BOOLEAN | 0 | 0 | bool | 0 | 0 | +| BYTE | 0 | 0 | bytes/blob | 0 | 0 | +| CHAR | 10 | 0 | char | 10 | 0 | +| VARCHAR | 10 | 0 | VARCHAR | 10 | 0 | +| CLOB | 0 | 0 | text/clob | 010 | 0 | +| DATE | 10 | 0 | date | 0 | 0 | +| [DATETIME](#datetime) | 4879 | 0 | timestamp | 0 | 0 | +| [DECIMAL](#decimal) | 16 | 255 | numeric | 32 | 16 | +| FLOAT | 17 | 0 | float | 0 | 0 | +| FLOAT | 17 | 0 | float | 0 | 0 | +| INT8 | 19 | 0 | INT8 | 0 | 0 | +| INTEGER | 10 | 0 | INTEGER | 0 | 0 | +| [INTERVAL](#interval) | 1350 | 0 | INTERVAL | 0 | 0 | +| LVARCHAR | 100 | 0 | VARCHAR | 0 | 0 | +| [MONEY](#money) | 16 | 2 | MONEY | 0 | 0 | +| NVARCHAR | 100 | 2 | VARCHAR | 0 | 0 | +| SMALLFLOAT | 7 | 2 | float | 0 | 0 | +| SMALLINT | 0 | 0 | SMALLINT | 0 | 0 | +| TEXT | 0 | 2 | TEXT | 0 | 0 | +| VARCHAR | 100 | 2 | VARCHAR | 100 | 0 | +| BSON | 0 | 0 | 不支持 | 0 | 0 | +| VARIABLE U | 0 | 0 | 不支持 | 0 | 0 | +| IDSSECURIT | 0 | 0 | 不支持 | 0 | 0 | +| IDSSECURITYLABEL | 0 | 0 | 不支持 | 0 | 0 | +| OPAQUE | 0 | 0 | 不支持 | 0 | 0 | +| DISTINCT | 0 | 0 | 不支持 | 0 | 0 | +| LIST | 0 | 0 | 不支持 | 0 | 0 | +| MULTISET | 0 | 0 | 不支持 | 0 | 0 | +| ROW | 0 | 0 | 不支持 | 0 | 0 | +| Named ROW | 0 | 0 | 不支持 | 0 | 0 | + +> datetime/interval 类型存在多种组合方案. 部分组合方案存在数据问题 +> +> datetime/interval 具体类型根据公式 `(length * 256) + (first_qualifier * 16) + last_qualifier` 反推计算得出 +> [syscolumns-storing-column-length][syscolumns-storing-column-length] +> +> interval `first_qualifier` 的精度 根据具体 `Field qualifier`的长度反推计算得出 + +[syscolumns-storing-column-length]: https://www.ibm.com/docs/en/informix-servers/12.10?topic=syscolumns-storing-column-length + +#### BIGSERIAL + +openGauss统一处理为bigint类型加默认序列 + +#### DATETIME + +- 具体毫米级精度无法计算得出. 会寻找解决方案 + +- month/day/hour/minute/second/fraction to x 非完整时间时间类型 + + - datetime hour to second `02:00:00` + + - datetime month to day + + 在 informix 可以存储年份数据,展示为 `05-27` 迁移到 openGauss `timestamp` 类型会变成 `1200-05-27 00:00:00` + +#### DECIMAL + +- DECIMAL(p) Floating Point + + 未指定precision的时候默认是16. 可以插入总长度为16的浮点数. openGauss/mogdb 不支持这种 + + scale 默认为 255. 特殊数据 + + > Specifying precision is optional. + > + > If you specify no precision (p), DECIMAL is treated as DECIMAL(16), + > a floating-point decimal with a precision of 16 places. + > + > DECIMAL(p) has an absolute exponent range between 10-130 and 10124. + + DECIMAL --> DECIMAL(16) --> DECIMAL(32,16) ? + + - informix + + ```sql + drop table tab_decimal; + create table tab_decimal ( + col_decimal decimal, + col_decimal_16 decimal(16), + col_decimal_17 decimal(17), + col_decimal_16_0 decimal(16,0), + col_decimal_17_0 decimal(17,0), + col_decimal_30_20 decimal(30,20), + col_decimal3_2 decimal(3,2) + ); + insert into tab_decimal values (1234567891011121.12345678910111213,1234567891011121.12345678910111213,1234567891011121.12345678910111213,1234567891011121.12345678910111213,1234567891011121.12345678910111213,1234567890.12345678910111213,1.23); + insert into tab_decimal values (1.12345678910111213,1.12345678910111213,1.12345678910111213,1234567890.12345678910111213,1.12345678910111213,1234567890.12345678910111213,1.23); + insert into tab_decimal values (12345678.12345678,12345678.12345678,12345678.12345678,1234567890.12345678910111213,12345678.12345678,1234567890.12345678910111213,1.23); + insert into tab_decimal values (123456789.12345678,123456789.12345678,123456789.12345678,1234567890.12345678910111213,123456789.12345678,1234567890.12345678910111213,1.23); + select * from tab_decimal; + ``` + + - openGauss + + ```sql + CREATE TABLE mtk.tab_decimal ( + col_decimal DECIMAL(32,16), + col_decimal_16 DECIMAL(32,16), + col_decimal_17 DECIMAL(34,17), + col_decimal_16_0 DECIMAL(16), + col_decimal_17_0 DECIMAL(17), + col_decimal_30_20 DECIMAL(30,20), + col_decimal3_2 DECIMAL(3,2) + ) + ``` + +- DECIMAL (p,s) Fixed Point + + 和 openGauss/mogdb 一致 + +#### INTERVAL + +- 存在 interval 类型在报告里展示不准的场景 + + 如 `interval day(8) to day` 这种类型可能存在显示不准情况 + +- **interval second to fraction** + + 在informix 展示为 `120.010` 迁移到openGauss interval 类型会变成 `120 days 00:14:24`. 正常应该为`00:02:00.010` + + MTK根据标准的 `interval day to second` 格式`00 00:00:00.000`进行数据转换 + +#### MONEY + +未指定precision的时候默认是16.2. 可以插入总长度为16的浮点数. openGauss/mogdb不支持指定精度.可用DECIMAL替代,存在四舍五入问题 + +- informix + + ```sql + create table tab_money ( + col_money money, + col_money_30_20 money(30,20), + col_money_2 money(3,2) + ); + ``` + + > Unlike the DECIMAL data type, the MONEY data type is always treated as a fixed-point decimal number. + > + > The database server defines the data type MONEY(p) as DECIMAL(p,2). + > + > If the precision and scale are not specified, the database server defines a MONEY column as DECIMAL(16,2). + +- openGauss + + ```sql + CREATE TABLE mtk.tab_money ( + col_money money NULL, + col_money_30_20 money NULL, + col_money_2 money NULL + ) + ``` + +#### 列默认值 + +- 列默认存在问题. 只支持部分语法转换迁移 +- interval 列默认值值 +- datetime 列默认值 + + - current --> current_timestamp + + - datetime hour to second `'08:00:00'` 不是正常时间会被移除 + + ```sql + tk_start_time datetime hour to second default datetime (08:00:00) hour to second --> tk_start_time timestamp + ``` + +### 索引 + +- 不支持函数索引 + + 没有找到列信息. 只支持用户自己定义的函数 + +### 约束 + +- 检查约束存在语法转换问题. + + ```sql + ALTER TABLE mtk.tab_ph_task1 ADD CONSTRAINT CHECK ((tk_name [1,1] != ' ' )) CONSTRAINT c271_149; + -- (?is)interval\s*\(\s*([^\(\),]+)\)\s+(YEAR|MONTH|DAY|HOUR|MINUTE|SECOND|FRACTION)\s+TO\s+(YEAR|MONTH|DAY|HOUR|MINUTE|SECOND|FRACTION\(\d+\)) + ALTER TABLE mtk.tab_ph_task1 ADD CONSTRAINT CHECK ((tk_frequency > interval( 0 00:00:00) day to second )) CONSTRAINT tab_ph_task1_constr2 + ``` + +### 视图 + +### 函数 + +### 存储过程 + +### 触发器 + +## 部分SQL语句 + +### 系统视图 + +- systables 表/序列/视图 + - 分区表自增列的值在第一个分区上记录,不在表上记录 +- syscolumns 列信息 +- syssequences 序列 +- sysmaster:sysactptnhdr 序列最后值 +- sysfragments 分区 +- sysdbspaces 表空间 +- sysmaster:sysptnext 表空间相关 +- sysconstraints 约束 +- sysobjstate 对象状态 +- sysreferences 外健约束 +- syschecks 检查约束 + +### 序列信息 + +```sql +-- 一个序列为一个表,此表只含有自增列 +-- 表中含有自增列也当作序列进行查询 +-- 序列的最后值为最后的cache值 +-- 分区表自增列的信息在第一个分区上 +SELECT T.OWNER + , T.TABNAME + , T.TABID + , C.COLNAME + , T.PARTNUM + , INFORMIX.SCHEMA_COLTYPENAME(C.COLTYPE, C.EXTENDED_ID)::VARCHAR(10) COLTYPENAME + , NVL(S.SEQID, 0) as SEQID + , NVL(S.START_VAL, 1) as START_VAL + , NVL(S.INC_VAL, 1) as INC_VAL + , NVL(S.MIN_VAL, 1) as MIN_VAL + , nvl(S.MAX_VAL, '') as MAX_VAL + , NVL(S.cycle, 0) as cycle + , NVL(S.cache, 1) as cache + , NVL(S.order, 1) as order + , D.CUR_SERIAL4 + , D.CUR_SERIAL8 + , D.CUR_BIGSERIAL + --,T.PARTNUM,F.PARTN,DECODE(T.PARTNUM,0,F.PARTN,T.PARTNUM) +FROM + INFORMIX.SYSCOLUMNS C + JOIN INFORMIX.SYSTABLES T ON C.TABID = T.TABID +LEFT JOIN INFORMIX.SYSFRAGMENTS F ON F.TABID = T.TABID AND F.EVALPOS=0 AND F.FRAGTYPE='T' +LEFT JOIN INFORMIX.SYSSEQUENCES S ON T.TABID=S.TABID +LEFT JOIN SYSMASTER:SYSACTPTNHDR D ON DECODE(T.PARTNUM,0,F.PARTN,T.PARTNUM) =D.PARTNUM +WHERE + INFORMIX.SCHEMA_ISAUTOINCR(C.COLTYPE)= 'YES' + and t.tabtype in ('T', 'Q'); +``` + +### 表信息 + +```sql +select t.tabid, + t.owner, + t.tabname, + c.name, + --t.partnum, + --t.rowsize, + --t.ncols, + t.nrows, + --t.npused, + d.cur_serial4, + d.cur_serial8, + d.cur_bigserial, + f.strategy, + f1.exprtext, + f2.strategy, + f2.exprtext +from INFORMIX.SYSTABLES t +left join informix.sysfragments f on f.tabid = t.tabid and f.evalpos = -3 and F.FRAGTYPE = 'T' +left join informix.sysfragments f1 on f1.tabid = t.tabid and f1.evalpos = -2 and F1.FRAGTYPE = 'T' +left join informix.sysfragments f2 on f2.tabid = t.tabid and f2.evalpos = 0 and F2.FRAGTYPE = 'T' +left join sysmaster:sysactptnhdr d on d.partnum = DECODE(t.partnum,0,f2.partn,t.partnum) +-- left join sysmaster:sysptnext pt on t.partnum=pt.pe_partnum +left join sysmaster:sysdbspaces c on sysmaster:partdbsnum(t.partnum)= c.dbsnum +where + t.tabtype = 'T' +``` + +### 列信息 + +```sql +select + t.owner, + t.tabname, + c.colno, + c.colname, + informix.schema_isautoincr(coltype) auto_increment, + informix.schema_nullable(coltype) nullable, + informix.schema_coltypename(c.coltype, c.extended_id)::varchar(10) coltypename, informix.schema_precision(c.coltype,c.extended_id,c.collength) precision, + informix.schema_numscale(c.coltype,c.collength) numscale, + -- informix.schema_datetype(c.coltype,c.collength) datetype, + pt.cur_serial4, + pt.cur_serial8, + pt.cur_bigserial, + d.type, + d.default +from + informix.syscolumns c +join informix.systables t on c.tabid = t.tabid +left join informix.sysdefaults d on c.tabid = d.tabid and c.colno = d.colno +left join informix.sysfragments f on f.tabid = t.tabid and f.evalpos=0 and f.fragtype='T' +left join sysmaster:sysactptnhdr pt on decode(t.partnum,0,f.partn,t.partnum) =pt.partnum +where c.colno > 0 +``` + +### 索引信息 + +```sql +-- 函数索引没有找到列信息 +-- SYSINDICES.indexkeys +-- (colno,colno)[opclassid],(colno,colno)[opclassid] --> 5 [1], <661>(2, 4) [1] +-- procid 可为空. colno [opclassid] --> 2 [1], 1 [1] +-- desc (tk_name desc,tk_type desc); -2 [1], -4 [1] +-- (tk_name desc,toupper1(tk_name,tk_type) desc -2 [1], <661>(-2, 4) [1] +select t.tabid,t.owner,t.tabname,i.owner as idxowner,i.idxname, + i.idxtype, + i.clustered, + c.colname, + i.part1, + i.part2, + i.part3, + i.part4, + i.part5, + i.part6, + i.part7, + i.part8, + i.part9, + i.part10, + i.part11, + i.part12, + i.part13, + i.part14, + i.part15, + i.part16 +from sysindexes i join systables t on t.tabid = i.tabid +left join syscolumns c on c.tabid = i.tabid +and c.colno in (abs(part1), abs(part2), abs(part3), abs(part4), abs(part5), abs(part6), abs(part7), abs(part8), abs(part9), abs(part10),abs(part11), abs(part12), abs(part13), abs(part14), abs(part15), abs(part16)) +where not exists ( + select + c.idxname + from + sysconstraints c + where + c.tabid = i.tabid + and c.idxname = i.idxname + and c.idxname is not null + ) +and t.owner = 'mtk' +``` + +### 约束信息 + +```sql +select tab.tabid, + tab.owner, + tab.tabname, + constr.constrname, + constr.constrtype, + -- chk.seqno, + chk.checktext, + c1.colname, + -- constr.constrid, + constr.idxname, + rt.owner as r_owner, + rt.tabname as r_cons_tab, + rc.constrname as r_cons_name, + r.updrule AS update_rule, + r.delrule AS delete_rule, + s.state, + i.part1, + i.part2, + i.part3, + i.part4, + i.part5, + i.part6, + i.part7, + i.part8, + i.part9, + i.part10, + i.part11, + i.part12, + i.part13, + i.part14, + i.part15, + i.part16 +from sysconstraints constr +join sysobjstate s on s.tabid=constr.tabid and s.name=constr.constrname and s.objtype='C' +join systables tab on tab.tabid = constr.tabid +left outer join syschecks chk on chk.constrid = constr.constrid and chk.type = 'T' +left outer join sysreferences r on constr.constrid=r.constrid +left outer join sysconstraints rc on rc.constrid=r.primary +left outer join systables rt on r.ptabid = rt.tabid +left outer join sysindexes i on i.idxname = constr.idxname +left outer join syscolumns c1 on c1.tabid = tab.tabid + and c1.colno in (abs(part1), abs(part2), abs(part3), abs(part4), abs(part5), abs(part6), abs(part7), abs(part8), abs(part9), abs(part10), + abs(part11), abs(part12), abs(part13), abs(part14), abs(part15), abs(part16)) +WHERE constr.constrtype != 'N' +``` diff --git a/product/zh/docs-mtk/v2.0/mtk-oracle-to-openGauss.md b/product/zh/docs-mtk/v2.0/mtk-oracle-to-openGauss.md index 8d903378..7ad782e8 100644 --- a/product/zh/docs-mtk/v2.0/mtk-oracle-to-openGauss.md +++ b/product/zh/docs-mtk/v2.0/mtk-oracle-to-openGauss.md @@ -181,7 +181,7 @@ MogDB=#select id,concat('"',col_char,'"') ,col_char from tab_char; | INTERVAL YEAR TO MONTH | interval | | IDTS INTERVAL DAY TO SECOND | interval | | LONG | text | -| RAW(111) | bytea | +| RAW(111) | RAW(111) | | LONG RAW | bytea | | CLOB | text/CLOB | | BLOB | bytea/BLOB | -- Gitee