1. 产品概述
GaussDB 是华为云推出的一款高性能、高可用、可扩展的云数据库产品,支持分布式和集中式两种部署模式。它适用于多种应用场景,包括企业级应用、数据分析和物联网等。
更多版本信息请参考:GaussDB 文档中心
高斯数据库支持的版本:
SELECT VERSION();
gaussdb (GaussDB Kernel 505.2.0 build 5a40f15c) compiled at 2024-09-20 00:15:19 commit 9967 last mr 19883 release
引擎版本: v2.8.1-RELEASE
引擎支持的高斯数据库默认是使用的 MySQL 兼容模式,所以应用程序的SQL语法和MySQL基本兼容.
IIDP目前支持高斯数据库的MySQL数据库兼容MySQL模式
SqlProvider实现: com.sie.snest.engine.db.relationdb.provider.GaussDBProvider
返回数据库类型DBType: GaussDB
com.sie.snest.engine.db.relationdb.provider.GaussDBProvider
/**
* return GaussDB
*/
@Override
public String getDBType() {
return DBType.GaussDB.getName();
}
2. 部署方案
分布式版部署方案
集中式版部署方案
3. GaussDB 数据库兼容性说明
GaussDB 支持多种兼容性模式,具体如下:
集中式部署:
A:兼容 Oracle。
B:兼容 MySQL。
PG:兼容 PostgreSQL。
分布式部署:
ORA:兼容 Oracle。
MYSQL:兼容 MySQL。
PG:兼容 PostgreSQL。
执行以下 SQL 命令,可以查看所有数据库的兼容性模式:
SELECT datname, datcompatibility FROM pg_database;
datname |datcompatibility|
-----------+----------------+
templatea |ORA |
snest_test3|MySQL |
test |MYSQL |
template1 |MYSQL |
template0 |MYSQL |
templatem |M |
postgres |MYSQL |
tpcc |MYSQL |
1. MySQL 兼容模式
IIDP只支持高斯数据库的MySQL数据库兼容MySQL模式
GaussDB 提供了对 MySQL 5.7 的兼容模式,通过设置特定的参数,可以实现与 MySQL 5.7 数据库的高度兼容。以下是具体的兼容性说明:
由于GaussDB数据库与MySQL数据库底层框架实现存在差异,GaussDB数据库与MySQL数据库仍存在部分差异。
分布式版MySQL兼容性说明
概述
MySQL数据库兼容MySQL模式
MySQL数据库兼容性M-Compatibility模式
参考文档: https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/24.7.30.10/compatibility-description/gaussdb-20-0002.html
1.1 参数设置
为了启用 MySQL 兼容模式,需要在 GaussDB 数据库中设置以下参数:
sql_compatibility:设置为 'MYSQL',以启用 MySQL 兼容模式。
b_format_version:设置为 '5.7',以指定 MySQL 的版本兼容性。
b_format_dev_version:设置为 's1',以指定开发版本的兼容性。
SHOW enable_gtm_free;
SHOW gtm_option;
show b_format_version;
show b_format_dev_version;
1.2 数据类型兼容性
GaussDB 支持 MySQL 5.7 中定义的大多数数据类型,包括但不限于:
数值类型:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT、DECIMAL、FLOAT、DOUBLE 等。
字符串类型:CHAR、VARCHAR、TEXT、BLOB 等。
日期和时间类型:DATE、TIME、DATETIME、TIMESTAMP 等。
在某些情况下,GaussDB 可能对某些数据类型的行为或限制进行了优化或调整,以适应其自身的架构和性能要求。
1.3 SQL 功能兼容性
SQL 语法:GaussDB 支持 MySQL 5.7 的大多数 SQL 语法,包括:
数据定义语言(DDL):如 CREATE TABLE、ALTER TABLE、DROP TABLE 等。
数据操纵语言(DML):如 INSERT、UPDATE、DELETE、SELECT 等。
数据控制语言(DCL):如 GRANT、REVOKE 等。
存储过程和函数:支持 MySQL 5.7 的存储过程和函数语法,用户可以创建和使用存储过程来实现复杂的业务逻辑。
视图和索引:支持视图和索引的创建和使用,用户可以通过视图简化复杂的查询操作,并利用索引提高查询性能。
事务支持:支持事务操作,确保数据的一致性和完整性。
1.4 数据库对象兼容性
表和表空间:支持 MySQL 5.7 中的表和表空间概念,用户可以创建、修改和删除表,以及管理表空间。
用户和权限管理:支持 MySQL 5.7 的用户和权限管理机制,用户可以创建和管理用户账户,并授予或撤销用户权限。
字符集和校对规则:支持 MySQL 5.7 的字符集和校对规则,用户可以根据需要选择合适的字符集和校对规则。
1.5 特殊兼容性说明
语法差异:尽管 GaussDB 努力实现与 MySQL 5.7 的高度兼容,但在某些复杂的 SQL 语法或特定功能上可能存在差异。例如,某些特定的 MySQL 函数或存储过程可能在 GaussDB 中表现略有不同。
性能优化:GaussDB 在某些场景下可能需要额外的性能优化配置,以充分发挥其性能优势。
功能限制:某些 MySQL 特性可能在 GaussDB 中不完全支持,或者需要通过其他方式实现。
2. 其他兼容模式
GaussDB 还支持其他数据库的兼容模式,例如 Oracle、PostgreSQL 和 Teradata 等。以下是简要说明:
2.1 Oracle 兼容模式
参数设置:使用参数 c='A' 或 dbcompatibility='ORA' 创建兼容 Oracle 的数据库。
功能支持:支持 Oracle 的数据类型、SQL 语法、系统函数、日期时间类型等。
2.2 PostgreSQL 兼容模式
参数设置:使用参数 dbcompatibility='PG' 创建兼容 PostgreSQL 的数据库。
功能支持:支持 PostgreSQL 的数据类型、SQL 语法和对象定义。
更多详细信息和完整兼容性说明,请参考 GaussDB 官方文档:
GaussDB 文档中心 - MySQL 兼容性概述
4. 高斯数据库不兼容项
1. 不支持唯一索引,不支持复合唯一索引
在华为GaussDB中,当出现“Cannot create index whose evaluation cannot be enforced to remote nodes”错误时,通常是因为在分布式数据库系统中创建索引时,没有包含分布列(即决定数据如何在各个节点间分布的列)。 之前的MySQL唯一索引就失效了.
主键约束的本质就是一个非空约束加一个唯一约束,重点关注这个唯一约束(通过一个唯一索引实现)。
对于hash分布表,分布列决定了这条数据将在CN(CoordinateNode协调节点)被hash分布到哪个DN(DataNode数据节点)上,所以唯一约束本质上是确保分布到这个DN的数据的唯一性。如果允许唯一约束不包含分布列,那么就会出现在不同DN上查询到相同唯一键的情况,这肯定不是期望内的。
对于复制表(replicated table), 由于每个数据在每个DN上都被存有一份,所以不存在这个问题。
所以出现这个报错的时候要么使主键的定义包含分布列,要么改用复制表,要么使用复合唯一索引,要么使用全局二级索引。
不支持原因:
使用唯一索引时: 唯一列必须包含分布式列,导致复合唯一索引失效了,因为必须带ID字段加唯一字段,就违背了复合唯一索引的定义.
使用全局二级索引:遇到下面3个错误:
ERROR: INSERT/UPDATE/DELETE/MERGE contains multiple remote queries under GTM-free mode
解决方式:开启GTM-free 模式
解决完第一个错误后,然后又遇到下面的错误:
INSERT ... SELECT ... WHERE NOT EXISTS 不支持, INSERT INTO IGNORE不支持, 改为INSERT INTO " + sql +" ON DUPLICATE KEY UPDATE NOTHING
解决方式:使用流算子或 Hint
SET enable_stream_operator=on;
或者在 SQL 语句中添加 `/*+ multinode */` Hint:
修复完上面的2个错误后,又遇到往数据库插入或更新数据时报错,提示分布键不能被更新,错误信息如下所示:
ERROR: Distributed key column can't be updated in current version
这个错误的意思是,如果列是分布式列,就不能更新该字段,这种就会导致应用程序更新失败.咨询了华为的同事.没有参数可以跳过.
因为引擎插入和更新的时候会做唯一校验,如果不支持唯一校验,不影响业务的插入和更新时的唯一校验.
2. SELECT AS 别名问题,如果别名不带标识符``或者"",PostgreSQL/GaussDB会将别名转成小写
请注意,在 PostgreSQL/GaussDB 中,关键词和不被引号修饰的标识符是大小写不敏感的。因此,如果字段不带修饰符双引号,会转换成小写.
如果自定义SQL列别名不带修饰符,这样就会导致代码获取displayName值为NULL, get("displayName")=NULL.就会导致数据库迁移的时候,不兼容.
正确的SQL写法,列别名如果是驼峰或者包含大小写的,一定要用 ``或者 ""引起来.
select display_name as displayName from meta_app;
--MySQL
displayName |
-----------------+
基础模块 |
--PostgreSQL/GaussDB
displayname |
-----------------+
基础模块
正确的SQL写法,列别名如果是驼峰或者包含大小写的
MYSQL: select display_name as `displayName` from meta_app;
GAUSSDB select display_name as `displayName` from meta_app;
PostgreSQL: select display_name as "displayName" from meta_app;
项目自定义SQL错误的示范:
SELECT param_name paramName, param_value paramValue FROM base_process_spec bps;
标准的SQL语法:
SELECT param_name "paramName", param_value `paramValue` FROM base_process_spec bps
SELECT param_name "paramName", param_value "paramValue" FROM base_process_spec bps
3. ERROR: INSERT/UPDATE/DELETE/MERGE contains multiple remote queries under GTM-free mode
-数据源:main,执行SQL失败:INSERT INTO ui_file_seed (`bucket`, `path`, `file_archive_path`, `name`, `attachment_id` , `download_path`, `id`, `create_user`, `create_date`, `app_id` , `url`, `md5`) SELECT 'apps' , '/file/document/doc/定制权限-导入模板.xlsx' , 'BOOT-INF/classes/com/sie/app/tenant/file/document/doc/定制权限-导入模板.xlsx', '下载定制权限导入模板', '04pebasn0auvo' , '/apps/2025-03-20/619344493502774957.xlsx' , 'sie-snest-tenant.master.custom_permission_import_template', 'rbac_user_superuser' , '2025-03-20 17:40:54.917', '04peack6huebq' , '/fileSystem/apps/2025-03-20/619344493502774957.xlsx' , '38ea78b3e59ef8cfbfa77ada296a71a0' FROM dual WHERE NOT EXISTS ( SELECT 1 FROM ui_file_seed WHERE id = 'sie-snest-tenant.master.custom_permission_import_template' ),异常信息:[2.0.0.1:55959/192.168.96.11:8000] ERROR: INSERT/UPDATE/DELETE/MERGE contains multiple remote queries under GTM-free mode
建议:modify your SQL to generate light-proxy or fast-query-shipping plan
问题分析
GTM-free 模式:在这种模式下,GaussDB 对分布式事务的管理方式有所限制,尤其是对涉及多个远程节点(如跨节点的子查询)的复杂查询支持较弱。
错误原因:你的 SQL 语句中使用了 INSERT ... SELECT ... WHERE NOT EXISTS,这种结构会被解析为多个远程查询,导致 GTM-free 模式下无法执行。
参考: https://support.huaweicloud.com/distributed-devg-v2-gaussdb/gaussdb-12-1095.html
解决方案
根据错误信息中的建议,你需要修改 SQL,使其生成 light-proxy 或 fast-query-shipping 计划。
4. INSERT … SELECT … WHERE NOT EXISTS 不支持, INSERT INTO IGNORE不支持, 改为INSERT INTO " + sql +" ON DUPLICATE KEY UPDATE NOTHING
5. 不支持修改分布式列的字段,比如修改主键的长度.
6. 事物回滚机制和MySQL不同,事物机制和PostgreSQL一致.
4. 用户指南
数据库管理员应具备以下能力:拥有极强的数据库技术理解能力;能够安装数据库、执行相关操作并排除故障;能够进行云数据库GaussDB管理平台(TPOPS)的日常维护。
工程师应具备以下能力:了解数据库技术常识;能够执行数据库相关的操作并排除故障。
请参考:https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/24.7.30.10/usermanual/qlh_02_0001.html
5. 数据库基本概念
数据库(Database)
数据库是存储在一起的相关数据的集合,这些数据可以被访问,管理以及更新。
数据库用于管理各类数据对象,与其他数据库隔离。创建数据对象时可以指定对应的表空间,如果不指定相应的表空间,相关的对象会默认保存在PG_DEFAULT空间中。数据库管理的对象可分布在多个表空间上。
数据块(Block)
数据块是数据库管理的基本单位,默认大小为8KB。
行(Row)
一行(元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
列(Cloumn)
每一列被当作是一个字段。每个字段中的值代表一种类型的数据。例如,一个表可能有3个字段,姓名、城市和国家。这个表就会有3列,一列代表姓名,一列代表城市,一列代表国家。表中的每一行包含3个字段的内容,姓名字段包含姓名,城市字段包含城市,国家字段包含国家。
表(Table)
表是由行与列组合成的,是数据库中用来存储数据的对象,是整个数据库系统的基础。
每张表只能属于一个数据库,也只能对应到一个表空间。每张表对应的数据文件必须在同一个表空间中。
数据文件(Datafile Segment)
通常每张表只对应一个数据文件。如果某张表的数据大于1GB,则会分为多个数据文件存储。
表空间(Tablespace)
在Gauss中,表空间是一个目录,在物理数据和逻辑数据间提供了抽象的一层,为所有的数据库对象分配存储空间,里面存储的是它所包含的数据库的各种物理文件。由于表空间是一个目录,仅是起到了物理隔离的作用,其管理功能依赖于文件系统。
表空间可以存在多个,创建好之后,创建数据库对象时可以指定该对象所属的表空间。
模式(Schema)
数据库对象集,包括逻辑结构,例如表、视图、序、存储过程、同义名、索引及数据库链接。
事务(Transaction)
数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。
同时,事务也是恢复和并发控制的基本单位,必须具备ACID特性,即:
原子性(Atomicity):一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
一致性(Consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(Isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(Durability):持久性也称永久性(Permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
请参考: https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/24.7.30.10/devg-dist/gaussdb-12-0002.html
6. 分布式开发指南
请参考文档:https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/25.1.30/devg-dist/gaussdb-12-0078.html
6.1 数据库系统概述
数据库逻辑结构图
数据查询请求处理过程
管理事务
6.2 数据库安全
用户及权限
数据库审计
6.3 操作数据库
本节描述使用数据库的基本操作。通过此节您可以完成创建数据库用户、创建数据库、创建表及向表中插入数据和查询表中数据等操作。
创建数据库用户
管理数据库
管理表空间
管理表
查看系统表
其他操作
6.5 数据库设计规范
基本规范
部署规范
数据库对象命名规范
Database和Schema设计规范
权限设计规范
字符集设计规范
表设计规范
字段设计规范
索引设计规范
函数/存储过程设计规范
约束设计
视图和关联表设计
6.6 应用程序开发教程
GaussDB应用程序开发教程概述
开发规范
基于JDBC开发
本地JDBC配置:
1. dbcp.properties 示例:
########DBCP##########
initialSize=5
maxActive=2000
minIdle=5
filters=stat
maxWait=6000
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=1800000
testOnBorrow=false
testOnReturn=false
testWhileIdle=true
poolPreparedStatements: true
maxOpenPreparedStatements: 20
connectionProperties:druid.stat.sql.MaxSize=100;
keepAlive=true
########gaussdb########
driverClassName=com.huawei.gaussdb.jdbc.Driver
url=jdbc:gaussdb://127.0.0.1:8000,127.0.0.1:8000,127.0.0.1:8000/tpcc?currentSchema=snest_jichen&autoBalance=true&refreshCNIpListTime=3&prepareThreshold=1&batchMode=on&fetchsize=10&loggerLevel=OFF
username=******
password=******
validationQuery=SELECT 1
gaussdbDeployment=Distributed
2. spring配置文件添加参数适配高斯自定义SQL列字段别名转换
正常不需要添加这个配置,除非项目特殊需要.
application-dev.properties添加:
orm.sql.wrap_camelcase_alias=true
6.7 SQL调优指南
SQL调优的唯一目的是“资源利用最大化”,即CPU、内存、磁盘I/O、网络IO四种资源利用最大化。所有调优手段都是围绕资源使用开展的。所谓资源利用最大化是指SQL语句尽量高效,节省资源开销,以最小的代价实现最大的效益。比如做典型点查询的时候,可以用seqscan+filter(即读取每一条元组和点查询条件进行匹配)实现,也可以通过indexscan实现,显然indexscan可以以更小的代价实现相同的效果。
Query执行流程
SQL执行计划介绍
调优流程
更新统计信息
审视和修改表定义
典型SQL调优点
经验总结:SQL语句改写规则
SQL调优关键参数调整
使用Plan Hint进行调优
检查隐式转换的性能问题
使用向量化执行引擎进行调优
使用SQL PATCH进行调优
实际调优案例
6.8 SQL参考
GaussDB SQL
关键字
数据类型
字符集与字符序
常量与宏
函数和操作符
表达式
伪列
类型转换
系统操作
事务控制
全文检索
SQL语法
附录
6.9 最佳实践
SQL查询最佳实践
权限配置最佳实践
数据倾斜查询最佳实践
存储过程最佳实践
6.10 工具指南
用DBeaver客户端连接高斯数据库
分布式工具指南
工具介绍:GaussDB 提供了多种工具支持分布式开发,如 GaussDB 数据库管理工具、备份工具等。
使用方法:参考 GaussDB 分布式工具指南 获取工具的使用方法和示例。
集中式工具指南
工具介绍:GaussDB 提供了多种工具支持集中式开发,如 GaussDB 数据库管理工具、性能监控工具等。
使用方法:参考 GaussDB 集中式工具指南 获取工具的使用方法和示例。
7. 特性描述
7.1 分布式特性描述
弹性扩展:支持水平扩展,可根据业务需求动态调整实例数量。
高可用性:支持多副本存储和自动故障切换,确保数据的高可用性。
高性能:采用分布式架构,提供高性能处理能力。
7.2 集中式特性描述
性能优化:针对集中式场景进行优化,提供高性能处理能力。
数据安全:支持数据加密、访问控制等安全功能。
易用性:提供简单的管理界面和操作方式。
8. 常见问题
8.1 性能问题
Q:如何优化 GaussDB 的性能?
A:可以通过调整数据库参数、优化 SQL 查询、增加实例规格等方式提升性能。具体优化方法请参考 性能优化指南。
8.2 安全问题
Q:如何确保 GaussDB 的数据安全?
A:可以通过设置访问控制、数据加密、备份与恢复等方式确保数据安全。具体安全措施请参考 安全指南。
9. 资源链接
官方文档中心
分布式版MySQL兼容性说明
SQL参考
M-Compatibility数据库系统概述