GaussDB 数据库参考手册
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模式
<dependency>
<groupId>com.sie.meta</groupId>
<artifactId>sie-snest-engine</artifactId>
<version>v2.8.1-RELEASE</version>
</dependency>
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兼容性说明
参考文档: 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
等。
- 数据定义语言(DDL):如
- 存储过程和函数:支持 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 官方文档:
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 应用程序开发教程
本地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参考
6.9 最佳实践
6.10 工具指南
分布式工具指南
- 工具介绍:GaussDB 提供了多种工具支持分布式开发,如 GaussDB 数据库管理工具、备份工具等。
- 使用方法:参考 GaussDB 分布式工具指南 获取工具的使用方法和示例。
集中式工具指南
- 工具介绍:GaussDB 提供了多种工具支持集中式开发,如 GaussDB 数据库管理工具、性能监控工具等。
- 使用方法:参考 GaussDB 集中式工具指南 获取工具的使用方法和示例。
7. 特性描述
7.1 分布式特性描述
- 弹性扩展:支持水平扩展,可根据业务需求动态调整实例数量。
- 高可用性:支持多副本存储和自动故障切换,确保数据的高可用性。
- 高性能:采用分布式架构,提供高性能处理能力。
7.2 集中式特性描述
- 性能优化:针对集中式场景进行优化,提供高性能处理能力。
- 数据安全:支持数据加密、访问控制等安全功能。
- 易用性:提供简单的管理界面和操作方式。
8. 常见问题
8.1 性能问题
-
Q:如何优化 GaussDB 的性能?
- A:可以通过调整数据库参数、优化 SQL 查询、增加实例规格等方式提升性能。具体优化方法请参考 性能优化指南。
8.2 安全问题
-
Q:如何确保 GaussDB 的数据安全?
- A:可以通过设置访问控制、数据加密、备份与恢复等方式确保数据安全。具体安全措施请参考 安全指南。