参考官方文档进行创建msyql的兼容库,所有操作都做了,dbeaver工具通过连接mysql 方式连接上了,然后进行表新建报错,右键建表
Error creating new object
答案内容由AI生成,仅供参考:
总结与建议
| 项目 | 建议 |
|---|---|
| 连接工具 | 首选 DBeaver + PostgreSQL 模式 + openGauss JDBC 驱动 |
| 数据库兼容模式 | 设置 db_compatibility = 'B' 启用 MySQL 兼容 |
| 建表操作 | 暂时避免使用 GUI 建表,改用 SQL 手动创建 |
| 元数据错误 | 错误 column kc.REFERENCED_TABLE_NAME does not exist 是因 DBeaver 误判系统视图结构所致 |
| 长期方案 | 社区推动开发 专用 openGauss DBeaver Driver,提升图形化支持 |
点击此处查看详细分析解答
openGauss中使用DBeaver通过MySQL方式连接建表报错问题分析
根据您提供的信息,用户在基于 openGauss 配置 MySQL协议兼容性 后,使用 DBeaver 工具以 MySQL 方式连接并尝试新建表时遇到错误:
SQL Error [28804] [HY000]: column kc.REFERENCED_TABLE_NAME does not exist
以下是对此问题的全面分析和解决方案建议。
问题核心
错误信息表明:
查询中引用了不存在的列
kc.REFERENCED_TABLE_NAME
这通常是由于 DBeaver 在图形界面创建表的过程中,尝试访问某些 INFORMATION_SCHEMA 视图(如外键约束相关视图)以获取元数据,但 openGauss 的 MySQL 兼容模式下这些视图或字段不完整或名称不一致,导致列不存在。
根本原因分析
1. openGauss 的 MySQL 兼容性为“模拟”而非“完全兼容”
- openGauss 通过 Dolphin 扩展 实现了 MySQL 协议兼容性,支持部分 MySQL 语法、连接协议和系统视图。
- 但它并非 MySQL 本身,底层基于 PostgreSQL 改造,其系统表结构仍以 PostgreSQL 模型为主。
- 虽然提供了
INFORMATION_SCHEMA兼容视图,但部分字段(如REFERENCED_TABLE_NAME)可能未映射或命名不一致。
2. DBeaver 使用 MySQL 模式连接时的行为缺陷
- 当用户选择 “MySQL” 作为数据库类型连接 openGauss 时,DBeaver 会启用 MySQL 专属的元数据查询逻辑。
- 这些查询假设 MySQL 的
INFORMATION_SCHEMA.KEY_COLUMN_USAGE等视图中包含REFERENCED_TABLE_NAME字段。 - 但在 openGauss 中:
- 即使启用了 MySQL 兼容模式,该字段可能不存在或被映射到其他字段名。
- 因此查询失败,抛出
column kc.REFERENCED_TABLE_NAME does not exist错误。
正确连接方式:使用 PostgreSQL 模式或专用驱动
推荐方案一:使用 PostgreSQL 协议连接(推荐且稳定)
openGauss 原生兼容 PostgreSQL 协议,DBeaver 应通过 PostgreSQL 连接方式 连接:
步骤如下:
- 新建连接 → 选择 PostgreSQL
- 填写以下信息:
- 主机:openGauss 服务器 IP
- 端口:默认
5432 - 数据库:目标数据库名(如
mysql_to_opengauss) - 用户名/密码:具有登录权限的账户
- 使用官方 JDBC 驱动:
- 下载
opengauss-jdbc-*.jar - 在 DBeaver 驱动设置中添加此 JAR 文件
- 下载
- 测试连接 → 完成
优势:避开 MySQL 兼容层的不稳定性,直接利用 openGauss 的 PostgreSQL 兼容性。
推荐方案二:使用 GaussDB / MogDB 模式连接(绕过语法解析问题)
有案例表明:
将 DBeaver 的数据库类型设置为 GaussDB 或 MogDB,而非 MySQL 或 PostgreSQL,可避免语法解析错误。
原因:
- DBeaver 社区已为 GaussDB 和 MogDB 提供更好的语法解析支持。
- MogDB 是基于 openGauss 的商业发行版,其 DBeaver 插件对 Oracle/MySQL 风格语法处理更完善。
- 切换后,DBeaver 不再强制解析 MySQL 的
INFORMATION_SCHEMA结构,从而规避错误。
参考资料:
在 DBeaver 中切换为 MogDB 类型连接后,可以成功避免对 Oracle 风格存储过程或 MySQL 元数据列的错误解析。
推荐方案三:开发专用 DBeaver Driver for openGauss
目前已有社区项目致力于:
为 openGauss 开发专用的 DBeaver 图形化工具驱动
目的:
- 让 DBeaver 正确识别 openGauss 的分区表、兼容模式、系统视图等特性
- 避免误将 openGauss 当作 PostgreSQL 或 MySQL 来处理元数据
相关项目:
开源数据库图形化工具 DBeaver 对 openGauss 的兼容性增强 —— 暑期 2021 开源软件供应链点亮计划项目之一
如何正确启用 openGauss 的 MySQL 兼容模式?
即便使用 PostgreSQL 模式连接,仍需确保数据库具备 MySQL 语法支持。
1. 创建支持 MySQL 兼容的数据库
CREATE DATABASE mysql_compatible_db
WITH
db_compatibility = 'B'
TEMPLATE = template0;
db_compatibility = 'B'表示启用 B 类数据库模式,即 MySQL 兼容模式。- 此模式支持大多数 MySQL 语法,如
RENAME TABLE、SHOW TABLES等。
2. 验证兼容模式
SELECT datname, datcompatibility
FROM pg_database
WHERE datname = 'mysql_compatible_db';
预期输出:
datname | datcompatibility
---------------------|------------------
mysql_compatible_db | B
临时解决方案:手动建表绕过 GUI 错误
如果必须使用 DBeaver 建表,可采取以下替代方式:
方法一:使用 SQL 编辑器手动创建表
CREATE TABLE test_table (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
created_at TIMESTAMP DEFAULT NOW()
);
绕过 GUI 元数据查询,直接执行 DDL,成功率更高。
方法二:启用 useOldAliasMetadataBehavior 参数(若适用)
某些 JDBC 连接可通过参数控制元数据行为:
?useOldAliasMetadataBehavior=true
但这主要适用于 MySQL 客户端,在 openGauss 中效果有限。
已知限制(影响兼容性)
openGauss 当前在 MySQL 兼容方面存在以下限制:
| 限制项 | 说明 |
|---|---|
psycopg2 不兼容 |
Python 的 psycopg2 驱动无法连接 openGauss,因其通信协议已有差异 |
| 空字符串与 NULL 不区分 | 默认情况下,openGauss 不将空字符串视作独立值 |
| 自增列限制 | SERIAL 或 GENERATED BY DEFAULT AS IDENTITY 在某些 ALTER TABLE 中受限 |
uuid_generate_v4() 缺失 |
无内置 UUID 生成函数,需手动扩展 |
总结与建议
| 项目 | 建议 |
|---|---|
| 连接工具 | 首选 DBeaver + PostgreSQL 模式 + openGauss JDBC 驱动 |
| 数据库兼容模式 | 设置 db_compatibility = 'B' 启用 MySQL 兼容 |
| 建表操作 | 暂时避免使用 GUI 建表,改用 SQL 手动创建 |
| 元数据错误 | 错误 column kc.REFERENCED_TABLE_NAME does not exist 是因 DBeaver 误判系统视图结构所致 |
| 长期方案 | 社区推动开发 专用 openGauss DBeaver Driver,提升图形化支持 |
参考文档
- docs.opengauss.org - 配置 MySQL 协议兼容
- DBeaver适配openGauss使用指导书
- DBEAVER连接MogDB - modb.pro
- GitHub Issue:
INFORMATION_SCHEMA.KEY_COLUMN_USAGE字段缺失问题(类似场景)
如需进一步排查,请提供:
- openGauss 版本(如 6.0.2 或 7.0)
- DBeaver 版本
- JDBC 驱动版本
- 是否启用了 Dolphin 扩展
以便更精准定位兼容性配置问题。
请问使用的数据库是什么版本。
7.0.0 RC3版本做了MySQL的系统表兼容,应该没有这个问题。
