文章目录
- 数据库连接配置调整
- [SQL 语法兼容性检查](#SQL 语法兼容性检查)
- 数据迁移
- 迁移后项目功能状态
- KingBase的后续使用参考资料
数据库连接配置调整
驱动和连接字符串修改:
- 在项目的配置文件(如 Spring Boot 项目中的application.properties或application.yml)中,将 MySQL 的驱动类名和连接字符串替换为人大金仓数据库对应的内容。
- 对于 MySQL,连接字符串通常是
jdbc:mysql://localhost:3306/your_database_name
,驱动类名是com.mysql.cj.jdbc.Driver
。而人大金仓数据库的连接字符串一般是jdbc:kingbase8://localhost:54321/your_database_name?currentSchema=mycnblog
,驱动类名是com.kingbase8.Driver
。 - 例如,在application.properties文件中修改如下:
原 MySQL 配置:
xml
spring.datasource.driver - class - name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/your_database_name
- 修改为人大金仓数据库配置:
xml
spring.datasource.driver - class - name=com.kingbase8.Driver
spring.datasource.url=jdbc:kingbase8://localhost:54321/your_database_name
用户名和密码:
同时,确保数据库用户名和密码正确配置。如果在 MySQL 和人大金仓数据库中的用户名和密码不同,需要在配置文件中更新为人大金仓数据库的登录凭证。
SQL 语法兼容性检查
数据类型差异处理:
KingbaseES 对 MySQL的基本数据类型如数值类型(整型、浮点型、定点数类型)、文本字符串类型(CHAR、VARCHAR、TINYTEXT、MEDIUMTEXT、LONGTEXT)、位类型、日期时间类型(YEAR、TIME、DATE、DATETIME、TIMESTAMP)、枚举类型ENUM、集合类型SET、二进制类型(BINARY、VARBINARY、BLOB)、空间类型(GEOMETRY、POINT、LINESTRING、POLYGON)、JSON类型(JSON对象、JSON数组)可以原生支持,或者通过转换进行支持
函数差异:
-
兼容MySQL常用的日期时间函数
-
兼容数值函数,如:ABS、ACOS、CEIL、CEILING等
-
兼容BIT_LENGTH、CHAR_LENGTH、CONCAT、FIND_IN_SET、OCTET_LENGTH等字符函数
-
兼容AVG、BIT_AND、BIT_OR、GROUP_CONCAT、STDDEV_POP等聚集函数
-
兼容CUME_DIST、DENSE_RANK、FIRST_VALUE、LAST_VALUE等窗口函数
-
兼容JSON函数
-
兼容和base64的转换函数:to_base64、from_base64等
SQL语句
在 KingbasES 中,对大多数常用的 MySQL特有 SQL 语句均提供了原生支持。这项措施使得 MySQL 应用程序在 KingbaseES 系统中通常只需很少的代码变动就可正常运行。
- 以下列出不兼容的sql
sql | MySQL | KingBase | 描述 |
---|---|---|---|
位操作符: # | 不支持 | 支持 | #是位异或 操作符。它用于对两个二进制数的每一位进行异或运算。 |
RLIKE | 支持 | 不支持 | 用于正则表达式匹配 |
全局临时表 | 不支持 | 支持 | 全局临时表 是一种特殊的临时表。临时表主要用于存储临时数据 ,这些数据在特定的会话或者事务处理结束后通常会自动删除 。而全局临时表与普通临时表的区别在于,它可以在多个会话 之间共享数据,并且在所有引用它的会话都结束后,全局临时表中的数据才会被清除。 |
序列 | 不支持 | 支持 | 序列 是一种数据库对象,用于生成唯一 的、按照一定规则递增 或递减 的数值序列。通常用于为主键或其他需要唯一标识的列提供自动增长的数值。例如,在一个包含用户信息的表中,用户 ID 列需要一个唯一的、递增的数值作为标识,就可以使用序列来为每次插入新用户记录时生成新的用户 ID。 |
包 | 不支持 | 支持 | 在数据库领域,"包" 是一种将相关的数据库对象(如存储过程、函数、变量、游标等)组合在一起的机制。它提供了一种组织 和封装 数据库逻辑的方式,类似于面向对象编程中的类,使得数据库开发更加模块化、易于管理和维护。传统的 MySQL 没有像一些高级数据库(如 Oracle、Kingbase)那样提供包的概念。这意味着在 MySQL 中,没有直接的语法来创建一个包含多个相关数据库对象的包结构。MySQL 通过其他方式来实现类似的功能整合 。例如,通过合理的数据库架构设计 和命名规范 ,将相关的存储过程和函数放在同一个数据库中,并通过良好的注释和文档来表明它们之间的关联。但这种方式没有像包那样提供严格的封装和访问控制机制。 |
LOGFILE GROUP | 支持 | 不支持 | 1. MySQL 中的情况 : 在 MySQL 中,支持日志文件组(LOGFILE GROUP)。在 MySQL 的某些存储引擎(如 InnoDB)中,日志文件组用于存储事务日志,这些日志可以帮助数据库在系统故障、意外关闭等情况下恢复数据。例如,InnoDB 存储引擎使用日志文件组来实现预写式日志(Write - Ahead Logging,WAL)机制。通过将事务的修改操作先记录到日志文件组中的日志文件中,然后再将修改应用到实际的数据文件,这样在数据库出现故障时,可以根据日志文件中的记录来恢复未完成的事务,从而保证数据的完整性。2. 在 Kingbase 中,虽然没有 LOGFILE GROUP,但有类似的日志机制,如重做日志(Redo Log)等。这些日志系统在后台默默地工作,记录数据库的更改操作,并且在数据库启动、恢复等过程中发挥关键作用。开发人员和管理员通常不需要像在 MySQL 中管理日志文件组那样直接操作这些日志组件,而是通过 Kingbase 提供的备份、恢复工具和一些系统参数来间接管理数据库的恢复性能和数据完整性。例如,通过配置备份策略、检查点(Checkpoint)频率等参数来确保数据库在出现故障时能够快速、准确地恢复。 |
外部表 | 不支持 | 支持 | 外部表是一种特殊的数据库表,它的数据存储在数据库外部的文件(如文本文件、CSV 文件、XML 文件等)中。通过定义外部表,数据库可以像访问内部普通表一样访问外部文件中的数据,提供了一种将外部数据集成到数据库环境中的方式。 |
DBLINK | 不支持 | 支持 | DBLINK 是一种数据库对象,用于在一个数据库实例与另一个数据库实例之间建立连接通道。通过这个连接,可以在本地数据库中访问远程数据库中的对象(如表、视图、存储过程等),就好像这些远程对象是本地数据库的一部分一样。这为分布式数据库应用场景提供了强大的支持,使得不同数据库之间的数据共享和交互变得更加便捷。 |
DO | 支持 | 支持(有差异) | 在 MySQL 中 ,DO是一个执行表达式但不返回结果集的语句。它主要用于执行存储过程或者函数调用,并且丢弃返回值(如果有的话)。例如,当调用一个存储过程只是为了执行其中的操作逻辑(如插入、更新、删除数据等操作),而不需要返回结果时,可以使用DO语句。 Kingbase(人大金仓数据库) 没有与 MySQL 中DO语句完全相同的语法和功能。在 Kingbase 中,调用存储过程通常会返回结果集(如果存储过程有返回值的话),并且使用的语法与 MySQL 有所不同。 |
insert delayed | 支持 | 不支持 | 在 MySQL 中,INSERT DELAYED是一种特殊的插入语句。当使用INSERT DELAYED时,MySQL 会将插入操作放入一个内部队列 ,然后立即返回给客户端,而不是等待插入操作实际完成。这样客户端就可以继续执行其他操作,而插入操作会在后台由 MySQL 服务器在适当的时候处理。这种方式主要用于在高并发写入场景下,提高客户端的响应速度。 |
set password for | 支持 | 不支持 | 在 MySQL 中,SET PASSWORD FOR语句用于设置用户的密码。它提供了一种灵活的方式来管理用户账户的安全性。可以通过这个语句为特定用户设置新密码,包括为本地用户、远程用户或者通过特定主机连接的用户设置密码。在 Kingbase 中,通常使用ALTER USER语句来修改用户密码。 |
check/checksum table | 支持 | 不支持 | CHECK(表检查) 在 MySQL 中,CHECK语句主要用于检查表的完整性。对于某些存储引擎(如 MyISAM),它可以检查表是否存在错误,比如索引是否损坏、数据行是否有问题等。不过,不同存储引擎对CHECK命令的支持程度有所不同。例如,InnoDB 存储引擎会自动处理很多数据完整性的问题,CHECK操作对它的作用相对有限。CHECKSUM TABLE(计算表的校验和) CHECKSUM TABLE用于计算并返回一个或多个表的校验和。校验和是根据表中的数据内容计算出来的一个数值,它可以用于快速比较表在不同时间点的数据完整性。如果表的数据发生了变化,校验和通常也会改变。 |
show语句 | 支持 | 支持(有差异) | |
foreach语句 | 不支持 | 支持 | FOREACH是一种循环控制结构,用于遍历数组、集合或其他可迭代的数据结构中的元素。在数据库环境中,当涉及到处理批量数据,如对表中的多行数据进行相同的操作,或者对一个数组类型的变量中的多个元素进行处理时,FOREACH循环可以提供高效且简洁的方式来完成任务。 |
continue语句 | 不支持 | 支持 | 在程序设计中,CONTINUE语句是一种控制流语句。通常用于循环结构(如FOR循环、WHILE循环等)中,当执行到CONTINUE语句时,它会跳过当前循环体中剩余的语句,直接进入下一次循环迭代。这样可以根据特定的条件跳过某些不必要的操作,提高程序的执行效率和灵活性。 |
exit语句 | 不支持 | 支持 | 在一个存储过程中,如果满足某个条件,可以使用EXIT语句来立即终止存储过程的执行。 |
execute immediate语句 | 不支持 | 支持 | 支持的含义:在 Kingbase(人大金仓数据库)中,EXECUTE IMMEDIATE语句提供了一种直接执行动态 SQL 的方式。它允许将一个包含 SQL 语句的字符串变量直接作为参数传递给这个语句,数据库引擎会立即执行这个动态构建的 SQL 语句。 |
异常处理exception语句 | 不支持 | 支持 | 在数据库编程中,异常处理是一种机制,用于捕获和处理在程序执行过程中出现的错误或异常情况。这些异常可能包括数据库操作错误(如插入违反约束的数据、查询不存在的表等)、运行时错误(如变量未初始化、除数为零等)或者外部资源访问错误(如网络故障导致的数据库连接中断)等。通过使用异常处理语句,可以使程序更加健壮,避免因为异常导致程序崩溃,并且能够在出现异常时执行一些特定的恢复或报告操作。 |
- SAVEPOINT、ROLLBACK TO SAVEPOINT、RELEASE SAVEPOINT等
点击查看详细的sql差异详情1
点击查看详细的sql差异详情2
客户端 SQL 交互工具
在实际应用中,通常客户 DDL 脚本和报表是通过 SQL 交互工具移植的。针对这种情况,KingbaseES 提供了如下 SQL 交互工具:
ksql
:命令行的 SQL 交互工具,类似 MySQL 的 命令行。
Kstudio
:图形化的 SQL 交互工具,类似 MySQL的图形化工具。
通过上述工具,用户可连接数据库服务器,运行数据库实用程序,发送 SQL 语句,运行 SQL 脚本,或运行KingbaseES 数据库管理命令实施数据库管理等。
数据迁移
数据库、用户移植
数据库是各种 SQL 和 PL/SQL 数据库对象的存放容器,而用户是这些对象的管理者和使用者。因此,在迁移数据库对象之前,一般应先迁移数据库、用户。
那么,如何移植这些内容呢?应在目的数据库 KingbaseES 上创建与源数据库 MySQL同名的数据库、用户。
另外,所创建数据库的字符集应与 MySQL数据库字符集一致.
数据迁移工具使用:
使用KingBase自带的迁移工具(KDTS进行数据迁移).
数据库迁移工具在完全安装时已经安装好了, 点击开始, 找到数据库迁移工具, 双击打开.
-
然后在浏览器中输入url:
http://127.0.0.1:54523
, 使用在金仓官网注册的账号进行登录. -
登录成功后在数据源管理中添加源库和目标库连接. 在添加时需要输入必要的连接信息.
-
之后在迁移任务管理中新建迁移任务, 按照指引填写必要的对比信息.
迁移过程中的问题及解决方案
- 数据类型转换的问题:
在新建迁移任务时, 最后一步是配置数据类型的参数, 这里有一些参数根据自己的需要进行更改, 否则可能会造成数据缺失
等的问题. 如图
针对源数据类型是varchar
时, 在源库中制定了长度的, 目标库中也会指定长度. 在源库中没有指定长度时,KingBase
会默认长度为1, 这样在迁移过程中会对数据进行截取. 造成数据缺失
的情况. 可以在配置中进行更改从而防止此问题.
以上例为参考, 对其他类型的数据也需要进行必要配置. 以保证数据完整性和可用性. - 持续更新中...
迁移后项目功能状态
目前正常.