支持的数据库版本
源数据库 | 目标数据库 |
---|---|
12c, 19c, 21c | TeleDB |
支持的迁移对象及SQL
迁移对象
结构迁移支持表结构迁移(包含索引、外键、约束)、视图、同义词、序列、触发器、函数、存储过程、类型、物化视图、程序包。
增量数据迁移支持同步的SQL操作
- DML:
INSERT、UPDATE、DELETE
- DDL:
增量同步暂不支持DDL同步。
支持的迁移类型
Oracle | TeleDB-X |
---|---|
数值类型 | 数值类型 |
NUMBER(p,s) s!=0 | numeric/decimal |
NUMBER(p,s) s==0,1 <= p <= 4 | int2 |
NUMBER(p,s) s==0,5 <= p <= 9 | int4 |
NUMBER(p,s) s==0,10 <= p <= 19 | int8 |
FLOAT | real/float4 |
BINARY_FLOAT | real/float4 |
REAL | real/float4 |
BINARY_DOUBLE | double precision/float8 |
时间类型 | |
DATE | timestamp |
TIMESTAMP | timestamp |
TIMESTAMP WITH TIME ZONE | timestamptz |
TIMESTAMP WITH LOCAL TIME ZONE | timestamptz |
字符类型 | |
CHAR | char/bpchar |
NCHAR | char/bpchar |
VARCHAR | varchar |
VARCHAR2 | varchar |
NVARCHAR2 | varchar |
ROWID | varchar |
BLOB | bytea |
RAW | bytea |
LONG_RAW | bytea |
CLOB | text |
NCLOB | text |
LONG | text |
时间间隔类型 | |
INTERVAL YEAR TO MONTH | interval |
INTERVAL DAY TO SECOND | interval |
以下类型未考虑支持 | |
BFILE、ROWID、UROWID、XMLTYPE 、SDO_GEOMETRY |
操作须知
-
增量阶段不支持字段含有INVISIBLE特性的表,如果待迁移对象存在这种表,增量阶段会报错。
-
三个TIMESTAMP类型的范围如果超过pg支持的范围,全量和增量阶段可能会报错。
-
不支持同步源库中的临时表。
-
不支持同步源库中有虚拟列的表。
-
不支持选择源数据库的空库进行同步。
-
同步过程中,禁止对Oracle源库做resetlogs操作,否则会导致数据无法同步且任务无法恢复。
-
同步过程中,不支持LOB类型的rollback操作,否则会导致同步任务失败。
-
库表名映射默认为全部转小写,例如映射为abc与映射为ABC,同步到目标库后均为abc。
-
全量同步过程中,DTS会向目标库TeleDBX写入大量数据,会导致wal日志量急剧增长,TeleDBX的磁盘有被写满的风险。可以通过在全量同步前关闭TeleDBX的日志备份功能,减少wal日志的生产,同步完成后再将其打开的方式进行规避。
-
增量阶段不支持同步含有LOB字段且没有主键的表。
-
Oracle归档日志文件大小必须大于单条数据最大值,避免单条数据日志跨文件(超过2个日志文件)导致的增量数据解析异常。
-
Oracle中表结构长度(所有列长字节数之和,char、varchar2等类型字节长度和编码有关)超过65535时,可能导致同步失败。
-
当Oracle字符集是WE8MSWIN1252时,CLOB列同步到目标库可能出现乱码,建议先修改源库字符集为AL32UTF8再同步数据。
-
如有中文、日文等特殊字符,业务连接Oracle数据库使用的编码需和Oracle数据库服务端编码一致,否则目标库可能会出现乱码。
-
库名、表名不支持的字符有:非ASCII字符、“. ”、 “>”、 “<”、 “\”、 “`”、 “|”、 “,”、 “? ”、 “! ”、 “"”和 “'”。
-
如果待迁移对象中含有分区表,结构迁移阶段分区表信息将会被丢弃。
-
不支持bfile,xml、sdo_geometry、urowid、interval(精度大于6位)和自定义类型。
-
不支持使用Oracle 物理备库进行迁移/同步。
-
RAC模式的Oracle不支持使用scanIP,只能连接其中一个节点进行同步。
-
对于TIMESTAMP WITH TIME ZONE类型,根据目标库时区做转换后不得大于“9999-12-31 23:59:59.999999”。
-
如果表中只有LOB字段,可能出现数据不一致性情况。
-
如果Oracle中使用LOB类型各自的empty函数写入数据时,通过JDBC查询出来的值是空字符串,写入到目标库后是空字符串还是NULL取决于目标库对空字符串值的处理。
-
不支持默认值含有表达式的函数的表的同步。
-
源库支持to_date和sys_guid函数做默认值。将其他函数作为default值时,需要目标库也有相同功能的函数。对于目标库不存在对应函数的情况,可能会出现以下结果:
- 默认值函数可能会被置空。
- 创建表失败,导致对象对比不一致或者任务失败。
-
暂不支持DDL同步。
-
同步过程中,不允许删除连接源和目标数据库的用户的用户名、密码、权限,或修改目标数据库的端口号。
-
大事务有可能同步失败。
-
包含大字段的行有可能同步失败。
-
确保Oracle的归档日志空间大小足够。
-
源库为Oracle 12c及以上时,增量阶段要保证所有存在的容器数据库均处于打开状态。
-
源库为Oracle 12c及以上时,不支持同步application root和application PDB.
-
如果有增量迁移,增量阶段不能使用sys/system等oracle内部的系统用户作为DTS用户,也不能使用PDB用户,必须使用公共容器中创建的用户。
-
如果有增量迁移,则只支持库名和表名映射,不支持列名映射。
-
若要做增量同步,且同步对象包含外键、触发器或事件触发器,则目标数据库的session_replication_role参数必须设置为replica,同步结束后,此参数需改为origin。
-
结构迁移无主键表时,默认迁移到目标端的分片键为当前表结构的第一个字段。
-
无主键表在全量迁移和增量迁移阶段,如果当前源表的第一个字段(也就是作为分片键的字段)存在null值时,将会迁移失败,原因是TeleDBX分片键的键值不能为NULL。
准备工作
- 创建源库DTS用户
- oracle 12c及以上且开启了CDB模式
如果仅作测试用可直接赋予最高权限,用SYS用户登录Oracle,如下创建DTS迁移用户:
-- 要求该用户必须是CDB下的用户,且授权的权限必须在所有容器内都具备
CREATE USER C##DTS IDENTIFIED BY "<password>" DEFAULT TABLESPACE USERS QUOTA UNLIMITED ON USERS CONTAINER=ALL;
GRANT DBA TO C##DTS CONTAINER=ALL;
GRANT SELECT ON SYS.OBJ$ TO C##DTS CONTAINER=ALL;
GRANT SELECT ON SYS.COL$ TO C##DTS CONTAINER=ALL;
如果需要授予数据迁移用户的精准权限,用SYS用户登录Oracle,如下创建DTS迁移用户:
-- 要求该用户必须是CDB下的用户,且授权的权限必须在所有容器内都具备
CREATE USER C##DTS IDENTIFIED BY "<password>" DEFAULT TABLESPACE USERS QUOTA UNLIMITED ON USERS CONTAINER=ALL;
GRANT CREATE SESSION TO C##DTS CONTAINER=ALL;
GRANT SET CONTAINER TO C##DTS CONTAINER=ALL;
GRANT FLASHBACK ANY TABLE TO C##DTS CONTAINER=ALL;
GRANT SELECT ANY TABLE TO C##DTS CONTAINER=ALL;
GRANT INSET ANY TABLE TO C##DTS CONTAINER=ALL;
GRANT UPDATE ANY TABLE TO C##DTS CONTAINER=ALL;
GRANT DELETE ANY TABLE TO C##DTS CONTAINER=ALL;
GRANT CREATE ANY TABLE TO C##DTS CONTAINER=ALL;
GRANT DROP ANY TABLE TO C##DTS CONTAINER=ALL;
GRANT COMMENT ANY TABLE TO C##DTS CONTAINER=ALL;
GRANT LOCK ANY TABLE TO C##DTS CONTAINER=ALL;
GRANT CREATE SEQUENCE TO C##DTS CONTAINER=ALL;
GRANT SELECT ANY SEQUENCE TO C##DTS CONTAINER=ALL;
GRANT SELECT ANY TRANSACTION TO C##DTS CONTAINER=ALL;
GRANT SELECT ANY DICTIONARY TO C##DTS CONTAINER=ALL;
GRANT SELECT ON SYS.OBJ$ TO C##DTS CONTAINER=ALL;
GRANT SELECT ON SYS.COL$ TO C##DTS CONTAINER=ALL;
GRANT SELECT_CATALOG_ROLE TO C##DTS CONTAINER=ALL;
GRANT EXECUTE_CATALOG_ROLE TO C##DTS CONTAINER=ALL;
GRANT LOGMINING TO C##DTS CONTAINER=ALL;
GRANT EXECUTE ON DBMS_LOGMNR TO C##DTS CONTAINER=ALL;
GRANT EXECUTE ON DBMS_LOGMNR_D TO C##DTS CONTAINER=ALL;
- oracle 12c关闭CDB模式
如果仅作测试用可直接赋予最高权限,用SYS用户登录Oracle,如下创建DTS迁移用户:
CREATE USER DTS IDENTIFIED BY "<password>" DEFAULT TABLESPACE USERS QUOTA UNLIMITED ON USERS;
GRANT DBA TO DTS;
GRANT SELECT ON SYS.OBJ$ TO DTS;
GRANT SELECT ON SYS.COL$ TO DTS;
如果需要授予数据迁移用户的精准权限,用SYS用户登录Oracle,如下创建DTS迁移用户:
-- 要求该用户必须是CDB下的用户,且授权的权限必须在所有容器内都具备
CREATE USER DTS IDENTIFIED BY "<password>" DEFAULT TABLESPACE USERS QUOTA UNLIMITED ON USERS;
GRANT CREATE SESSION TO DTS;
GRANT SET CONTAINER TO DTS;
GRANT FLASHBACK ANY TABLE TO DTS;
GRANT SELECT ANY TABLE TO DTS;
GRANT INSET ANY TABLE TO DTS;
GRANT UPDATE ANY TABLE TO DTS;
GRANT DELETE ANY TABLE TO DTS;
GRANT CREATE ANY TABLE TO DTS;
GRANT DROP ANY TABLE TO DTS;
GRANT COMMENT ANY TABLE TO DTS;
GRANT LOCK ANY TABLE TO DTS;
GRANT CREATE SEQUENCE TO DTS;
GRANT SELECT ANY SEQUENCE TO DTS;
GRANT SELECT ANY TRANSACTION TO DTS;
GRANT SELECT ANY DICTIONARY TO DTS;
GRANT SELECT ON SYS.OBJ$ TO DTS;
GRANT SELECT ON SYS.COL$ TO DTS;
GRANT SELECT_CATALOG_ROLE TO DTS;
GRANT EXECUTE_CATALOG_ROLE TO DTS;
GRANT LOGMINING TO DTS;
GRANT EXECUTE ON DBMS_LOGMNR TO DTS;
GRANT EXECUTE ON DBMS_LOGMNR_D TO DTS;
- 创建目标库DTS用户
如果仅作测试,可直接使用TeleDB最高权限的用户root。
如果需要使用精准权限的用户,用root用户登录TeleDB,如下创建DTS迁移用户:
CREATE USER dts WITH ENCRYPTED PASSWORD '<占位符>';
GRANT CREATE, TEMPORARY, CONNECT ON DATABASE <待迁移的数据库名称> TO dts;
如果要做增量迁移且迁移的表包含外键,那么除了上述权限外,还要保证该用户具有在会话级别执行SET session_replication_role = 'replica'的权限。可登录TeleDB控制台,将该参数设置并重启。
- 如果有增量迁移,需按照如下方法开启Oracle的归档日志
- 非RAC模式:
SELECT name,log_mode from V$DATABASE;
如果没有开启,使用sqlplus且用SYS用户以sysdba方式登录后,依次执行以下命令:
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
- RAC模式:
在RAC ORACLE 的某一个节点的 shell 中,关闭、启动、挂载某一个数据库:
srvctl stop database -d <数据库名字>
srvctl start database -d <数据库名字> -o mount
使用DBA 权限账号登陆该数据库,并开启归档日志:
alter database archivelog;
在RAC ORACLE 的某一个节点的 shell 中, 重启数据库:
srvctl stop database -d <数据库名>
srvctl start database -d <数据库名>
- 如果有增量迁移,需开启Oracle的详细补充日志
使用以下命令,确认supplemental logging 是否开启:
SELECT supplemental_log_data_min, supplemental_log_data_pk, supplemental_log_data_all FROM V$DATABASE;
如果三列存在NO,那么先开启补充最小日志-supplemental_log_data_min:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
开启全补充日志,增加ALL、主键、Unique Index:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA(ALL, PRIMARY KEY, UNIQUE) COLUMNS;
- 确保所有容器处于打开状态
如果有增量迁移,且CDB模式开启,且有多个容器数据库,则要保证这写可插拔的容器数据库处于打开状态,不然无法启动增量迁移。
-- 注意必须用SYS用户执行
SELECT con_id, name, open_mode, restricted FROM v$pdbs;
以上查询结果中,除了SEED容器外,OPEN_MODE字段的值必须为READ WRITE。
- 确认迁移对象中是否存在无主键表
如果勾选增量迁移,迁移对象中不能包含无主键表:
-- 替换 YOUR_SCHEMA_NAME 为你的模式名
SELECT t.table_name
FROM all_tables t
LEFT JOIN all_constraints c
ON t.owner = c.owner
AND t.table_name = c.table_name
AND c.constraint_type = 'P'WHERE t.owner = '
使用以上查询语句可以筛选出某个schema下的所有无主键表,将这些表排除于增量迁移之外。
- 确认归档日志保留时间
如果勾选增量迁移,为了避免增量迁移过程中由于一些故障导致同步中断的情况,需要至少保留3-7天的归档日志来确保处理这些情况的窗口期。否则,可能导致无法将同步从故障中恢复。
RMAN> SHOW RETENTION POLICY;
- 确认待迁移对象中是否包含触发器
如果将触发器作为结构的一部分,在DTS的调度逻辑上,触发器会先于全量迁移被迁移到TeleDB。这样可能会影响到全量迁移,导致数据不一致。
建议将触发器放到全量迁移之后,再新建一个迁移任务进行迁移。
- 数据及业务信息统计
如果为非测试任务,需要在迁移之前统计业务以及迁移信息,方便进行迁移任务规划。
- 资源信息:
- 源库规格信息,例如4C8G + 500G + SSD
- 目标库磁盘信息,例如4C8G + 500G + SSD
- 网络情况,例:为测试环境纯内网传输,无复杂的网络拓补结构
- 数据信息:
- 总数据量,例如30GB
- 总库表数量,例:40个库,8000张表,2000个视图,5个触发器
- 每日新增数据量级,例如:一天的归档日志新增大概100GB
- 是否所有表都有主键,建议迁移前完善主键,提高性能,方便运维。如果存在无主键的表,则增量阶段源端对应表的增、删、改操作不会同步至目标端,可能导致数据不一致,请谨慎评估。
- 业务类:
- 数据迁移是否可停业务,例:能/不能
- 增量迁移情况,例:开启增量迁移,持续时间5天
- 可停业务时间长度,例:服务停机时间预计48小时
- 业务中是否存在百万级别的大事务,例:存在,涉及对表CLOUD.LOGS进行大事务操作,存在一个存储过程用不带where条件的delete语句定期清理该表。
操作步骤
-
订购DTS数据迁移实例。
-
进入实例配置页面。DTS实例创建成功后,进入【数据迁移】实例列表页面,上一步骤购买成功的实例在实例列表中显示状态为“待配置”,进入实例配置页面进行配置:
-
配置源库及目标库信息。
- 进入实例配置第一个步骤的【配置源库及目标库信息】页面,填入源库与目标库的相关配置信息,包括数据库类型、IP地址端口、数据库账号、数据库密码等信息。
- 完成上述信息的填写后,单击源数据库和目标数据库的测试连接按钮进行数据库连接测试,检查数据库能否正常连接。
注意ORACLE如果要进行增量同步,不能使用SYS/SYSTEM系统用户。
-
配置迁移对象及高级配置。
源库和目标库连通性测试成功后,点下一步按钮,进入实例配置第二个步骤的【配置迁移对象及高级配置】页面,在“源库对象”中选择要迁移的源库对象,选中后单击“>”按钮,将待迁移对象移动到“已选择对象”中。
-
预检查和启动迁移。
完成迁移对象和高级配置后,单击“下一步预检查”,进入实例配置第三个步骤的【预检查】页面。预检查会检查如下列表信息,并给出检查结果,用户可以依据检查结果进行下一步操作。
检查内容 检查点 检查源库连通性 源库网络能够连通 检查目标库连通性 目标库网络能够连通 检查源库用户权限 若不包含增量,检查提供的源库账号是否具有以下权限: CREATE SESSION;CATALOG_ROLE、ANY DICTIONARY、待迁移表的select权限若包含增量,还需要检查以下权限:SET CONTAINER,FLASHBACK ANY TABLE,SELECT ANY TABLE,SELECT_CATALOG_ROLE,EXECUTE_CATALOG_ROLE,SELECT ANY TRANSACTION,LOGMINING,CREATE TABLE,LOCK ANY TABLE,CREATE SEQUENCE,EXECUTE ON DBMS_LOGMNR,EXECUTE ON DBMS_LOGMNR_D,SELECT ANY DICTIONARY,SELECT ON SYS.OBJ,SELECT ON SYS.COL,CREATE ANY TABLE,COMMENT ANY TABLE,DROP ANY TABLE 检查目标库用户权限 检查提供的目标库账号是否具有登录信息database下创建schema的权限。 检查目标库PostgreSql版本 目标库的PostgreSql版本是否不低于9.2 检查待迁移表是否存在主键 检查待迁移表是否都存在主键,只有全量迁移时,如果发现存在没有主键的表,将提出警告(无主键的表可能会导致数据不一致);勾选了增量迁移,如果发现存在没有主键的表,预检查将不通过(增量迁移功能依赖主键) 检查待迁移表约束完整性 检查待迁移表依赖的表对象是否包含在待迁移对象中,若存在依赖的对象未被选择,检查不通过 检查源库最大连接数 检查源库最大连接数是否不小于300,若最大连接数小于300,给出告警 检查目标库最大连接数 检查目标库最大连接数是否不小于300,若最大连接数小于300,给出告警 检查同名对象存在性 检查目标库中是否存在和待迁移库同名的库(映射后),若存在,检查该库下面是否存在同名的表(映射后)。如果有,将提出警告。 检查源数据库Oracle的表字段的数据类型能否都迁移到目标库 待迁移表中不能存在Oracle的独有的字段类型,ROWID、UROWID、XMLTYPE、BFILE、SDO_GEOMETRY等类型 检查源库对象是否仅大小写不同 迁移对象中是否包含仅大小写不同的对象时,预检查不通过 检查待迁移库名合法性 若待迁移库名中包含非法字符,检查不通过 检查待迁移表名合法性 若待迁移表名中包含非法字符,检查不通过 检查源库字符集是否为支持的字符集 源库字符集支持以下字符集:ZHS16GBK,AL32UTF8,UTF8,US7ASCII,WE8MSWIN1252若源库字符集不属于以上字符集,预检查将不通过 检查当前登录账号是否个人账号 勾选增量时,检查源库的迁移用户是否为个人账号,若账号为系统用户,检查不通过 检查源库是否开启归档日志 勾选增量时,检查源库是否开启归档日志,若未开启,检查不通过 检查源库是否开启补充日志 勾选增量时,检查源库是否开启补充日志,若未开启,检查不通过 如果预检查通过,可单击【预检查】页面底部的“启动迁移”按钮,开始迁移任务。或者直接单击”数据迁移“列表,返回数据迁移主界面,任务将显示为”未启动“状态。
勾选任务,单击 开始任务 ,任务将变为 运行中 ,直到全量迁移完成,或者进入增量迁移状态。