达梦数据库表找不到 relation “xxxxxx“ does not exist on node1

文章描述了一种在使用达梦数据库时遇到的错误,即程序抛出MybatisPlusException,表示无法找到名为xxxxxx的表。问题可能由于用户权限、数据库连接错误或者对象所有权变更引起。解决方案是检查并确保正确的数据库连接和用户权限配置。撤销不正确的用户权限操作后,问题得到解决。提醒在处理数据库权限和对象所有权时需谨慎。
部署运行你感兴趣的模型镜像

达梦数据库表找不到 relation "xxxxxx" does not exist on node1

问题现象

使用达梦数据库时,出现程序报错。
报错日志大概如下:
Caused by: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Error: Method queryTotal execution error of sql :
SELECT COUNT(1) FROM xxxxxxx masb
    at com.baomidou.mybatisplus.core.toolkit.ExceptionUtils.mpe(ExceptionUtils.java:39) ~[mybatis-plus-core-3.3.2.jar:3.3.2]
    at com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor.queryTotal(PaginationInterceptor.java:253) ~[mybatis-plus-extension-3.3.2.jar:3.3.2]
    at com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor.intercept(PaginationInterceptor.java:201) ~[mybatis-plus-extension-3.3.2.jar:3.3.2]
    at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) ~[mybatis-3.5.4.jar:3.5.4]
    at com.sun.proxy.$Proxy1763.prepare(Unknown Source) ~[?:?]
    at com.baomidou.mybatisplus.core.executor.MybatisSimpleExecutor.prepareStatement(MybatisSimpleExecutor.java:92) ~[mybatis-plus-core-3.3.2.jar:3.3.2]
    at com.baomidou.mybatisplus.core.executor.MybatisSimpleExecutor.doQuery(MybatisSimpleExecutor.java:66) ~[mybatis-plus-core-3.3.2.jar:3.3.2]
    at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324) ~[mybatis-3.5.4.jar:3.5.4]
    at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156) ~[mybatis-3.5.4.jar:3.5.4]
    at com.baomidou.mybatisplus.core.executor.MybatisCachingExecutor.query(MybatisCachingExecutor.java:163) ~[mybatis-plus-core-3.3.2.jar:3.3.2]
    at com.baomidou.mybatisplus.core.executor.MybatisCachingExecutor.query(MybatisCachingExecutor.java:90) ~[mybatis-plus-core-3.3.2.jar:3.3.2]
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) ~[mybatis-3.5.4.jar:3.5.4]
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140) ~[mybatis-3.5.4.jar:3.5.4]
    at sun.reflect.GeneratedMethodAccessor441.invoke(Unknown Source) ~[?:?]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_261]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_261]
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:426) ~[mybatis-spring-2.0.4.jar:2.0.4]
    ... 126 more
Caused by: org.postgresql.util.PSQLException: ERROR: relation "xxxxxx" does not exist on node1 |  |

问题原因/分析

relation "xxxxxx" does not exist on node1
报错的意思大概是xxxxx 对象(关系)在数据库节点中不存在,当前操作的是xxxxx表,也就是说xxxxx表在数据库中不存在。
但是我们通过连接数据库(DM管理工具)执行sql发现sql是可以执行的,也就是说表是存在的,但是为什么出现问题呢?
有一种很呆的可能性,就是程序连错了库了,表在A库中,但是程序连接的是B库,这种失误的可能性很低,太低级的错误大家一版情况下不会犯。
还有一种可能性,就是当前用户没有对应库表的权限。有很多种可能性会导致出现这样的场景,比如创建数据库对象的时候授权导致的,比如数据库对象的修改(比如修改表的所有者等等操作)等均可能会出现。
博主遇到的情况,是有人对数据库进行了操作,切换了数据库用户,也就是原来是A用户,现在是B用户了,但是在将A用户的表给B用户的操作过程种出现了问题,所以出现了直接连数据库可以查询到库表,通过程序去连接时提示找不到的问题(暂未分析到根本原因,但是直接原因就是这样)。

解决方案

撤销了上面的A用户库表给B用户库表操作之后,使用原来的A用户,问题迎刃而解。

其他

其他数据库,oracle,mysql等也有类似的问题,数据库对象的权限/拥有问题。所以数据库的这类非常规操作,得小心谨慎,在有足够把握时才进行操作。错误的操作可能导致原来的库表使用异常,甚至导致数据库出现问题。

您可能感兴趣的与本文相关的镜像

Yolo-v8.3

Yolo-v8.3

Yolo

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的Joseph Redmon 和Ali Farhadi 开发。 YOLO 于2015 年推出,因其高速和高精度而广受欢迎

### 解决 PostgreSQL 中 'relation does not exist' 错误 在 PostgreSQL 数据库中,`org.postgresql.util.psqlexception: relation does not exist` 错误通常示尝试访问的或视图不存在于当前数据库环境中。以下是可能的原因及解决方案: #### 1. **确认当前连接的数据库** 确保程序连接的是正确的数据库实例。如果程序连接到错误的数据库(例如连接到了一个未包含目标数据库),即使该存在于其他数据库中,也会出现此错误。可以通过以下命令检查当前连接的数据库: ```sql SELECT current_database(); ``` 如果发现连接的数据库不正确,请调整程序中的连接字符串以指向正确的数据库[^3]。 #### 2. **确认是否存在于当前模式中** 在 PostgreSQL 中,默认模式为 `public`。如果创建在其他模式中,而查询时未指定模式,则会引发此错误。可以使用以下命令列出所有模式及其: ```sql \dn -- 列出所有模式 \dt *.* -- 列出所有模式下的 ``` 如果存在于非 `public` 模式中,查询时需要明确指定模式。例如: ```sql SELECT * FROM schema_name.table_name; ``` #### 3. **检查用户权限** 即使存在,当前用户也可能没有访问该的权限。可以通过以下命令检查用户的权限: ```sql \z table_name -- 查看的访问权限 ``` 如果用户没有权限,可以授予适当的权限: ```sql GRANT SELECT, INSERT, UPDATE, DELETE ON table_name TO user_name; ``` #### 4. **确认名大小写敏感性** PostgreSQL 对未加引号的标识符会自动转换为小写。如果名在创建时使用了双引号(例如 `"MyTable"`),则查询时必须严格区分大小写并加上双引号。例如: ```sql SELECT * FROM "MyTable"; ``` #### 5. **检查数据库对象的所有者** 如果的所有者发生了更改,可能会导致权限问题或无法访问的情况。可以通过以下命令查看的所有者: ```sql SELECT tableowner FROM pg_tables WHERE tablename = 'table_name'; ``` 如果需要更改的所有者,可以使用以下命令: ```sql ALTER TABLE table_name OWNER TO new_owner; ``` #### 6. **确认 Docker 容器中的数据持久化** 如果使用 Docker 部署 PostgreSQL,并且未正确配置数据持久化路径,可能会导致容器重启后数据丢失。确保在启动容器时正确挂载数据卷: ```bash docker run \ -d \ --name postgres \ -p 5432:5432 \ -e POSTGRES_USER=postgres \ -e POSTGRES_PASSWORD=postgres \ -v ~/docker/data/postgresql/data:/var/lib/postgresql/data \ postgres ``` #### 7. **避免重复初始化数据库数据** 如果在构建服务时手动执行了 SQL 脚本,可能导致某些数据已存在,从而引发冲突。确保不要重复执行初始化脚本[^4]。 --- ### 示例代码:检查是否存在 以下是一个简单的 SQL 脚本,用于检查是否存在于当前数据库中: ```sql SELECT EXISTS ( SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'your_table_name' ); ``` --- ### 注意事项 - 如果问题仍然存在,建议检查 PostgreSQL 的日志文件以获取更多详细信息。 - 确保程序使用的 JDBC URL、用户名和密码与目标数据库匹配。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值