本项目是一个兼容工具集合,旨在为从其他异构数据库,迁移到 openGauss 之后的系统,创建必要的函数,以及系统视图的兼容。为后续的系统运维与应用改造提供便利。
脚本中带有版本控制,直接运行脚本时,会根据如下三种情况进行处理:
直接在 openGauss 数据库中执行sql文本。
注意: 以下所有操作需要在当前脚本所在的目录中执行
创建所有兼容性对象,包括: 视图,函数,管理包等。
# 本地用户,默认库登录
gsql -f runMe.sql
# 详细创建语法,注意 test 用户权限(需要具有 sysadmin 权限,从3.0版本开始,仅支持初始用户进行本地创建)
gsql -h 127.0.0.1 -p 5432 -U test -d database_name -f runMe.sql
以下以 Oracle 兼容性视图为例,其他兼容性对象脚本,也可以以此方式创建。
# 本地用户,默认库登录
gsql -f Oracle_Views.sql
# 详细创建语法,注意 test 用户权限(需要具有 sysadmin 权限,从3.0版本开始,仅支持初始用户进行本地创建)
gsql -h 127.0.0.1 -p 5432 -U test -d database_name -f Oracle_Views.sql
检查目标库中对象是否需要升级。
# 本地用户,默认库登录
gsql -f checkMe.sql
# 详细创建语法,注意 test 用户权限(需要具有 sysadmin 权限,从3.0版本开始,仅支持初始用户进行本地创建)
gsql -h 127.0.0.1 -p 5432 -U test -d database_name -f checkMe.sql
卸载由 Compat-tools 创建的一系列兼容性对象。
# 本地用户,默认库登录
gsql -f uninstall.sql
# 详细创建语法,注意 test 用户权限(需要具有 sysadmin 权限,从3.0版本开始,仅支持初始用户进行本地创建)
gsql -h 127.0.0.1 -p 5432 -U test -d database_name -f uninstall.sql
默认情况下,执行 runMe.sql 或 checkMe.sql 脚本,都只能针对已连接的某一套数据库。
若想针对一个数据库实例中的多套数据库,那么可使用 batch_executor.py 脚本。
# 查看批量调度脚本支持的命令行选项
python3 batch_executor.py -h
# 批量对实例中所有数据库创建兼容性对象
python3 batch_executor.py -f runMe.sql
# 仅针对 postgres,hongye 库进行兼容性对象版本检查
python3 batch_executor.py -d 'postgres,hongye' -f checkMe.sql
可在使用当前脚本工具时,可使用内置的 test.py
自动化测试脚本对 SQL 脚本进行功能测试:
注意: 该测试脚本需要在已安装 Docker 环境,且具备外网环境的服务器上执行。
python3 test.py
测试脚本执行完成后,会生成 test_result.md
结果文档,记录本次测试的结果,如果有失败的测试用例,也会输出详细的失败用例详情。
测试文档主要展示两个部分内容:
脚本运行结束后,会自动输出以下两类内容:
本次脚本中涉及到的兼容对象,以及对应的操作内容
gsql:Oracle_Functions.sql:1035: NOTICE: -- =====================================================================
gsql:Oracle_Functions.sql:1035: NOTICE: -- Compat Object List:
gsql:Oracle_Functions.sql:1035: NOTICE: -- =====================================================================
gsql:Oracle_Functions.sql:1035: NOTICE: | type | name | version | language | operation |
gsql:Oracle_Functions.sql:1035: NOTICE: |-----------|--------------------------------------------------|---------|----------|---------------------|
gsql:Oracle_Functions.sql:1035: NOTICE: | function | months_between(timestamptz,timestamptz) | 2.0 | sql | Skip due to version |
gsql:Oracle_Functions.sql:1035: NOTICE: | function | sys_guid() | 1.0 | sql | Skip due to version |
gsql:Oracle_Functions.sql:1035: NOTICE: | aggregate | wm_concat(text) | 1.0 | internal | Skip due to version |
gsql:Oracle_Functions.sql:1035: NOTICE: | function | nvl2(anyelement,anyelement,anyelement) | 1.0 | sql | Skip due to version |
gsql:Oracle_Functions.sql:1035: NOTICE: | function | trunc(timestamp,text) | 1.0 | sql | Skip due to version |
gsql:Oracle_Functions.sql:1035: NOTICE: | function | trunc(timestamptz,text) | 1.0 | sql | Skip due to version |
gsql:Oracle_Functions.sql:1035: NOTICE: | function | nanvl(numeric,numeric) | 1.0 | sql | Skip due to version |
gsql:Oracle_Functions.sql:1035: NOTICE: | function | regexp_substr(text,text,int4) | 2.0 | sql | Skip due to version |
gsql:Oracle_Functions.sql:1035: NOTICE: | function | regexp_substr(text,text,int4,int4,text,int4) | 2.0 | plpgsql | Skip due to version |
gsql:Oracle_Functions.sql:1035: NOTICE: | function | regexp_instr(text,text,int4,int4,int4,text,int4) | 1.0 | plpgsql | Skip due to version |
gsql:Oracle_Functions.sql:1035: NOTICE: | function | regexp_replace(text,text,text,int4,int4,text) | 1.0 | plpgsql | Skip due to version |
gsql:Oracle_Functions.sql:1035: NOTICE: | function | regexp_count(text,text,int4,text) | 2.0 | sql | Skip due to version |
gsql:Oracle_Functions.sql:1035: NOTICE: | function | replace(text,text) | 1.0 | sql | Skip due to version |
gsql:Oracle_Functions.sql:1035: NOTICE: | function | ora_hash(anyelement,int4,int4) | 1.0 | plpgsql | Skip due to version |
gsql:Oracle_Functions.sql:1035: NOTICE: | function | show(text) | 1.0 | sql | Skip due to version |
gsql:Oracle_Functions.sql:1035: NOTICE: | function | show_parameter(text) | 1.0 | sql | Skip due to version |
本次脚本中内置的测试用例的运行汇总
确认所有测试用例都是最新执行,并且没有类型为 FAILED
的测试用例即可。
gsql:Oracle_Functions.sql:1035: NOTICE: -- =====================================================================
gsql:Oracle_Functions.sql:1035: NOTICE: -- Function Test Result:
gsql:Oracle_Functions.sql:1035: NOTICE: -- =====================================================================
gsql:Oracle_Functions.sql:1035: NOTICE: | result_type | case_count | start_time | complete_time |
gsql:Oracle_Functions.sql:1035: NOTICE: |-------------|------------|----------------------------|----------------------------|
gsql:Oracle_Functions.sql:1035: NOTICE: | PASSED | 387 | 2021-11-25 09:42:20.016619 | 2021-11-25 09:42:52.127892 |
gsql:Oracle_Functions.sql:1035: NOTICE: | NULL | 6 | 2021-11-25 09:42:20.016619 | 2021-11-25 09:42:20.016619 |
数据库兼容模式为 A (默认建库即为 A 兼容模式)时,可能会有如下用例失败:
以下用例失败的原因是 A 模式下,空字符串会被认为是 NULL(与 Oracle 中行为类似),导致用例失败,可忽略。
gsql:runMe.sql:139: NOTICE: -- =====================================================================
gsql:runMe.sql:139: NOTICE: -- Test Detail (Failed or Null):
gsql:runMe.sql:139: NOTICE: -- =====================================================================
gsql:runMe.sql:139: NOTICE: | test_expression | result | expect | complete_time |
gsql:runMe.sql:139: NOTICE: |----------------------------------------------|-----------------|-----------------|---------------------|
gsql:runMe.sql:139: NOTICE: | find_in_set('','a,b,c,dx') | | = 0 | 2021-12-07 07:46:32 |
gsql:runMe.sql:139: NOTICE: | find_in_set('x','') | | = 0 | 2021-12-07 07:46:32 |
gsql:runMe.sql:139: NOTICE: | find_in_set('','a,b,c,,dx') | | = 4 | 2021-12-07 07:46:32 |
gsql:runMe.sql:139: NOTICE: | find_in_set('', string_to_array('a,b,c,d ... | | = 0 | 2021-12-07 07:46:32 |
gsql:runMe.sql:139: NOTICE: | find_in_set('x', string_to_array('', ',')) | | = 0 | 2021-12-07 07:46:32 |
gsql:runMe.sql:139: NOTICE: | find_in_set('', string_to_array('a,b,c,, ... | | = 4 | 2021-12-07 07:46:32 |
gsql:runMe.sql:139: NOTICE: | isnull('')::text | true | = 'false' | 2021-12-07 07:46:32 |
select * from compat_tools.compat_version;
select * from compat_tools.compat_testing;
Oracle_Views.sql 包含如下几类 Oracle 兼容性视图:
ALL_
视图当前与DBA_
视图一致,并未做权限检验,后期版本将会考虑权限校验。
默认安装视图时,若内核字典中对象名为纯小写,则查询结果中转换为纯大写,大小写混合则不变。 可在安装视图完成后,通过执行以下命令来还原成内核字典中的大小写:
gsql -f Oracle_Views_Upper.sql -v UPPER="'N'"
如果要切换为转换大写,则执行以下命令:
gsql -f Oracle_Views_Upper.sql -v UPPER="'Y'"
注意: ifnull 效果等同于通用函数 coalesce,在条件允许的情况下,建议修改 SQL 使用 coalesce 函数,该函数几乎在各个数据库中均支持
注意: value 效果等同于通用函数 coalesce,在条件允许的情况下,建议修改 SQL 使用 coalesce 函数,该函数几乎在各个数据库中均支持
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。