-
操作场景 标签管理服务(Tag Management Service,TMS)用于用户在云平台,通过统一的标签管理各种资源。TMS服务与各服务共同实现标签管理能力,TMS提供全局标签管理能力,各服务维护自身标签管理 。 建议您先在TMS系统中设置预定义标签。 标签由“键”和“值”组成,每个标签中的一个“键”只能对应一个“值”。 每个UGO项目最多支持添加20个标签。 用户可在创建数据库评估或对象迁移项目时添加标签,也可在项目创建成功后再添加标签。
-
三权分立检查 目标库为
GaussDB 时,会进行三权分立检查。GaussDB三权分立后,系统管理员即拥有SYSADMIN权限的用户将不再具有CREATEROLE属性(安全管理员)和AUDITADMIN属性(审计管理员)能力,即不再拥有创建角色和用户的权限,也不再拥有查看和维护数据库审计日志的权限。在UGO的对象迁移功能上,体现为开启三权分立后,SYSADMIN用户无法完成USER、ROLE、GRANT的迁移。 目标库为GaussDB时,开启三权分立,并迁移用户为SYSADMIN时,才会展现此检查项,其余情况,此检查项均不展示。 在开启三权分立后,如果SYSADMIN用户继续拥有安全管理员(拥有CREATEROLE权限)和审计管理员权限,这是来回切换权限模型导致的。如需从非三权分立权限管理模型切换至三权分立权限管理模型,应重新审视已有用户的权限集合,进行权限裁剪。
-
导入模板文件 当需要跨云上账户,导入其他账户中预设好并导出的转换配置模板文件时,请在“导入模板文件”页签内创建转换模板。如何导出转换配置模板,请参考导出转换配置模板。 登录UGO控制台。 单击左侧导航栏“转换配置管理”,进入转换配置管理页面。 单击“创建配置模板”,进入“创建配置模板”页面,单击“导入模板文件”按钮,进入“导入模板文件”页签。 单击“添加文件”按钮,上传其他实例导出的ugotmplt格式模板文件,系统会识别并展示“模板名称”、“源数据库类型”、“目标数据库类型”和预设好的“特性配置”列表。 图2 通过导入模板文件创建配置模板 (可选)在配置项列表中,根据当前UGO实例需要迁移的数据库场景,进行微调。
-
描述 数据库类型与版本 源库类型与版本:MySQL 5.5、5.6、5.7、8.0版本。 目标库类型与版本:GaussDB分布式版。 语法示例 如果UGO判断出GaussDB分布式表的分布键不是主键及唯一键的超集,则会生成此错误提示。 实际上在GaussDB中INSERT ON DUPLICATE KEY UPDATE语句不支持用于带全局二级索引(GSI)的表中,而在GaussDB分布式中如果指定的分布键不是主键及唯一键的超集,则数据库会自动创建全局二级索引,如下示例在GaussDB分布式中不支持。 CREATE TABLE demo (
id INT PRIMARY KEY,
info VARCHAR(10),
email VARCHAR(10),
UNIQUE (id, info)
) DISTRIBUTE BY HASH(email);
INSERT INTO demo VALUES (10, 'AA', 'BB'), (4, 'EE', 'EE') ON DUPLICATE KEY UPDATE email = VALUES(email);
-
描述 数据库类型与版本 源库类型与版本:MySQL 5.5、5.6、5.7、8.0版本。 目标库类型与版本:GaussDB M兼容。 语法示例 当MySQL未启用严格模式(即sql_mode中不包含NO_ZERO_DATE)时,允许TIMESTAMP类型的字段保存'0000-00-00 00:00:00'值,但是GaussDB M兼容TIMESTAMP类型的取值范围为:1970-01-01 00:00:01' UTC ~ 2038-01-19 03:14:07' UTC,不支持'0000-00-00 00:00:00'。如下示例在GaussDB M兼容中将不支持。 create table test_timestamp (
id int,
c_timestamp timestamp not null default '0000-00-00 00:00:00'
);
-
改造建议 修改“TIMESTAMP类型'0000-00-00 00:00:00'值的转换”转换配置项,将'0000-00-00 00:00:00'转换为'1970-01-02 00:00:00'。 在MySQL中通常用'0000-00-00 00:00:00'表示该字段的值尚未被明确设定,或者在某些情况下,表示无效的日期时间值,但是如果业务中使用了该值做判断,则转换后需要排查业务将相关的判断替换成转换后的时间日期值。
-
描述 当在 Oracle 中使用 SELECT INTO FOR UPDATE 方式调用 DBE_LOB 高级包中的 append、writeappend、write、copy 等存储过程对于 BLOB/CLOB 数据类型进行写操作时,Oracle 会自动更新数据表中的 BLOB/CLOB 对象。而 GaussDB 不支持自动更新至表,需显式执行 UPDATE 语句。当 UGO 无法验证列是否为 BLOB/CLOB 数据类型时无法自动添加 UPDATE 语句,需要人工确认数据类型,当确认为 BLOB/CLOB 数据类型时,手动修改补充 UPDATE 语句。 数据库类型与版本 源库类型与版本:UGO 支持的 Oracle 版本。 目标库类型与版本:UGO 支持的 GaussDB 版本。 语法示例 CREATE OR REPLACE PACKAGE BODY "PICCPROD"."PKG_TRANSFER_FORMAT_TP" is
PROCEDURE p_create_dsic_10301_0004(
i_organ_id IN VARCHAR,
i_bank_code IN VARCHAR,
i_send_id IN NUMBER,
o_scce_flag OUT NUMBER
)AS
p_clob1 CLOB;
p_offset INTEGER:=0;
p_info1 VARCHAR2(200);
BEGIN
SELECT send_text
INTO p_clob1
FROM t_bank_text
WHERE send_id = i_send_id
FOR UPDATE;
DBMS_LOB.WRITE(p_clob1,LENGTH(p_info1),p_offset+1,p_info1);
p_offset := p_offset + length(p_info1);
RETURN;
END;
end PKG_TRANSFER_FORMAT_TP;
/
-
改造建议 对于上述示例,若确认 t_bank_text 表中的 send_text 列为 BLOB/CLOB 数据类型时,则需要在其下方补充 UPDATE 语句: DBMS_LOB.WRITE(p_clob1,LENGTH(p_info1),p_offset+1,p_info1); 转换为 DBE_LOB.LOB_WRITE(p_clob1,LENGTH(p_info1),p_offset+1,p_info1);
UPDATE t_bank_text SET send_text = p_clob1 WHERE send_id = i_send_id;
-
描述 数据库类型与版本 源库类型与版本:MySQL 5.5、5.6、5.7、8.0版本。 目标库类型与版本:GaussDB所有版本。 语法示例 默认情况下,UGO将注释掉临时表的AUTO_INCREMENT属性,如果“临时表自增列”转换配置项选择“忽略迁移,记录错误信息。”将生成此错误提示。 如U0400010所述,GaussDB集中式版V2.0-3.1版本之前不支持AUTO_INCREMENT属性,AUTO_INCREMENT默认转换成自定义序列的形式。但是GaussDB临时表不支持序列整型(自定义序列的话无法将序列与表形成绑定关系),如下示例在GaussDB中将不支持。 CREATE TEMPORARY TABLE temp_tale_test(
id SERIAL,
test varchar(64)
);
-
描述 数据库类型与版本 源库类型与版本:所有涉及视图WITH CHECK OPTION的源数据库类型。 目标库类型与版本:GaussDB所有版本。 语法示例 默认情况下,UGO保留视图WITH CHECK OPTION子句不转换,并生成此错误提示。 GaussDB视图不支持指定WITH CHECK OPTION子句,如下示例在GaussDB中不支持。 CREATE OR REPLACE VIEW view_demo AS
SELECT * FROM emp_t WHERE deptno = 10 WITH CASCADED CHECK OPTION;
-
操作步骤 集中式版 连接上
GaussDB数据库 ,切换至GaussDB的安装用户下。 su - omm "omm"为示例用户,切换时以实际安装用户为准。 执行以下命令,设置参数。 gs_guc reload -Z coordinator -Z datanode -N all -I all -c "b_format_behavior_compat_options='enable_set_variables'"; gs_guc reload -Z coordinator -Z datanode -N all -I all -c "b_format_version='5.7'"; gs_guc reload -Z coordinator -Z datanode -N all -I all -c "b_format_dev_version='s1'"; 分布式版 连接上GaussDB数据库,切换至GaussDB的安装用户下。 su - omm "omm"为示例用户,切换时以实际安装用户为准。 执行以下命令,设置参数。 gs_guc reload -Z coordinator -Z datanode -N all -I all -c "b_format_version='5.7'"; gs_guc reload -Z coordinator -Z datanode -N all -I all -c "b_format_dev_version='s1'";
-
兼容模式设置 GaussDB MySQL语法兼容模式包括:集中式版B兼容模式、集中式版M兼容模式以及分布式版MYSQL兼容模式。 目标库为GaussDB,且源库为MySQL/GoldenDB数据库迁移时,默认往GaussDB MySQL语法兼容模式迁移,因此建议创建MySQL语法兼容数据库。 创建MySQL语法兼容类型数据库。 使用具有创建数据库权限的用户登录GaussDB数据库。 执行以下命令,创建MySQL兼容模式的GaussDB数据库。 集中式版B兼容: create database databasename dbcompatibility = 'B'; 集中式版M兼容: create database databasename dbcompatibility = 'M'; 分布式: create database databasename dbcompatibility = 'MYSQL'; 执行以下命令,查看是否创建成功。 select * from pg_database where datname = 'databasename'; 集中式版B兼容:若datcompatibility兼容性一列为B,则MySQL兼容数据库创建成功。 集中式版M兼容:若datcompatibility兼容性一列为M,则M兼容数据库创建成功。 分布式:若datcompatibility兼容性一列为MySQL,则MySQL兼容数据库创建成功。
-
GUC参数设置 当使用MySQL兼容模式,可以设置GUC参数提高GaussDB的兼容性,迁移涉及的GUC参数和影响范围可参见表1。 GaussDB数据库提供了许多运行参数,配置这些参数可以影响数据库系统的行为。在修改这些参数时请确保用户理解了这些参数对数据库的影响,否则可能会导致无法预料的结果。 表1 GaussDB(MySQL兼容模式)的GUC参数 兼容B行为配置项 兼容性配置项 兼容性配置项名字 支持的数据库 是否建议打开 b_format_behavior_compat_options enable_set_variables 仅限集中式版会话变量生效。 集中式版 是 b_format_version 5.7 数据库平台兼容性行为配置项。 GaussDB V2.0-8.0 集中式版/分布式版 是 b_format_dev_version S1 数据库平台迭代小版本兼容性行为配置项。 GaussDB V2.0-8.0 集中式版/分布式版 是 S2 数据库平台迭代小版本兼容性行为配置项。 GaussDB V2.0-8.100 集中式版/分布式版 是 b_format_dev_version参数设置: GaussDB V2.0-8.0企业版,设置为s1。 GaussDB V2.0-8.100企业版,设置为s2。 S1兼容性配置项所影响的内容: NEW()函数、last_day()函数、date_sub(date, INTERVAL expr unit)、datediff(expr1, expr2)、day()/dayofmonth()、dayname() dayofweek()、dayofyear()、extract(unit FROM date)、from_days(days)、from_unixtime(unix_timestamp[,format])、get_format({DATE | TIME | DATETIME | TIMESTAMP}, {'EUR' | 'USA' | 'JIS' | 'ISO' | 'INTERNAL'})、 hour()、makedate(year,dayofyear)、microsecond()、minute()、month()、monthname()、 period_add(period, month_number) TIMESTAMPDIFF、yearweek(date[, mode])、year()、weekofyear(date)、 weekday()、week(date[, mode])、utc_timestamp()、utc_time()、period_diff(p1,p2)、second(). quarter()、str_to_date(str, format)、subdate(expr, days)、time_format(time, format)、ifnull(expr1, expr2)、database()、current_date、current_time、current_timestamp round(arg1, arg2)、localtime([precision])、localtimestamp、dbtimezone、timenow()、numtodsinterval(num, interval_unit)、numtoyminterval(num, interval_unit) new_time(date, timezone1,timezone2)、sysdate([precision])、add_months(d,n)、months_between(d1, d2)、convert_tz(dt, from_tz, to_tz) adddate(date, INTERVAL expr unit)、date_format(date, format) S2兼容性配置项所影响的内容: 包含s1控制的兼容性行为。 影响如下功能: AUTO_INCREMENT自动增长列在导入数据或者进行BATCH INSERT执行计划的插入操作时,对于混合0、NULL和确定值的场景,确定值插入时会立即更新自增计数,后续的0/NULL将在确定值的基础上自增。 like操作符对于匹配串末尾是转义符的场景不再报错。 字符集、字符序的排序规则优先级将发生变更。 影响如下语法: CREATE TABLE table_name LIKE source_table语法。 CREATE TABLE table_name LIKE source_table和“CREATE TABLE table_name (LIKE source_table)”语法不支持指定INCLUDING和EXCLUDING选项,缺省等同于指定INCLUDING ALL。 支持LOAD DATA语法,gs_loader中部分与LOAD DATA语法一致的语法功能会发生变化。 支持set names指定collate子句。 涉及ALTER TABLE,RENAME TABLE等更改表名的语法,影响场景如:新表名对应字符串开头为“#MySQL50#”,且其后有其他字符,“#MySQL50#”将被忽略。
-
描述 数据库类型与版本 源库类型与版本:所有源数据库类型。 目标库类型与版本:GaussDB M兼容模式。 语法示例 在GaussDB中,如下标识符是系统列名,用户自定义表中不允许使用这些标识符作为列名。 CTID, XMIN, CMIN, XMAX, CMAX, TABLEOID, XC_NODE_ID, TID, GS_TUPLE_UID, TABLEBUCKETID。如下示例在GaussDB中将不支持。 CREATE TABLE ctid_test(ctid INT); 迁移到GaussDB M兼容模式时,如果表列定义中使用了上述标识符作为列名,将保留这些列名不转换,并生成此错误提示。 迁移到GaussDB非M兼容模式时,如果表列定义中使用了上述标识符作为列名,会默认进行加双引号并转换成全大写处理(其中TID作为自定义列名从GaussDB集中式版V2.0-8.0版本开始支持,分布式版V2.0-8.100版本开始支持,在支持的版本中将保留TID作为列名不做处理)。
-
描述 数据库类型与版本 源库类型与版本:PostgreSQL 所有版本。 目标库类型与版本:GaussDB 所有版本。 语法示例 PostgreSQL 的 jsonb_query_path 函数允许你使用 JSONPath 表达式来从 jsonb 数据中提取特定的信息。当只有两个参数时,UGO 会将 jsonb_query_path 函数转换成 GaussDB 的 jsonb_extract_path 函数,当函数参数大于两个时,UGO 将不进行转换,保持原样输出。 GaussDB 的 jsonb_extract_path 函数根据指定的路径从 jsonb 数据中提取特定信息,但是 jsonb_extract_path 函数需要指定明确的路径,不支持条件过滤、不支持 '*' 通配符等场景,当 jsonb_query_path 函数的 JSONPath 表达式中存在 jsonb_extract_path 不支持的路径时将生成此错误提示。如下所示: SELECT jsonb_path_query(data, '$.address.*') FROM users;
SELECT jsonb_path_query(data, '$.hobbies[*]') FROM users;
SELECT jsonb_path_query(data, '$.hobbies[?(@ == "reading")]') FROM users;