人大金仓V9系统表名字冲突,设置search_path不起作用

MySql迁移人大金仓问题

1.数据及结构迁移后,Navicat能查到表和数据,但是启动程序一直报错table xxx not exists 或者column not exists,

一般都是表名和系统表冲突导致的,Kingbase内置了sys_user,sys_config等表

如果业务表跟它同名的话会冲突,默认是去查系统表了,

Kingbase跟MySQL相比多了一层模式的概念,查询一个表时,如果未指定模式,首先会查询跟账号名称同名的模式,

如果不存在,则根据search_path进行搜索

复制代码
-- 1.未指定模式,先搜索当前用户名相同的模式,如当前账号为test_user,则搜索test_user.sys_user
--   然后根据search_path依次搜索
select * from sys_user

-- 2.直接指定模式查询
select * from 模式.sys_user

2.查看当前search_path

复制代码
show search_path

3.修改数据库的默认search_path

复制代码
-- 修改search_path
ALTER DATABASE 数据库 SET search_path TO "$user", 模式, public, sys, sys_catalog, pg_catalog;

-- 重载当前会话配置
SELECT sys_reload_conf();

-- 断开会话连接后验证
SHOW search_path

4.修改模式后仍然启动报错

一般是由于程序中连接参数指定currentSchema导致的,去除即可

业务程序中不建议指定模式,具体原因如下

当使用?currentSchema=模式名时, 会覆盖search_path的配置,

同时sys_catalog模式是系统的基础模式,存放了数据库的一些元数据,为了保证所有的对象,脚本,视图,存储过程等都能正常运行,

Kingbase的默认策略,当用户指定的模式不包含sys_catalog时,kingbase会默认将sys_catalog添加到搜索的第一位,

所以最终search_path就变成了sys_catalog, 模式名, 我们在数据库层面配置的search_path就不管用了

相关推荐
SelectDB1 小时前
Apache Doris 高性能 Open Lake Variant 读写技术解析(含对比数据)
大数据·数据库·数据分析
SelectDB1 小时前
多表 Join 与实时更新:Apache Doris 建表、调优与验证全流程(附 ClickHouse 对照)
大数据·数据库·数据分析
鸽芷咕1 小时前
金仓数据库 TB 级迁移提速实战:KDTS 线程数怎么算、JVM 内存怎么给、参数怎么调
数据库
倔强的石头_1 小时前
慢接口定位实战:从应用日志一路追到 SQL 执行计划
数据库
考虑考虑1 小时前
SQL中的 CASE WHEN
数据库·后端·sql
SelectDB1 小时前
Doris 替换 ClickHouse:部署核查命令、常见问题排查与适配说明
大数据·数据库·数据分析
为你学会写情书1 小时前
从零搭建 SQL 数据库到 ORM 选型:Prisma 与 Drizzle 深度对比
数据库
Nturmoils1 小时前
OceanBase VS 金仓:同一组复杂 SQL,分布式与集中式架构怎么跑
数据库
旺仔不是程序员1 小时前
索引膨胀与重建:PostgreSQL REINDEX 生产实践
数据库·后端·sql