人大金仓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就不管用了

相关推荐
叼烟扛炮16 小时前
Linux 学习笔记(五十六):IO 多路复用初探——select 的“三宗罪”
linux·服务器·数据库·笔记·学习·php
.痞老板.18 小时前
mysql初阶--数据库基础
数据库·mysql
城北徐宫19 小时前
MySQL约束条件一览
数据库·mysql
ClouGence21 小时前
数据库变更审批困局,被这个开源工具解决了
数据库·开源
TDengine (老段)1 天前
TDengine IDMP 十大实用功能(9)
大数据·数据库·人工智能·物联网·时序数据库·tdengine·idmp
starrocks_stella1 天前
EMR Serverless StarRocks Object Table:用 SQL 连接 OSS 文件与多模态 AI
数据库
这个DBA有点耶1 天前
以为自增ID只是有空洞?聊聊双主架构下无声的“数据覆盖”
数据库·mysql·dba
钱栈up1 天前
内网全断,怎么核实高炉和烧结系统的数据库对接信息
数据库
weavecodes1 天前
双层缓存与权限实时生效:织码在线教育系统的 Caffeine + Redis 设计
数据库
bksczm1 天前
InnoDB 页结构详解:页类型、页头页尾、数据行与页目录
数据库·mysql