基于MySQL兼容性的开发问题

参考官方文档进行创建msyql的兼容库,所有操作都做了,dbeaver工具通过连接mysql 方式连接上了,然后进行表新建报错,右键建表
Error creating new object

答案内容由AI生成,仅供参考:
:white_check_mark: 总结与建议

项目 建议
连接工具 首选 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

以下是对此问题的全面分析和解决方案建议。


:magnifying_glass_tilted_left: 问题核心

错误信息表明:

查询中引用了不存在的列 kc.REFERENCED_TABLE_NAME

这通常是由于 DBeaver 在图形界面创建表的过程中,尝试访问某些 INFORMATION_SCHEMA 视图(如外键约束相关视图)以获取元数据,但 openGauss 的 MySQL 兼容模式下这些视图或字段不完整或名称不一致,导致列不存在。


:puzzle_piece: 根本原因分析

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 错误。

:white_check_mark: 正确连接方式:使用 PostgreSQL 模式或专用驱动

推荐方案一:使用 PostgreSQL 协议连接(推荐且稳定)

openGauss 原生兼容 PostgreSQL 协议,DBeaver 应通过 PostgreSQL 连接方式 连接:

步骤如下:

  1. 新建连接 → 选择 PostgreSQL
  2. 填写以下信息:
    • 主机:openGauss 服务器 IP
    • 端口:默认 5432
    • 数据库:目标数据库名(如 mysql_to_opengauss
    • 用户名/密码:具有登录权限的账户
  3. 使用官方 JDBC 驱动:
    • 下载 opengauss-jdbc-*.jar
    • 在 DBeaver 驱动设置中添加此 JAR 文件
  4. 测试连接 → 完成

:white_check_mark: 优势:避开 MySQL 兼容层的不稳定性,直接利用 openGauss 的 PostgreSQL 兼容性。


推荐方案二:使用 GaussDB / MogDB 模式连接(绕过语法解析问题)

有案例表明:

将 DBeaver 的数据库类型设置为 GaussDBMogDB,而非 MySQL 或 PostgreSQL,可避免语法解析错误。

原因:

  • DBeaver 社区已为 GaussDB 和 MogDB 提供更好的语法解析支持。
  • MogDB 是基于 openGauss 的商业发行版,其 DBeaver 插件对 Oracle/MySQL 风格语法处理更完善。
  • 切换后,DBeaver 不再强制解析 MySQL 的 INFORMATION_SCHEMA 结构,从而规避错误。

:pushpin: 参考资料:

在 DBeaver 中切换为 MogDB 类型连接后,可以成功避免对 Oracle 风格存储过程或 MySQL 元数据列的错误解析。


推荐方案三:开发专用 DBeaver Driver for openGauss

目前已有社区项目致力于:

为 openGauss 开发专用的 DBeaver 图形化工具驱动

目的:

  • 让 DBeaver 正确识别 openGauss 的分区表、兼容模式、系统视图等特性
  • 避免误将 openGauss 当作 PostgreSQL 或 MySQL 来处理元数据

:magnifying_glass_tilted_left: 相关项目:

开源数据库图形化工具 DBeaver 对 openGauss 的兼容性增强 —— 暑期 2021 开源软件供应链点亮计划项目之一


:gear: 如何正确启用 openGauss 的 MySQL 兼容模式?

即便使用 PostgreSQL 模式连接,仍需确保数据库具备 MySQL 语法支持。

1. 创建支持 MySQL 兼容的数据库

CREATE DATABASE mysql_compatible_db 
    WITH 
    db_compatibility = 'B' 
    TEMPLATE = template0;
  • db_compatibility = 'B' 表示启用 B 类数据库模式,即 MySQL 兼容模式。
  • 此模式支持大多数 MySQL 语法,如 RENAME TABLESHOW TABLES 等。

2. 验证兼容模式

SELECT datname, datcompatibility 
FROM pg_database 
WHERE datname = 'mysql_compatible_db';

预期输出:

       datname       | datcompatibility
---------------------|------------------
mysql_compatible_db | B

:hammer_and_wrench: 临时解决方案:手动建表绕过 GUI 错误

如果必须使用 DBeaver 建表,可采取以下替代方式:

方法一:使用 SQL 编辑器手动创建表

CREATE TABLE test_table (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    created_at TIMESTAMP DEFAULT NOW()
);

:white_check_mark: 绕过 GUI 元数据查询,直接执行 DDL,成功率更高。

方法二:启用 useOldAliasMetadataBehavior 参数(若适用)

某些 JDBC 连接可通过参数控制元数据行为:

?useOldAliasMetadataBehavior=true

但这主要适用于 MySQL 客户端,在 openGauss 中效果有限。


:prohibited: 已知限制(影响兼容性)

openGauss 当前在 MySQL 兼容方面存在以下限制:

限制项 说明
psycopg2 不兼容 Python 的 psycopg2 驱动无法连接 openGauss,因其通信协议已有差异
空字符串与 NULL 不区分 默认情况下,openGauss 不将空字符串视作独立值
自增列限制 SERIALGENERATED BY DEFAULT AS IDENTITY 在某些 ALTER TABLE 中受限
uuid_generate_v4() 缺失 无内置 UUID 生成函数,需手动扩展

:white_check_mark: 总结与建议

项目 建议
连接工具 首选 DBeaver + PostgreSQL 模式 + openGauss JDBC 驱动
数据库兼容模式 设置 db_compatibility = 'B' 启用 MySQL 兼容
建表操作 暂时避免使用 GUI 建表,改用 SQL 手动创建
元数据错误 错误 column kc.REFERENCED_TABLE_NAME does not exist 是因 DBeaver 误判系统视图结构所致
长期方案 社区推动开发 专用 openGauss DBeaver Driver,提升图形化支持

:books: 参考文档


如需进一步排查,请提供:

  1. openGauss 版本(如 6.0.2 或 7.0)
  2. DBeaver 版本
  3. JDBC 驱动版本
  4. 是否启用了 Dolphin 扩展

以便更精准定位兼容性配置问题。

请问使用的数据库是什么版本。

7.0.0 RC3版本做了MySQL的系统表兼容,应该没有这个问题。