数据库迁移人大金仓数据库
迁移前的准备工作
安装官方的kdts和KStudio工具
方案说明
一、数据库迁移:可以使用kdts进行数据库的按照先迁移表结构、后数据的顺序迁移(kdts的使用可以参考官方文档)
其他参考文档
人大金仓官网:https://download.kingbase.com.cn/xzzx/index.htm
迁移实例:1.Mysql迁移到kingbase(人大金仓)全过程方案(java)_mysql迁移kingbase-CSDN博客
2.Mysql迁移至KingBase(金仓数据库)避坑指南-Java版_mysql数据库移植到kingbase-CSDN博客
迁移过程的注意事项
- 根据人大金仓的版本不同,迁移过程的适配兼容也不同,具体问题具体处理
- mysql5.7表结构迁移kingbase8.6,数据类型bit(1)映射人大金仓boolean
- mysql的bit(1)数据库类型人大金仓8.6不兼容,可以复制一个库,将表里面的字段类型调整为varchar后导出数据,然后再导入人大金仓
二、项目适配
- 引入人大金仓的驱动依赖
<dependency><groupId>cn.com.kingbase</groupId><artifactId>kingbase8</artifactId><version>8.6.0</version> </dependency>
- 数据源配置修改,这里以基础平台为例:
- url=jdbc:kingbase8://172.16.26.196:54321/xxx?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&wait_timeout=1814400&serverTimezone=Asia/Shanghai¤tSchema=xx_dev,sys_catalog
- driverClassName=com.kingbase8.Driver
注意事项
A、数据源管理druid不完全兼容kingbase,其中filter:wall 目前不支持kingbase需要去掉,否则启动不了
B、url配置中currentSchema=xx_dev,sys_catalog为模式配置,其中xx_dev为模式名,sys_catalog为固定值,作用为sql查询时表名和系统冲突时,指定查询表名
- 项目中的sql语句适配注意事项
- 函数的区分可参照人大金仓的文档
- 所有的涉及到的函数无论文档是否说明有区别,都要验证是否能正常执行和是否达到预期
三、一些需要注意的常用的函数适配整理(人大金仓文档没提及的或者错误的)
-
mysql中NOW()与kingbase精度不一致,但是可以使用CURRENT_TIMESTAMP()替换,这两者精度一致
-
mysql中DATE()函数kingbase不兼容,根据具体的需求决定是否直接不用或跟据需求用如DATE_TRUNC(String,date|datetime|timestamp),其中str为精度修饰,如year、month、day、hour,列如DATE_TRUNC(‘day’,CURRENT_TIMESTAMP())
-
DATE_ADD(8.6版本该函数不存在)、DATE_SUB加减时间函数中的单位数量格式不兼容,比如mysql中为DATE_SUB(NOW(),INTERVAL 1 DAY),则kingbase8.6中必须改为DATE_SUB(CURRENT_TIMESTAMP(),INTERVAL ‘1’ DAY),否则kingbase语法不通过
-
mysql中的date_format()在kingbase中不兼容(8.6版本验证兼容),用TO_CHAR()平替
-
kingbase中的TIMESTAMPDIFF()函数功能虽然和mysql一致,但单位需要用单引号,否则语法错误,如TIMESTAMPDIFF(‘SECOND’,a.from_time,a.end_time)
-
递归查询的适配例子,
mysql语句select * from (select classify_id,classify_parent,classify_code,classify_name,remark from base_major_classify where classify_parent is not null ) rd,(select @pid := #{parentId}) pd where FIND_IN_SET(classify_parent,@pid)>0 and @pid := CONCAT(@pid,',',classify_id)
kingbase语句
WITH RECURSIVE subclassify AS (SELECT classify_id,classify_parent,classify_code,classify_name,remarkFROM base_major_classifyWHERE classify_parent IS NOT NULL AND FIND_IN_SET(classify_parent, #{parentId}) > 0UNION ALLSELECT bct.classify_id, bct.classify_parent, bct.classify_code, bct.classify_name, bct.remarkFROM base_major_classify bctJOIN subclassify st ON bct.classify_parent = st.classify_id)SELECT *FROM subclassify
四、工作流初始化的适配
@Aspect @Component @RequiredArgsConstructor public class KingbaseSupport {private final ProcessEngineConfigurationImpl processEngineConfiguration;@Pointcut("execution(* org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl.buildProcessEngine())")public void access() {}@Before("access()")public void before() {processEngineConfiguration.setDatabaseType("mysql");} }
数据库操作命令
连接数据库
ksql -h <hostname> -U <username> -d <database> -p <port>
退出 /q
打包数据库
sys_dump -Usystem -duser1 -p54321 -Fc >D:\list\test2.dmp
还原数据库
./sys_restore -h127.0.0.1 -p54321 -Usystem -d test /xx/bushu/xx-int.dmp
./sys_restore -h127.0.0.1 -p54321 -Usystem -d test /xx/bushu/dump.dmp
服务器启动 zk
/usr/local/zookeeper-3.9.2/bin/zkServer.sh start
服务器启动 tongweb
/data/TongWeb7.0.4.9_M3_Standard_Linux/bin/startserverbg.sh
数据库默认登录执行命令路径:
/data/Kingbase/ES/V8/KESRealPro/V008R006C008B0020/Server/bin
连接数据库:./ksql -U system -d test 默认用户 指定test数据库
查看数据库
select datname from sys_database;
查看系统用户
select * from sys_user;
创建用户
create user user1 with superuser password 'password';
创建数据库,并赋权给创建的用户
create database test with owner='user1' encoding utf8;
查看表:
SELECT table_name as tbName from information_schema.TABLES where table_schema='test_online';
还原数据库dmp文件
./sys_restore -h 127.0.0.1 -p 54321 -U system -W -d xxx/data/data_bak/test_online.dmp
./sys_restore -h 127.0.0.1 -p 54321 -U system -W -d user1 /data/data_bak/int.dmp
本地调试
1.本地启动
C:\Program Files\Kingbase\ES\V9\KESRealPro\V009R001C001B0025\Server\bin>sys_ctl.exe -D "C:\Program Files\Kingbase\ES\V9\data" start
2.安装 jar驱动
mvn install:install-file -Dfile=D:\hibernate-4.dialect.jar -DgroupId=com.kingbase8 -DartifactId=kingbase8 -Dversion=8.6.0 -Dpackaging=jar
3.查询表数量 SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'your_database_name';
select * from sys_stat_activity;//查看连接
-- 查看最大并发连接量
show max_connections;
-- 查看当前连接数
select connections();
-- 查看连接详情
select * from sys_stat_activity;
-- 关闭空闲连接
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE state='idle';
--查询license有效期
select GET_LICENSE_VALIDDAYS();
问题集合
迁移数据问题 ps:用户移植:最好创建的账号名字和源数据库(mysql)账号同名
1.账号权限设置 默认login权限 创建时可用system用户赋予 create update等权限
2.外键问题 迁移时有外键的表存在迁移顺序问题,经查验 可利用迁移工具-迁移任务-详情页面进行二次迁移即可
3.主键自增问题 人大金仓主键自增函数 auto_increment 不兼容 系统自带 serial (bigserial)类型(还未查验可用性。。)
4.大小写兼容问题 兼容配置里
5.mysql 里以 sys_ 开头的 人大金仓不支持 会默认为系统表 目前处理方案 修改sql 表名改为 模式名+表名
6.提示TINYINT无法转到boolean 表字段类型从tinyint改成boolean.(或者在用kts迁移工具迁移时,映射tinyint到boolean)
7.查询条件类型要保持统一 例 del_flag 数据库内为 char sql里del_flag ='0' 不能 del_flag =0
8.如果有acticity工作流 act_ge_property bixuqianyi
9.DATE_FORMAT 不兼容 改 to_char 注意只替换mapper文件的 配置的xml里不要改
10.char 类型 要转varchar 尤其是查询用到的字段
11.从数据库拷过来的sql 带‘ 的要干掉
12.xx_int 3.0服务文件下载会跳转指向nginx
13.修改数据库ora_input_emptystr_isnull参数为off。ora_input_emptystr_isnull=on的场景:空字符串''使用=''数据库会将输入的空字符串作为null值处理,作为null值的时候不能匹配到数据
14.date()类型数据兼容性不高 建议都用Timestemp 且要进行精度设置(人大金仓有精度值控制,跟mysql不一样)
修改sql
ALTER TABLE xxx.sys_config MODIFY data_type varchar (100);
15.人大金仓工具 以项目pom文件sql连接配置可增加¤tSchema=xxxx,sys_catalog 配置 从而可避免表名与系统关键词重复