「瀚高数据库技术栈」瀚高数据库兼容Mysql分析详解
点击上方蓝字关注我们吧
声明:
本文章内容仅用于学习、交流,未经瀚高数据库售前团队允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的,利用此文所提供的信息而造成的任何直接或间接的损失,均由使用者本人负责。
产
品
概
述
01
产品介绍
2011年发布第一版,迭代至今自研功能涵盖安全性、性能提升、易用性、企业级特性、商业化支持,高度兼容PostgreSQL、oracle、mysql。提供企业版、安全版满足不同政企客户需求。
Mysql
mysql由瑞典mysql AB公司开发,目前属于oracle旗下产品。
mysql在web应用方面是最流行的关系型数据库管理系统之一,mysql软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择mysql作为网站数据库,如LAMP环境。
02
产品发展史
开源协议差异
mysql采用双重许可方法:
GPLv2(用于社区版)- 协议规定只要使用了它的项目都必须开源,不管是否在销售。 企业版商业许可- 提供各种付费版本以用于商业用途,受oracle约束。
03
瀚高安全版数据库特点
04
瀚高企业版数据库特点
强大的新一代内核升级
基于PostgreSQL 12内核; 完全兼容PostgreSQL 12社区版;
丰富的企业级基因
备份恢复管理(HG_RMAN); 流复制集群管理(HG_REPMGR); 定时任务管理(HG_JOB); 闪回查询(HG_FBQ); 内核诊断(HG_DEBUG); 数据库性能诊断(HG_PDR); 流复制增强(HG_STREAM); 在线DDL增强; 中文分词与检索(HG_ULTRASEARCH);
原有自研功能的延续与改进
整库加密; 内置HASH分区表; 直接路径加载; 日志挖掘工具;
强大的新扩展
PostGISPipelinedb→流计算;
国产化硬件支持主流的国产平台
飞腾、龙芯、兆芯、海光、海思等;
性能提升基于TPCC标准测试; 同等软硬件配置; 和旧版本相比,性能可提升约1倍和PG10相比,性能可提升20%以上; 和oracle 11g相比,性能差距大幅缩小。
兼
容
分
析
01
兼容参数
兼容参数1:compatible_db
默认为“none”,表示关闭兼容模式;
设置为“oracle”表示开启oracle兼容模式,适用于源库是oracle的场合;
设置为“mysql”表示开启mysql兼容模式,适用于源库是mysql的场合;
设置方式有两种,一种是永久生效,一种是临时生效。
1.永久生效
在postgresql.conf文件中增加compatible_db = mysql;开启mysql兼容模式;
执行重载命令pg_ctl reload生效参数;
登录数据库执行show compatible_db;来查看参数是否生效。
2.临时生效
在数据库会话中执行set compatible_db = mysql;临时开启mysql兼容模式,会话级别。
show compatible_db;来查看参数是否生效。
兼容参数2:case_sensitive_db
案例1:
compatible_db=‘mysql’;case_sensitive_db=on时;
HighGo DB
MySQL
兼容参数3:lower_case_table_names
功能介绍:
表名大小写控制参数。该参数的可取值为0、1、2,默认值为0。1是表名转小写(不敏感),2和0一样都是大、小、混合写敏感。要与参数1和参数2结合使用。重载生效。
案例2:
此参数默认为0,0和2的效果一样,可以参考上面的案例1。接下来测试为1时表名不敏感:
兼容参数4:flatten_keyword_list
案例3:HighGo DB的保留关键字可自行网上查阅。
设置前报错:
兼容参数5:
session_restore_keyword_list
案例4:在案例3的基础上,测试和flatten_keyword_list设置的参数limit冲突时的解决方案。
设置前冲突报错:
在postgresql.conf中配置并使其生效:
兼容参数6:flatten_sconst_list
功能介绍:
可配置任意sconst到此列表中,被配置的sconst会被当做普通的标识符识别(此参数需要compatible_db设为mysql时生效)。默认无,需要手动追加postgresql.conf中,并重载生效。
案例5:
在案例4的基础上,测试正常命名的别名加引号和保留关键字作别名加引号的情况。
设置前报错:
在postgresql.conf中配置并使其生效:
配置需要做别名的带引号的字符串后,跟mysql用法完全兼容:
兼容参数7:
session_restore_sconst_list
案例6:在案例5的基础上,测试和flatten_ sconst _list设置的参数all、sm冲突时,flatten_sconst _list中配置的对应值无效。
设置前:
flatten_ sconst _list中配置的对应值sm无效:
兼容参数8:
func_args_emptystr_to_null
案例7:测试函数参数列表中的空串转换成null。
创建测试函数:
开启兼容参数:
其他兼容参数及注意事项
以上是以瀚高数据库安全版4.5.7为例,相信瀚高数据库在技术不断创新的前提下,后续的版本会追加新的兼容参数,来不断提高对PostgreSQL、oracle、mysql的兼容。
注意事项:
1、文章中对敏感和不敏感的解释如下:
敏感:区分大小写,如果是相同单词,大小写不同则兼容参数可以使用成功。 不敏感:不区分大小写,如果是相同单词,大小写不同则兼容参数不能使用成功。
迁移之前要设置兼容参数compatible_db,避免不兼容导致的迁移失败; 设置原则:源库是oracle的设置oracle兼容,源库是mysql的设置mysql兼容; 根据实际情况开启兼容参数,可以提前与瀚高的销售、迁移工程师联系沟通。
02
兼容数据类型
反观HighGo DB,不仅支持传统的SQL数据类型(如数字、字符串、日期、十进制等),还支持非结构化数据类型(如:JSON、XML和HSTORE)以及网络数据类型、位字符串等。突出之处在于它支持更广泛的数据类型,如数组、网络类型和几何数据类型(包括高级空间数据函数)来存储和处理空间数据(PostGIS的外部模块)。下面列出了一些替换数据类型列表(由迁移工具自动匹配转换):
兼容数据类型1:text
兼容说明:
长度不一样: mysql存储范围是0-65 535 bytes。HGDB最大容量是1GB。 在使用上,mysql细分为:
tinytext text mediumtext longtext 以上4 种text类型,有不同的使用限制,HGDB没有使用上的限制。
兼容数据类型2:timestamp
兼容说明:
范围不一样: mysql范围是‘1970-01-01 00:00:01.000000’到‘2038-01-19 03:14:07.999999’。并且受时区影响。HGDB范围是4713 BC到294276 AD,可选择时区。 精确度不一样: mysql只能精确到秒,HGDB能精确到毫秒。
兼容数据类型3:bytea
兼容说明:
名称不一样: mysql存储二进制大对象数据类型是blob,HGDB的是bytea。 长度不一样: mysql的BLOB是个类型系列,包括:tinyblob、blob、mediumblob、longblob,有不同的使用限制,HGDB的bytea没有使用上的限制,最多保存2G的数据。
其他兼容数据类型
03
兼容函数
兼容函数1:date_sub
indate:原始时间戳 ininterval:需要减去的时间
与mysql使用一样; 需要开启compatible_db为mysql。
HighGo DB
MySQL
兼容函数2:date_add
与mysql使用一样; 需要开启compatible_db为mysql。
HighGo DB
MySQL
兼容函数3:datediff
expr1:结束时间戳 expr2:开始时间戳
与mysql使用一样; 需要开启compatible_db为mysql。
HighGo DB
MySQL
兼容函数4:replace
str:要搜索的字符串表达式 from_str:要查找的子字符串 to_str:替换字符串
与mysql使用一样; 需要开启compatible_db为mysql。
HighGo DB
MySQL
兼容函数5:unix_timestamp
无参:返回unix时间戳,从UTC'1970-01-01 00:00:00'开始的秒数。 带参:计算输入时间与UTC'1970-01-01 00:00:00'开始的秒数。
与mysql使用一样; 需要开启compatible_db为mysql。
HighGo DB
MySQL
兼容函数6:from_unixtime
expr1:秒数 expr2:显示的格式
与mysql使用一样; 需要开启compatible_db为mysql。
HighGo DB
MySQL
兼容函数7:if
expr1:必须项。要测试的值。 value_if_true:true时要返回的值。 value_if_false :false时要返回的值。
与mysql使用一样; 需要开启compatible_db为mysql。
HighGo DB
MySQL
兼容函数8:group_concat
expr:要连接的字符串
与mysql使用一样; 需要开启compatible_db为mysql。
HighGo DB
MySQL
兼容函数9:field
expr1:查找的字符串或者列 expr2…:字符串列表
与mysql使用一样; 需要开启compatible_db为mysql。
HighGo DB
MySQL
兼容函数10:left
功能介绍: 返回字符串中指定长度的左边字符。参数说明:
str:要截取的字符串 len:指定长度
与mysql使用一样; 需要开启compatible_db为mysql。
HighGo DB
MySQL
其他兼容函数
总之,HighGo DB本身拥有强大的扩展功能,支持自定义函数,尤其是支持函数重载,能够满足兼容mysql的所有函数,来支持所有业务功能的替换,保障业务系统能够正常运行。
04
兼容语法
兼容语法1:简化分组排序的规则
兼容mysql的group by用法,无论是否存在主键,group by子句中的列允许少于目标列。
兼容mysql的distinct+order by用法,使用distinct时,order by子句中的列允许不在目标列。
与mysql使用一样; 需要开启compatible_db为mysql。
HighGo DB
MySQL
兼容语法2:DELETE table_name
DELETE table_name[.*]
[,table_name[.*] ...] FROM [ ONLY] table_name
[*][,talbe_name [*]...] [ [ AS ] alias ]
[USING using_list]
[WHERE condition | WHERE CURRENT OF cursor_name ]
[RETURING *| output_expression [ [ AS ]
output_name ] [ , ... ] ]
兼容说明:兼容mysql的delete删除多表用法。差异说明: 与mysql使用一样; 需要开启compatible_db为mysql。
HighGo DB
MySQL
兼容语法3:会话变量
与mysql使用一样; 需要开启compatible_db为mysql。
HighGo DB
MySQL
兼容语法4:case…when…then和else
兼容说明:
then和else类型可以不一致。
差异说明:
与mysql使用一样; 需要开启compatible_db为mysql。
HighGo DB
MySQL
兼容语法5:别名加单引号
与mysql使用一样; 需要开启compatible_db为mysql; 加引号的别名追加到flatten_sconst_list。
HighGo DB
MySQL
其他兼容语法
总之,HighGo DB高度兼容了mysql。但是,目前并不是完全兼容,毕竟各自的语法解析器、底层架构、内核开发语言是不一样的。
当然,HighGo DB不断的技术突破、提高兼容性,版本优化升级迭代,凭借强大的扩展功能、技术先进性,尤其是自主可控、企业级功能丰富、复杂业务场景下可定制开发、满足各行业国产化要求等优势,能够在系统尽量少做修改和调整的基础上,做到整体迁移工作工具化、智能化、过程可控、范围可控、问题可控,最终实现应用系统在瀚高数据库上的稳定高效运行。
S
Q
L
语
法
兼
容
评
估
01
SQL语法兼容评估工具介绍
1.SQL语法兼容评估工具介绍
SQL语法兼容评估工具(简称SQL-GCE)基于对数据库源端业务产生的SQL的分析,并在瀚高数据库中重演,根据重演结果生成报告。目前支持源数据库包括oracle、SqlServer和mysql。
SQL-GCE是基于源库中业务SQL的,所以在使用之前需要对源数据库进行相关SQL日志的配置,以方便工具读取源SQL。
下面就兼容评估源库是mysql的情景做以下介绍,oracle、SqlServer本资料暂不做介绍。
2.环境要求:JDK1.8
3.项目结构
4.启动方式
5.兼容评估工具使用说明
选择源日志数据库类型为mysql; 选择mysql的SQL执行日志文件; 设置目标端连接信息(HighGo数据库); 点击开始; 在项目根目录/ checkResults/..文件夹下生成“xx_mysql_xx.ssc”文件,即为执行得到结果。
6.生成兼容报告工具使用说明
选择SQL语法兼容评估工具生成的“xx.ssc”文件; 点击开始,生成HTML类型的报告,报告路径: 项目根目录/reports/reports_xx/...
02
SQL语法兼容评估使用
(以mysql为例)
mysql数据库获取SQL需要依赖mysql的日志,下面介绍开启mysql日志的过程。
1.查看日志配置
如果general_log设置为OFF,说明日志功能处于关闭状态,而且日志文件无效或不存在,需要将其开启。
如果general_log设置为ON,说明日志功能已经打开,可以在general_log_file路径中找到日志文件。否则,就用上面命令开启日志功能。
注意:在抓取新的一次业务sql之前需要将老的日志进行清理,确保日志中不会有大量不相关的记录。
2.工具使用
03
SQL检查生成报告工具的使用
1.选择ssc源文件
2.生成兼容报告