# compatibility-assessment_4
**Repository Path**: yuchao111222/compatibility-assessment_4
## Basic Information
- **Project Name**: compatibility-assessment_4
- **Description**: openGauss兼容性评估工具
- **Primary Language**: Java
- **License**: MulanPSL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 22
- **Created**: 2023-10-30
- **Last Updated**: 2023-11-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# compatibility-assessment
#### 工具介绍
openGauss兼容性评估工具,支持从多个场景下获取sql语句进行兼容性评估,并输出评估报告。
- 支持从mysql端采集sql语句,支持从mysql端采集以下几种sql类型:
(1). 对象定义语句(ddl)。
(2). 慢sql语句。此类sql通过查询mysql.slow_log表获得,需要用户开启慢sql记录至该表中。
(3). 全量sql语句。此类sql通过查询mysql.general_log表获得,同样需要用户开启general log记录至该表中。
- 支持从文件中获取sql语句,支持以下几种文件类型:
(1). sql文件。
(2). mysql数据库生成的general log日志。
(3). mysql数据库生成的slow log日志。
(4). mybatis映射文件。
兼容性评估的结果包括完全兼容、语法兼容、不兼容、不支持评估。具体介绍参考https://gitee.com/opengauss/Plugin/tree/master/contrib/assessment
社区提供兼容性评估工具软件包地址:https://opengauss.obs.cn-south-1.myhuaweicloud.com/latest/tools/compatibility-assessment-5.1.0.tar.gz
#### 评估前准备
在进行评估前,需要安装openGauss数据库节点,并保证该节点能加载到assessment插件,可选插件为dolphin插件。
社区提供的数据库构建包中已包含对应插件。若需要手动编译插件,可参考
https://gitee.com/opengauss/Plugin/tree/master/contrib/assessment
#### 源码安装
通过git命令下载源代码:
```
https://gitee.com/opengauss/compatibility-assessment.git
```
进入compatibility-assessment目录,执行sh build.sh进行编译获得可执行jar包compatibility-assessment-5.1.0-exec.jar。
java版本:open JDK11及以上
maven版本:3.6.3及以上
#### 使用说明
社区提供的兼容性评估工具软件包解压后包含start.sh,compatibility-assessment-5.1.0.jar和assessment,properties三个文件。
使用如下命令启动评估:
```
sh start.sh -d [file|collect] -c assessment.properties -o report.html
```
上述命令中,-d用于指定sql语句来源。file表示sql以文件形式输入,collect表示从mysql端采集数据。两种输入形式均需要在配置文件中配置相关的信息。
-c用于指定配置文件路径,该参数为可选。若不指定,则默认使用当前目录下的assessment.properties作为配置文件。
-o用于指定输出报告文件,该参数为可选。报告文件必须为.html格式,若不指定,则默认在当前路径下生成report.html文件。
不同输入形式下,配置文件使用方法如下:
- 若sql以文件形式出入(-d file),需要配置输入文件的目录,示例如下:
```
filedir = /data/testfiles/
#opengauss端数据库用户,禁止使用数据库初始用户
opengauss.user = opengauss
opengauss.password = opengauss123
opengauss.port = 5432
opengauss.host = 127.0.0.1
#指定评估库
opengauss.dbname = assessment_1688719386596
#指定评估库和提供操作系统用户名和密码二选一
osuser = opengauss_init_user
ospassword = opengauss_passwd
```
工具支持四种类型的输入文件,将不同类型的文件放入指定的目录下,工具扫描目录并通过后缀对文件类型进行识别,sql文件、general log日志、slow log日志、mybatis映射文件对应的后缀分别为:.sql, .general,.slow,.xml。为了区分general log日志和slow log日志,目前需要手动修改文件后缀名以便工具自动识别。
- 若从mysql数据库端采集sql(-d collect),需要在配置文件中指定评估类型,sql语句类型以及mysql数据库信息。示例如下:
```
#评估类型,object:对象评估; sql:评估sql语句; all: 同时进行对象评估和sql语句评估。
assessmenttype = sql
#sql类型, slow:评估慢sql; general:评估全量sql。该参数仅需要在assessmenttype为sql或all时指定,用于表示需进行评估的sql语句类型
sqltype = slow
mysql.password = mysql123
mysql.user = mysql
mysql.port = 3389
mysql.host = 127.0.0.1
#通过mysql数据库端获取sql时,需指定mysql端的库名
mysql.dbname = test
opengauss.user = opengauss
opengauss.password = opengauss123
opengauss.port = 5432
opengauss.host = 127.0.0.1
opengauss.dbname = assessment_1688719386596
#指定评估库和提供操作系统用户名和密码二选一
osuser = omm
ospassword = opengauss_passwd
```
进行评估之前,用户可以手动创建好评估库,并使用create extension assessment加载评估插件,然后通过opengauss.dbname指定评估库;或者用户不指定评估库,通过提供数据库节点所在主机的操作系统用户名和密码,由工具自动创建评估库,工具自动创建评估库是通过ssh远程登陆到对应主机,并通过gsql连接到数据库节点,然后创建对应的评估库,所以使用这种方式进行评估时,用户需要保证osuser登录主机时能自动加载到数据库环境变量。当opengauss.dbname和(osuser, ospassword)同时指定时,会优先使用opengauss.dbname指定的库作为评估库。
需要注意的是,配置文件中opengauss端的用户名不能为数据库初始用户,因为opengauss端禁止使用数据库初始用户进行远程连接。
#### 注意事项
1、评估sql文件,文件中的sql以分号加回车分隔。若sql本身包含分号,限制在sql语句前后加上delimiter //和delimiter ;以保证正确解析sql语句。示例:
```
select * from t1;
select * from
t2;
delimiter //
create procedure showWebsite1() begin select * from website; end
delimiter ;
```
2、从mybatis的mapper文件中提取sql,原始xml文件中占位符#{}使用$1,$2...进行替换,占位符${field}直接替换为filed。对于动态sql标签,沿用mybatis原本的提取规则,但并不对动态标签属性进行类型的校验,仅提取静态sql片段。提取规则及举例如下:
##### (1). foreach标签
```
```
```
提取结果:select * from user where id in ($0)
```
##### (2). if标签
对if标签的提取规则为:将每个if标签中的sql片段提取后进行拼接得到最终的sql。
```
```
```
提取结果:select * from user where stage = 'A' and age = $0 and name = $1
```
##### (3). choose、when、otherwise标签
提取choose标签中首个when标签的内容。
```
```
```
提取结果:select * from user where age = $1
```