-
业务操作权限步骤1:先建一个角色create role data_mgr password 'Gauss_234';步骤2:登陆schema所属的用户u2赋予角色data_mgr对所属schema s2的使用权限以及所有表的数据操作权限赋予角色data_mgr对s2的使用权限grant USAGE,CREATE on schema s2 to data_mgr;角色data_mgr对u2已创建的表赋予查询权限grant SELECT,insert,delete,update on all tables in schema s2 to data_mgr;角色data_mgr对u2以后创建的新表赋予查询权限alter default privileges in schema s2 grant SELECT,insert,delete,update on tables to data_mgr;只读操作权限步骤1:创建只读角色create role read_only password 'Gauss_234';步骤2:登陆schema所属的用户u2赋予角色 read_only 对schema s1和s2的使用权限以及所有表的查询权限赋予角色read_only对s1,s2的使用权限grant USAGE on schema s1,s2 to read_only; --角色read_only拥有对s1,s2已创建的表赋予查询权限grant SELECT on all tables in schema s1,s2 to read_only; 角色read_only拥有对s1,s2以后创建的新表赋予查询权限alter default privileges in schema s1,s2 grant SELECT on tables to read_only; 赋权操作给用户u1赋予对用户u2的schema s2的数据操作权限。grant data_mgr to u1;给用户u3赋予对用户u2的schema s1和s2的只读权限。grant read_only to u3;权限回收操作回收角色data_mgr对s2的使用权限revoke USAGE,CREATE on schema s2 from data_mgr;回收角色data_mgr对u2已创建的表查询权限revoke SELECT,insert,delete,update on all tables in schema s2 from data_mgr;回收角色data_mgr对u2以后创建的新表赋予查询权限alter default privileges in schema s2 revoke SELECT,insert,delete,update on tables from data_mgr;回收用户u1对u2的schema s2的数据操作权限revoke data_mgr to u1;回收用户u3对u2的schema s1、s2的只读权限revoke read_only from u3;权限与回收把当前用户下某个schema下的表的查询权限赋给其他用户,既需要把schema的usage权限给其他用户,也要赋予其他用户对于表的查询权限(可以指定特定表来赋权查询操作,也可以赋予一次性赋予所有表的查询权限)。对于将来新建表的查询权限想要一次性的赋予权限,则需要通过alter default privileges赋予默认权限来操作。回收权限的话,需要回收schema的usage权限,也要回收表的查询权限,还有回收默认权限。可以通过\ddp来查看默认赋权信息。
-
权限机制数据库对象创建后,进行对象创建的用户就是该对象的所有者。集群安装后的默认情况下,未开启三权分立,数据库系统管理员具有与对象所有者相同的权限。也就是说对象创建后,默认只有对象所有者或者系统管理员可以查询、修改和销毁对象,以及通过GRANT将对象的权限授予其他用户。为使其他用户能够使用对象,必须向用户或包含该用户的角色授予必要的权限。DWS支持以下的权限:SELECT、INSERT、UPDATE、DELETE、TRUNCATE、REFERENCES、CREATE、CONNECT、EXECUTE和USAGE。不同的权限与不同的对象类型关联。可以使用GRANT。要撤消已经授予的权限,可以使用REVOKE。对象所有者的权限(例如ALTER、 DROP、GRANT和REVOKE)是隐式的,无法授予或撤消。即只要拥有对象就可以执行对象所有者的这些隐式权限。对象所有者可以撤消自己的普通权限,例如,使表对自己以及其他人只读。系统表和系统视图要么只对系统管理员可见,要么对所有用户可见。标识了需要系统管理员权限的系统表和视图只有系统管理员可以查询。系统管理员系统管理员是指具有SYSADMIN属性的帐户。集群安装后,默认情况下系统管理员具有与对象所有者相同的权限。集群安装过程中自动生成的帐户称为初始用户。初始用户也是系统管理员,其拥有系统的最高权限,能够执行所有的操作。该帐户与进行集群安装的操作系统用户omm同名。初始用户会绕过所有权限检查。建议仅将此初始用户作为DBA管理用途,而非业务应用。系统权限和对象权限权限表示用户访问某个数据库对象的操作是否被允许,数据库对象包括表、函数、模式、序列等等,操作包括:创建、增、删、改、查等等。权限是用户对一项功能的执行权利,在DWS中,根据系统管理方式的不同,可将权限分为系统权限与对象权限两类。系统权限数据库系统特定操作的能力,系统权限又称为用户属性,包括SYSADMIN、CREATEDB、CREATEROLE、AUDITADMIN和LOGIN。系统权限一般通过CREATE/ALTER ROLE语法来指定。其中,SYSADMIN权限可以通过GRANT/REVOKE ALL PRIVILEGE授予或撤销。但系统权限无法通过ROLE和USER的权限被继承,也无法授予PUBLIC。 对象权限数据库对象操作的能力,如SELECT、INSERT、UPDATE、DELETE等。对象权限可以有对象所有者或者管理员通过GRANT/REVOKE对其他角色分配或撤销。授权操作对象权限管理主要通过GRANT/REVOKE赋予或收回用户/角色在某个对象上的权限,PUBLIC特质为所有角色赋权权限操作示例:示例1:将系统权限授权给用户或者角色。创建名为joe的用户,并将sysadmin权限授权给他。CREATE USER joe PASSWORD 'Bigdata123@';GRANT ALL PRIVILEGES TO joe;授权成功后,用户joe会拥有sysadmin的所有权限。1、撤销joe用户的sysadmin权限,然后将模式tpcds的使用权限和表tpcds.reason的所有权限授权给用户joe。注:将Schema中的表或者视图对象授权给其他用户或角色时,需要将表或视图所属Schema的USAGE权限同时授予该用户或角色。否则用户或角色将只能看到这些对象的名字,并不能实际进行对象访问。REVOKE ALL PRIVILEGES FROM joe;GRANT USAGE ON SCHEMA tpcds TO joe;GRANT ALL PRIVILEGES ON tpcds.reason TO joe;授权成功后,joe用户就拥有了tpcds.reason表的所有权限,包括增删改查等权限。2、将tpcds.reason表中r_reason_sk、r_reason_id、r_reason_desc列的查询权限,r_reason_desc的更新权限授权给joe。GRANT select (r_reason_sk,r_reason_id,r_reason_desc),update (r_reason_desc) ON tpcds.reason TO joe;授权成功后,用户joe对tpcds.reason表中r_reason_sk,r_reason_id的查询权限会立即生效。如果joe用户需要拥有将这些权限授权给3、其他用户的权限,可以通过以下语法对joe用户进行授权。GRANT select (r_reason_sk, r_reason_id) ON tpcds.reason TO joe WITH GRANT OPTION;4、将数据库postgres的连接权限授权给用户joe,并给予其在postgres中创建schema的权限,而且允许joe将此权限授权给其他用户。GRANT create,connect on database postgres TO joe WITH GRANT OPTION;5、创建角色tpcds_manager,将模式tpcds的访问权限授权给角色tpcds_manager,并授予该角色在tpcds下创建对象的权限,不允许该角色中的用户将权限授权给其他人。CREATE ROLE tpcds_manager PASSWORD 'Bigdata123@';GRANT USAGE,CREATE ON SCHEMA tpcds TO tpcds_manager;6、将表空间tpcds_tbspc的所有权限授权给用户joe,但用户joe无法将权限继续授予其他用户。CREATE TABLESPACE tpcds_tbspc RELATIVE LOCATION 'tablespace/tablespace_1';GRANT ALL ON TABLESPACE tpcds_tbspc TO joe;1、创建角色manager,将joe的权限授权给manager,并允许该角色将权限授权给其他人。CREATE ROLE manager PASSWORD 'Bigdata123@';GRANT joe TO manager WITH ADMIN OPTION;2、创建用户senior_manager,将用户manager的权限授权给该用户。CREATE ROLE senior_manager PASSWORD 'Bigdata123@';GRANT manager TO senior_manager;3、撤销权限,并清理用户。REVOKE manager FROM joe;REVOKE senior_manager FROM manager;DROP USER manager;
-
角色权限与对象权限角色是权限的集合,权限限制了用户的行为通过为用户分配角色,限定用户的权利范围使用角色管理权限,更加有效使用角色管理其所有用户权限,更加统一角色可以被派生(开启资源管控,层级两层)角色的对象权限集合可以被继承,系统权限无法继承涉及权限的数据库对象数据库(DATABASE)、用户(USER)、模式(SCHEMA)、表(TABLE)、函数(FUNCTION)、表空间(TABLESPACE)、类型(TYPE)、角色(ROLE)查看对象权限通过系统表字段查看对象权限变化:1、用户mytbl1为用户along1所拥有的表,且表along2对mytbl1有select(r)查询权限。#select relname,relacl from pg_class where relname = 'mytbl1'; relname | relacl ---------+----------------------------------------- mytbl1 | {along1=arwdDxt/along1,along2=r/along1}2、将mytbl1的插入权限赋给along2。# grant insert on along1.mytbl1 to along2;3、查看到用户along2已经拥有了对mytbl1的insert(a)权限。# select relname,relacl from pg_class where relname = 'mytbl1'; relname | relacl ---------+------------------------------------------ mytbl1 | {along1=arwdDxt/along1,along2=ar/along1
-
一、前言GaussDB是一款基于云计算技术的高性能关系型数据库,支持多种数据模型和分布式架构。在GaussDB中,视图管理是非常重要的一项功能,它可以帮助用户更方便地管理和查询数据。数据库视图管理是指对数据库中的视图进行创建、修改、删除、查询等操作的过程。二、准备条件参考上一篇文章《GaussDB云数据库SQL应用系列-基础使用》1、登录华为云数据库GaussDB2、选择对应实例并进入到SQL执行界面三、视图语法及参数1、CREATE VIEW语法格式CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] VIEW view_name [ ( column_name [, ...] ) ][ WITH ( {view_option_name [= view_option_value]} [, ... ] ) ]AS query;【参数说明】OR REPLACE:如果视图已存在,则重新定义。TEMP | TEMPORARY:创建临时视图。view_name:要创建的视图名称。可以用模式修饰。column_name:可选的名称列表,用作视图的字段名。如果没有给出,字段名取自查询中的字段名。view_option_name [= view_option_value]:该子句为视图指定一个可选的参数。目前view_option_name支持的参数仅有security_barrier,当VIEW试图提供行级安全时,应使用该参数。Query:为视图提供行和列的SELECT或VALUES语句。2、DROP VIEW语法格式DROP VIEW [ IF EXISTS ] view_name [, ...] [ CASCADE | RESTRICT ];【参数说明】IF EXISTS:如果指定的视图不存在,则发出一个notice而不是抛出一个错误。view_name:要删除的视图名称。CASCADE | RESTRICT:CASCADE:级联删除依赖此视图的对象(比如其他视图)。RESTRICT:如果有依赖对象存在,则拒绝删除此视图。此选项为缺省值。四、操作示例在数据库中,视图管理通常需要使用SQL语句来进行操作1、创建基础表1)创建一张订单表,其中包含字段:订单编号、订单日期、供货商编号、商品编号、商品名称、商品产地、商品数量、商品进价。--删除表 order_infoDROP TABLE IF EXISTS order_info;--创建表 order_infoCREATE TABLE order_info(order_id int PRIMARY KEY,order_date date not null,supplier_id int not null,goods_id char(20) not null,goods_name char(20) not null,goods_home varchar(100) not null,goods_number int not null,goods_amount int not null);2)创建一张销售信息表,其中包含字段:销售编号、销售日期、商品编号、商品名称、商品数量、商品售价。--删除表 sell_list_infoDROP TABLE IF EXISTS sell_list_info;--创建表 sell_list_infoCREATE TABLE sell_list_info(sell_id int PRIMARY KEY,sell_date date not null,goods_id char(20) not null,goods_name char(20) not null,goods_number int not null,sell_goods_amount int not null);3)创建一张商品信息管理表,其中字段包括:商品编号、商品条形码、商品名称、商品产地、商品存量、商品进价、商品售价、供应商编号、仓库编号。--删除表 goods_infoDROP TABLE IF EXISTS goods_info;--创建表 goods_infoCREATE TABLE goods_info(goods_id char(20) PRIMARY KEY,goods_code varchar(50) not null,goods_name char(20) not null,goods_home varchar(100) not null,goods_number int not null,purchase_goods_amount int not null,sell_goods_amount int not null,supplier_id int not null,warehouse_id int not null);2、设置视图应用场景示例一,方便数据分析视图可以用于对数据进行聚合、分组和筛选等操作,从而方便数据分析和报告生成。场景:依据订单表,按商品名称及订货日期统计商品总数和总价、平均价格。--删除视图DROP VIEW IF EXISTS order_info_view;--依据订单表,按商品名称及订货日期统计商品总数和总价、平均价格。CREATE VIEW order_info_viewASSELECT goods_name,order_date,SUM(goods_number) AS total_number,SUM(goods_number * goods_amount) AS total_amount,AVG(goods_amount) AS avg_amountFROM order_infoGROUP BY goods_name, order_date;示例二,生成月度、年度报表场景:依据销售表,按年度统计所有销售商品的销售总数量和总销售额,以及其对应的仓库编号和供应商编号。--删除视图DROP VIEW IF EXISTS sell_list_sum_view;--依据销售表,按年度统计所有销售商品的销售总数量和总销售额,以及其对应的仓库编号和供应商编号。CREATE VIEW sell_list_sum_viewASSELECT t1.goods_id,t1.goods_name,t1.s_year,t1.total_number,t1.total_amount,t2.supplier_id,t2.warehouse_idFROM(SELECT goods_id,EXTRACT(YEAR FROM sell_date) AS s_year,goods_name,SUM(goods_number) AS total_number,SUM(goods_number * sell_goods_amount) AS total_amountFROM sell_list_infoGROUP BY goods_id,EXTRACT(YEAR FROM sell_date),goods_name) t1LEFT JOIN(SELECT goods_id,supplier_id,warehouse_idFROM goods_info) t2ON t1.goods_id =t2.goods_id示例三,实现数据安全在某些情况下,应用程序需要对数据进行访问控制,例如只允许特定的用户或角色访问某些数据。使用视图可以轻松实现这种控制。场景:只允许某个用户或角色访问某些数据(指定列),例如,只给用户zhangsan 访问“商品信息管理表(无此表访问权限)”的字段“商品名称、商品产地、商品存量、商品售价”。通过创建视图,并赋予zhangsan访问此视图的权限--删除视图DROP VIEW IF EXISTS goods_info_view;--只允许某个用户或角色访问某些数据(指定列)--例如,给用户zhangsan 访问“商品信息管理表(无此表访问权限)”的字段“商品名称、商品存量、商品售价”。--赋予zhangsan访问此视图的权限CREATE VIEW goods_info_viewASSELECT goods_name,goods_number,sell_goods_amountFROM goods_info;--赋予zhangsan查询权限GRANT SELECT ON goods_info_VIEW TO zhangsan;示例四,简化复杂的查询当需要对多个表进行联合查询时,可以使用视图来将这些表组合成一个单一的查询结果集,从而简化查询过程。场景:基于上一篇文章中的学生课程成绩表,生成一张视图:获取学生的姓名、课程、成绩、代课老师的信息汇总数据--删除视图DROP VIEW IF EXISTS student_c_view;--基于上一篇文章中的学生课程成绩表,生成一张视图:获取学生的姓名、课程、成绩、代课老师的信息汇总数据CREATE VIEW student_c_viewASSELECT t2.sname,t3.cname,t1.scgrade,t3.cteacherFROM(SELECT sno,cno,scgradeFROM sc) t1LEFT JOIN students t2ON t1.sno=t2.snoleft join course t3ON t1.cno=t3.cno--查看结果SELECT * FROM student_c_view;五、小结数据库视图是一种虚拟表,它是由一个查询语句定义的。视图可以看作是对数据集合的逻辑重组,用户可以通过视图来访问这些数据,而不必关心数据的存储方式和位置。GaussDB提供了灵活的视图管理功能,包括创建(CREATE)、修改(OR REPLACE)、删除 (DROP)和查询(SELEC)视图等操作。视图是一种虚拟的表,它由一个或多个基本表的数据经过逻辑运算后得到。它可以简化复杂的数据结构,提高查询效率,同时也可以隐藏基本表的细节,用户可以根据自己的需求选择不同的视图类型和定义视图的列,以满足不同的数据分析和查询需求。同时,GaussDB还支持对视图进行权限控制,以保证数据的安全性和隐私性。——结束
-
一、实验环境1、本地JDB版本:本实验版本:JDK版本:Java 11.0.17(登录网址:cid:link_1 ,选择对应jdk版本下载安装即可)2、华为云环境:广州-友好用户环境,弹性公网二、登录华为云创建测试库表1、登录GaussDB云数据库以IAM用户登录:依次进入:“服务列表——数据管理服务 DAS——开发工具——登录对应的实例”,如下图:点击测试连接,提示连接成功,点确认进入:2、建库、建表,用于测试创建java_test库:创建customer_t1表:CREATE TABLE customer_t1(c_customer_id INTEGER, c_customer_name VARCHAR(32));3、新增普通角色(用户)用于登录及访问测试(可选)新增普通角色test_role,默认购选登录权限(赋权connect)赋予test_role查询表customer_t1的权限。GRANT SELECT on public.customer_t1 TO test_role;(Tip: 测试时将java脚本中的连接用户名和秘密 替换成创建时设置的即可)4、获取对应的公网IP获取公网IP用于本地连接GaussDB云数据库:在本地测试ip 是否ping的通(win+r —— cmd —— ping ip):三、创建java工程1、创建java工程2、添加jar包1)下载并解压获取对应gsjdbc4.jar: cid:link_02)在工程src目录下创建lib文件夹,并将解压后的gsjdbc4.jar复制粘贴到此目录3)手动将其添加到工程中3、编辑Java代码连接GaussDB云数据库、执行insert、update、selectpackage gaussdb_jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class GaussDB_jdbc {static final String JDBC_DRIVER = "org.postgresql.Driver";static final String DB_URL = "jdbc:postgresql://*.*.*.*:8000/java_test";// 数据库的用户名与密码,需要根据自己的设置static final String USER = "****";static final String PASS = "****";// 执行insertpublic static void InsertData(Connection conn){Statement stmt = null;try {stmt = conn.createStatement();String sql;sql = "INSERT INTO public.customer_t1(c_customer_id, c_customer_name) VALUES(1001,'张三');"+ "INSERT INTO public.customer_t1(c_customer_id, c_customer_name) VALUES(1002,'李四');"+ "INSERT INTO public.customer_t1(c_customer_id, c_customer_name) VALUES(1003,'王五');";ResultSet rs = stmt.executeQuery(sql);rs.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}// 执行updatepublic static void UpadteData(Connection conn){Statement stmt = null;try {stmt = conn.createStatement();String sql;sql = "UPDATE customer_t1 SET c_customer_name ='jdbc' WHERE c_customer_id =1003 ";ResultSet rs = stmt.executeQuery(sql);rs.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}// 执行selectpublic static void SelectData(Connection conn){Statement stmt = null;try {stmt = conn.createStatement();String sql;sql = "SELECT c_customer_id, c_customer_name FROM public.customer_t1";ResultSet rs = stmt.executeQuery(sql);// 展开结果集数据库while(rs.next()){// 通过字段检索String column1 = rs.getString("c_customer_id");String column2 = rs.getString("c_customer_name");// 输出数据System.out.print("c_customer_id: " + column1);System.out.print(", c_customer_name: " + column2);System.out.print("\n");}rs.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void main(String[] args) {// TODO Auto-generated method stub// 打开链接try {System.out.println("连接数据库...");Connection conn = DriverManager.getConnection(DB_URL,USER,PASS);// 执行插入数据InsertData(conn);//执行更新数据UpadteData(conn);//执行查看SelectData(conn);conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}Tip:ip地址、用户及秘钥根据实际替换即可。四、执行并查看测试结果执行java脚本前的数据库表情况(0条记录):通过JAVA脚本访问GaussDB云数据库,并进行库表操作:1)JAVA脚本执行情况:2)数据库表查询情况(插入三条记录,更新了一条记录):结论:以上结果均与GaussDB云数据端的数据完全匹配,测试结果正确,jdbc访问GaussDB顺利完成。另,大家可以通过新增角色(或用户)进行测试,例如参考上文中的第二大点中的第3小点进行测试。 本次实验到此结束,欢迎大家互动、交流!
-
一、前言随着云计算技术的不断发展,云数据库已经成为了企业信息化建设中不可或缺的一部分。而在众多的云数据库产品中,华为GaussDB以其卓越的性能和稳定性备受用户青睐。GaussDB云数据库是一款具有高性能、高可用、高安全等特点。它采用了先进的存储技术和算法,可以快速处理大量的数据请求,并保证数据的一致性和可靠性。同时,GaussDB还具有丰富的应用场景。例如,在电商行业中,可以使用GaussDB来存储用户的购物记录和订单信息;在金融行业中,可以使用GaussDB来存储客户的账户信息和交易记录;在物流行业中,可以使用GaussDB来存储货物的运输信息和仓储信息等。对于初学者来说,学习如何使用GaussDB云数据库也是一个不小的挑战。不过,华为提供了详细的官方资料,可以让用户可以轻松上手。 本次将为大家简单展示一下其CRUD的基础语句操作。二、前提条件1、连接数据库实例通过“数据管理服务DAS”连接数据库实例(其他连接方式参见往期内容)2、GaussDB实例正常运行输入登录密码,点击“测试连接” 显示连接成功,则表示实例正常运行。三、操作示例1、选择实例并进入SQL执行界面默认只有创建实例时的管理员用户可以访问初始数据库2、创建数据库用户--新增用户zhangsanCREATE USER zhangsan WITH PASSWORD "P@ssw0rd";----新增用户lisi,等价上面的语句,如果创建有“创建数据库”权限的用户,则需要加CREATEDB关键字。CREATE USER lisi CREATEDB IDENTIFIED BY 'P@ssw0rd';--查看新增用户SELECT * FROM pg_user;3、创建数据库--创建一个新的数据库CREATE DATABASE Gauss_TEST1创建完Gauss_TEST1数据库后,可以选择继续在默认的postgres数据库下做后续的体验。当然,也可以使用新用户连接到此数据库执行接下来的创建表等操作,需要赋予其connect的权限(如下图)。--将数据库的create、connect权限授权给用户zhangsanGRANT create,connect on database Gauss_TEST1 TO zhangsan本内容将切换新用户完成后续实验4、创建SCHEMA创建SCHEMA:--创建SCHEMA,为用户zhangsan创建一个同名schema,子命令创建的表S、C、SC的拥有者为zhangsan。CREATE SCHEMA zhangsan;5、创建表(增删改查)1)创建3张表,并初始化一些数据创建表学生表:--学生表,Students(SNO, SNAME)代表 (学号,姓名)drop table students;create table students(sno INTEGER NOT NULL,sname varchar(32));插入数据:--插入数据insert into students(sno,sname) VALUES (1001,'张三');insert into students(sno,sname) VALUES (1002,'李四');insert into students(sno,sname) VALUES (1003,'王五');insert into students(sno,sname) VALUES (1004,'赵六');--查看结果select * from students;创建课程表:--课程表,course(CNO, CNAME, CTEACHER) 代表(课号, 课名, 教师)create table if not exists course(cno INTEGER NOT NULL,cname varchar(32),cteacher varchar(32));插入数据--插入数据,insert into course(cno,cname,cteacher)values(1,'数据库','张老师');insert into course(cno,cname,cteacher)values(2,'操作系统','李老师');insert into course(cno,cname,cteacher)values(3,'数据结构','王老师');insert into course(cno,cname,cteacher)values(4,'python','赵老师');--查看结果select * from course;创建学生成绩表:--学生成绩表,SC(SNO, CNO, SCGRADE) 代表(学号, 课号, 成绩)drop table sc;create table sc(sno INTEGER NOT NULL,cno INTEGER NOT NULL,scgrade DECIMAL(3,1));插入数据--插入数据insert into sc(sno,cno,scgrade)values(1001,1,98);insert into sc(sno,cno,scgrade)values(1001,2,90);insert into sc(sno,cno,scgrade)values(1002,3,95);insert into sc(sno,cno,scgrade)values(1002,4,88);insert into sc(sno,cno,scgrade)values(1003,1,97);insert into sc(sno,cno,scgrade)values(1004,4,99);--查看结果select * from sc;2)假设查询场景,并通过SQL 实现示例1:所有参加"数据库"课程考试的同学成绩登记错误, 现需要每人增加1分--所有参加"数据库"课程考试的同学成绩登记错误, 每人增加1分。update sc set scgrade= scgrade+1where cno in (select cno from course where cname ='数据库')--查看更新结果select *from SCwhere cno in (select cno from course where cname ='数据库')示例2:获取拥有1门课程以上考试成绩的学生信息--获取拥有1门课程以上考试成绩的学生信息(学号、姓名、课程号、课程名称、考试成绩)select t2.sno,t3.sname,t4.cno,t5.cname,t4.scgradefrom(select * from(select sno,cno,ROW_NUMBER() OVER(PARTITION BY sno ) as num1FROM SC) t1WHERE t1.num1>1) t2left join students t3on t2.sno=t3.snoleft join sc t4on t2.sno=t4.snoleft join course t5on t4.cno=t5.cnoorder by sno示例补充:上述SQL语句中用到子查询in 、窗口函数row_number()、用到左连接left join 。IN: 子查询(Subquery)是指在一个查询语句中嵌套另一个查询语句,并将该查询语句的结果作为主查询语句的条件或结果之一。在SQL中,子查询通常使用IN关键字来实现。IN关键字用于指定一个值列表,它可以被用来匹配主查询中的某个列的值。ROW_NUMBER:为各组内值生成连续排序序号,其中,相同的值其序号也不相同Left join :两张表关联, 以左表为主表,用于从两个或多个表中获取数据。它的作用是返回左表中的所有行,同时返回与右表匹配的行。如果右表中没有与左表匹配的行,则返回NULL值。——结束。
-
一、GaussDB的权限概述在数据库中,对象的创建者将成为该对象的所有者,具有对该对象进行查询、修改和删除等操作的权限。同时,系统管理员也拥有与所有者相同的权限。因此,如果要让其他用户能够使用某个对象,必须向该用户或包含该用户的角色授予必要的权限。GaussDB数据库对象权限:对象权限说明数据库 DATABASECONNECT允许用户连接到指定的数据库CREATE允许在数据库里创建新的模式模式 SCHEMACREATE允许在模式中创建新的对象USAGE允许访问包含在指定模式中的对象,若没有该权限,则只能看到这些对象的名字函数 FUNCTIONEXECUTE允许使用指定的函数,以及利用这些函数实现的操作符表空间 TABLESPACECREATE允许在表空间中创建表,允许在创建数据库和模式的时候把该表空间指定为缺省表空间。表 TABLEINSERTDELETEUPDATESELECT允许用户对指定表进行增删改查操作TRUNCATE允许执行TRUNCATE语句删除指定表中的所有记录。REFERENCES创建一个外键约束,必须拥有参考表和被参考表的REFERENCES权限要撤消已经授予的权限,可以使用REVOKE。对象所有者的权限(例如ALTER、DROP、COMMENT、INDEX、VACUUM、GRANT和REVOKE)是隐式拥有的,即只要拥有对象就可以执行对象所有者的这些隐式权限。对象所有者可以撤消自己的普通权限。系统表和系统视图要么只对系统管理员可见,要么对所有用户可见。标识了需要系统管理员权限的系统表和视图只有系统管理员可以查询。数据库提供对象隔离的特性,对象隔离特性开启时,用户只能查看有权限访问的对象(表、视图、字段、函数),系统管理员不受影响。不建议用户修改系统表和系统视图的权限。二、GaussDB权限设计建议在进行业务使用前,必须由系统管理员(root用户)创建数据库、模式(SCHEMA)和用户(USER)。然后,需要为相关用户授予访问对象所需的权限。如果该用户不是该模式的所有者,则要访问该模式下的对象,还需要同时向该用户授予模式的usage权限和对象的相应权限。DATABASE、SCHEMA和USER名使用小写。数据库会默认把其名转为小写,连接串里面如果出现大写的对象名无法连接到数据库。对角色和用户赋权时,应使用最小化权限原则。优先通过角色来管理权限。使用角色管理权限,再将角色赋予用户。例如:角色和用户为多对多关系,一个角色可以赋予多个用户,修改角色中的权限,被赋予角色的用户权限就可以同时更新。删除用户时,不会影响到角色。新建用户后可以通过赋予角色快速获取所需权限。在删除指定数据库时,应回收用户对该数据库的CONNECT权限,避免删除时仍然存在活跃的数据库连接而失败。三、GaussDB的GRANT命令1.功能说明1)将系统权限授权给角色或用户系统权限又称为用户属性,包括SYSADMIN、CREATEDB、CREATEROLE、AUDITADMIN、MONADMIN、OPRADMIN、POLADMIN、INHERIT、REPLICATION、VCADMIN和LOGIN等。系统权限一般通过CREATE/ALTER ROLE语法来指定。其中,SYSADMIN权限可以通过GRANT/REVOKE ALL PRIVILEGE授予或撤销。但系统权限无法通过ROLE和USER的权限被继承,也无法授予PUBLIC。2)将数据库对象授权给角色或用户将数据库对象(表和视图、指定字段、数据库、函数、模式、表空间等)的相关权限授予特定角色或用户;GRANT命令将数据库对象的特定权限授予一个或多个角色。这些权限会追加到已有的权限上。关键字PUBLIC表示该权限要赋予所有角色,包括以后创建的用户。PUBLIC可以看做是一个隐含定义好的组,它总是包括所有角色。任何角色或用户都将拥有通过GRANT直接赋予的权限和所属的权限,再加上PUBLIC的权限。如果声明了WITH GRANT OPTION,则被授权的用户也可以将此权限赋予他人。这个选项不能赋予PUBLIC(GaussDB特有的属性)。GaussDB会将某些类型的对象上的权限授予PUBLIC。默认情况下,对表、表字段、序列、外部数据源、外部服务器、模式或表空间对象的权限不会授予PUBLIC,而以下这些对象的权限会授予PUBLIC:数据库的CONNECT权限和CREATE TEMP TABLE权限、函数的EXECUTE特权、语言和数据类型(包括域)的USAGE特权。当然,对象拥有者可以撤销默认授予PUBLIC的权限并专门授予权限给其他用户。为了更安全,建议在同一个事务中创建对象并设置权限,这样其他用户就没有时间窗口使用该对象。对象的所有者缺省具有该对象上的所有权限,出于安全考虑所有者可以舍弃部分权限,但ALTER、DROP、COMMENT、INDEX、VACUUM以及对象的可再授予权限属于所有者固有的权限,隐式拥有。3)将角色或用户的权限授权给其他角色或用户将一个角色或用户的权限授予一个或多个其他角色或用户。在这种情况下,每个角色或用户都可视为拥有一个或多个数据库权限的集合。如果声明了WITH ADMIN OPTION,被授权的用户可以将该权限再次授予其他角色或用户,以及撤销所有由该角色或用户继承到的权限。当授权的角色或用户发生变更或被撤销时,所有继承该角色或用户权限的用户拥有的权限都会随之发生变更。数据库系统管理员可以给任何角色或用户授予/撤销任何权限。拥有CREATEROLE权限的角色可以赋予或者撤销任何非系统管理员角色的权限。4)将ANY权限授予给角色或用户将ANY权限授予特定的角色和用户。当声明了WITH ADMIN OPTION,被授权的用户可以将该ANY权限再次授予其他角色/用户,或从其他角色/用户处回收该ANY权限。ANY权限可以通过角色被继承,但不能赋予PUBLIC。初始用户和三权分立关闭时的系统管理员用户可以给任何角色/用户授予或撤销ANY权限。目前支持以下ANY权限:CREATE ANY TABLECREATE ANY SEQUENCEALTER ANY TABLECREATE ANY INDEXDROP ANY TABLECREATE ANY FUNCTIONSELECT ANY TABLEEXECUTE ANY FUNCTIONINSERT ANY TABLECREATE ANY PACKAGEUPDATE ANY TABLEEXECUTE ANY PACKAGEDELETE ANY TABLECREATE ANY TYPE2.注意事项1)不允许将ANY权限授予PUBLIC,也不允许从PUBLIC回收ANY权限。2)ANY权限属于数据库内的权限,只对授予该权限的数据库内的对象有效,例如SELECT ANY TABLE只允许用户查看当前数据库内的所有用户表数据,对其他数据库内的用户表无查看权限。3)即使用户被授予ANY权限,也不能对私有用户下的对象进行访问操作(INSERT、DELETE、UPDATE、SELECT)。4)ANY权限与原有的权限相互无影响。5)如果用户被授予CREATE ANY TABLE权限,在同名schema下创建表的属主是该schema的创建者,用户对表进行其他操作时,需要授予相应的操作权限。6)需要谨慎授予用户CREATE ANY FUNMCTION的权限,以免其他用户利用SECURITY DEFINER类型的函数进行权限提升。3.常用语法1)将表或视图的访问权限赋予指定的用户或角色GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | ALTER | DROP | COMMENT | INDEX | VACUUM } [, ...]| ALL [ PRIVILEGES ] }ON { [ TABLE ] table_name [, ...]| ALL TABLES IN SCHEMA schema_name [, ...] }TO { [ GROUP ] role_name | PUBLIC } [, ...][ WITH GRANT OPTION ];2)将表中字段的访问权限赋予指定的用户或角色GRANT { {{ SELECT | INSERT | UPDATE | REFERENCES | COMMENT } ( column_name [, ...] )} [, ...]| ALL [ PRIVILEGES ] ( column_name [, ...] ) }ON [ TABLE ] table_name [, ...]TO { [ GROUP ] role_name | PUBLIC } [, ...][ WITH GRANT OPTION ];3)将数据库的访问权限赋予指定的用户或角色GRANT { { CREATE | CONNECT | TEMPORARY | TEMP | ALTER | DROP | COMMENT } [, ...]| ALL [ PRIVILEGES ] }ON DATABASE database_name [, ...]TO { [ GROUP ] role_name | PUBLIC } [, ...][ WITH GRANT OPTION ];4)将函数的访问权限赋予给指定的用户或角色GRANT { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }ON { FUNCTION {function_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...]| ALL FUNCTIONS IN SCHEMA schema_name [, ...] }TO { [ GROUP ] role_name | PUBLIC } [, ...][ WITH GRANT OPTION ];5)将存储过程的访问权限赋予给指定的用户或角色GRANT { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }ON { PROCEDURE {proc_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...]TO { [ GROUP ] role_name | PUBLIC } [, ...][ WITH GRANT OPTION ];……四、GaussDB的REVOKE命令用法1.功能说明REVOKE用于撤销一个或多个用户或角色的权限。2.注意事项非对象所有者REVOKE权限时,按照以下规则执行:1)如果授权用户没有该对象上的权限,则命令立即失败。2)如果授权用户有部分权限,则只撤销那些有授权选项的权限。3)如果授权用户没有授权选项,REVOKE ALL PRIVILEGES形式将发出一个错误信息,而对于其他形式的命令而言,如果是命令中指定名称的权限没有相应的授权选项,该命令将发出一个警告。3.常用语法1)回收指定表或视图上的权限REVOKE [ GRANT OPTION FOR ]{ { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | ALTER | DROP | COMMENT | INDEX | VACUUM }[, ...]| ALL [ PRIVILEGES ] }ON { [ TABLE ] table_name [, ...]| ALL TABLES IN SCHEMA schema_name [, ...] }FROM { [ GROUP ] role_name | PUBLIC } [, ...][ CASCADE | RESTRICT ];2)回收表上指定字段的权限REVOKE [ GRANT OPTION FOR ]{ {{ SELECT | INSERT | UPDATE | REFERENCES | COMMENT } ( column_name [, ...] )}[, ...]| ALL [ PRIVILEGES ] ( column_name [, ...] ) }ON [ TABLE ] table_name [, ...]FROM { [ GROUP ] role_name | PUBLIC } [, ...][ CASCADE | RESTRICT ];3)回收指定数据库上的权限REVOKE [ GRANT OPTION FOR ]{ { CREATE | CONNECT | TEMPORARY | TEMP | ALTER | DROP | COMMENT } [, ...]| ALL [ PRIVILEGES ] }ON DATABASE database_name [, ...]FROM { [ GROUP ] role_name | PUBLIC } [, ...][ CASCADE | RESTRICT ];4)回收指定函数上的权限REVOKE [ GRANT OPTION FOR ]{ { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }ON { FUNCTION {function_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...]| ALL FUNCTIONS IN SCHEMA schema_name [, ...] }FROM { [ GROUP ] role_name | PUBLIC } [, ...][ CASCADE | RESTRICT ];5)回收指定存储过程上的权限REVOKE [ GRANT OPTION FOR ]{ { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }ON { PROCEDURE {proc_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...]| ALL PROCEDURE IN SCHEMA schema_name [, ...] }FROM { [ GROUP ] role_name | PUBLIC } [, ...][ CASCADE | RESTRICT ];……五、GaussDB示例1.GRANT 语句示例1)授予用户 user_name 对 database_name.table_name 表的 SELECT、INSERT、UPDATE、DELETE 权限。GRANT SELECT,INSERT,UPDATE,DELETE ON database_name.table_name TO user_name;2)授予用户 user_name 对 database_name.table_name 的所有权限。GRANT ALL PRIVILEGES ON database_name.table_name TO user_name;3)授予用户 user_name 对 database_name.table_name 的 SELECT、INSERT、UPDATE、DELETE 权限,并允许他将该权限传递给其他用户。GRANT SELECT,INSERT,UPDATE,DELETE ON database_name.table_name TO user_name WITH GRANT OPTION;2.REVOKE 语句示例:1)撤销用户 user_name 对 database_name.table_name 表的 SELECT、INSERT、UPDATE、DELETE 权限。REVOKE SELECT,INSERT,UPDATE,DELETE on database_name.table_name FROM user_name;2)撤销用户 user_name 对 database_name.table_name 的所有权限。REVOKE ALL PRIVILEGES ON database_name.table_name FROM user_name;3)撤销用户 user_name 对 database_name.table_name 表的 SELECT、INSERT、UPDATE、DELETE 权限。REVOKE SELECT,INSERT,UPDATE,DELETE ON database_name.table_name FROM user_name WITH GRANT OPTION;Tip:一个用户只能撤销由它自己直接赋予的权限,依赖性权限仍然存在,但如果声明了CASCADE,则所有依赖性权限都被撤销.小结:数据库的GRANT & REVOKE命令是用于管理数据库用户权限的命令。这些命令通常用于在数据库中为用户分配权限,以便用户可以访问和操作数据库中的数据。GRANT & REVOKE是GaussDB云数据库中非常重要的一个命令,它可以用于撤销和管理数据库中的不同对象的访问权限,从而保证数据库的安全性和可靠性。本期分享就到这里, 欢迎大家交流、学习!
-
springboot整合GaussDBpom.xml 依赖包 <dependency> <groupId>com.huawei.gaussdb.jdbc.Driver</groupId> <artifactId>huawei-gaussdb-jdbc</artifactId> <version>8.1.0</version> </dependency>.yml 配置spring: datasource: driver-class-name: org.huawei.gaussdb.Driver url: jdbc:gaussdb://localhost:5432/test?currentSchema=test username: password: gaussdb使用druid连接池连接配置application.ymlspring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: org.huawei.gaussdb.Driver username: 高斯库的用户名 password: 高斯库的密码 url: jdbc:postgresql://数据库地址:端口/库名
-
安装gaussdb报错,提示omm登陆服务器 permission denied,
-
背景:因异常断电后opengauss 5.0.0版本,一主两备集群启动失败:报错不是主机,由于当时没有截图,查看日志后发现报错是:尝 试用另外两台机器启动,每台机器都报错自己不是主机,像极了唐僧被妖怪抓走后互相帅锅的猴子哥仨。于是向opengauss交流群里的大佬求助,@半夏提供了一个手动启动的命令: gs_ctl start -D /opt/huawei/install/data/dn -M primary执行的时候提示已经有服务在,建议用restart,于是改为用restart执行。gs_ctl restart -D /opt/huawei/install/data/dn -M primary同时在两台备机上面执行手动启动,模式为standbygs_ctl restart -D /opt/huawei/install/data/dn -M standby 继续:执行完后查看集群状态,仍然是不可用,但是尝试本地连接数据库,是可以连接上了:于 是第一时间用gs_dump命令把数据先导出来了一份,这样最差的情况也可以卸载重装来恢复。但是虽然本地能连上,却不能创建表,是个只读事务(read-only transaction),业务还是不可用,期间还想着把业务代码改成单机版的数据库连接先应付应用,因为只读作罢。业务代码及datastudio工具也都连接不上。起初我还以为是配置文件的问题,检查和确认了postgres.conf及pg_hba.conf的配置。期间还执行过gs_install,以及gs_preinstall,但是install过程提示集群已安装(因未截图所以无法得到确切的提示,大意是已安装)。周一和大佬@半夏连线,检查了互信,互信正常,篇幅起见截图就只截一个服务器的。自动切换失败:cm_ctl switchover -a因为不可读,于是把123服务器的数据库又执行了一次强制升主:cm_ctl set --cmsPromoteMode=PRIMARY_F -I 1执 行后确实改为了Primary,但仍然是不可读,远程也无法连接。后来求助cm的大佬恩哥,恩哥提供了如下断电后需要执行的操作:1. kill掉cm和om的相关进程:gs_ssh -c "pkill -9 om_monitor -U omm; pkill -9 cm_agent -U omm; pkill -9 cm_server -U omm; touch $GAUSSHOME/bin/cluster_manual_start"2. rm掉cmserver下的gstor, dcf_data和bin下面的配置文件:cd $GAUSSLOGcd /opt/huawei/data/cmserver/cm_servergs_ssh -c "rm /opt/huawei/data/cmserver/gstor /opt/huawei/data/cmserver/dcf_data $GAUSSHOME/bin/cluster_dynamic_config -rf"rm掉bin下的集群手动启动:3. gs_ssh -c "rm $GAUSSHOME/bin/cluster_manual_start"周二连线:执行切换启动模式为AUTO:cm_ctl set --cmsPromoteMode=AUTO -I 10. 查看集群状态仍然不可用:于是直接拉恩哥上线:1. 查看dcc日志:cd $GAUSSLOG/cm/dccvim debug/dcc.dlog命令截图:日志截图:看到这个日志后,我提出怀疑是防火墙导致的连接建立失败。于是在三台服务器上都执行了关防火墙的操作(生产环境不建议这样操作,因是测试环境验证问题,所以关掉防火墙,生产环境开放端口白名单)。systemctl stop firewalldsystemctl disable firewalld查询防火墙状态:systemctl status firewalld再查询集群状态,状态即为正常:cm_ctl query -Cvidp紧张焦虑的两天半,问题终于在两位大佬的帮助下得到了解决,趁热打铁流水账先记录下过程,供各位专家同仁指导参考,再次感谢@半夏和恩哥(音)。总 结:影响集群启动的主要有两个因素:1防火墙是否关闭(或者是否打开端口白名单),2删除进程和文件的3步命令,至于手动启动,并不是必须的步骤。3 断电前预先stop集群。附:一些Linux命令总结:gs_ssh -c "ps x"echo $GAUSSHOMEcm_ctl startcm_ctl stopcm_ctl query -Cvidpcd $GAUSSLOGsource .bashrc –加载用户的bash配置文件ps ux
-
序号标题1GaussDB与openGauss有什么不同?2再识华为云数据库——GaussDB3数据库模型设计案例分享(GaussDB版)4JDBC连接GaussDB云数据库操作示例5Kylin V10 SP1安装GaussDB手册(基于云数据库GaussDB管理平台)6GaussDB数据类型介绍7GaussDB数据类型转换介绍8GaussDB数据库事务介绍9GaussDB数据库的索引管理10GaussDB数据库中的MERGE INTO介绍11GaussDB数据库SQL系列-复合查询12GaussDB数据库基础函数介绍-上13GaussDB数据库基础函数介绍-下14GuassDB数据库的GRANT & REVOKE15GaussDB OLTP云数据库配套工具DDM16GaussDB OLTP云数据库配套工具DRS17GaussDB OLTP 云数据库配套工具DAS18GaussDB云数据库SQL应用系列-基础使用19GaussDB数据库SQL系列-动态语句20GaussDB云数据库SQL应用系列-视图管理21GaussDB云数据库SQL应用系列—分区表管理22GaussDB数据库SQL系列-子查询23GaussDB数据库SQL系列-UNION & UNION ALL24GaussDB数据库SQL系列-DROP & TRUNCATE & DELETE25GaussDB数据库SQL系列-行列转换26GaussDB数据库SQL系列-层次递归查询27GaussDB数据库SQL系列-数据去重28GaussDB数据库SQL系列-SQL与ETL浅谈29GaussDB数据库SQL系列-自定义函数30GaussDB数据库SQL系列-定义重载函数31GaussDB数据库SQL系列-游标管理32GaussDB数据库SQL系列-LOCK TABLE33GaussDB数据库特性-物化视图简介34对GaussDB数据库和数据管理的简单介绍35GaussDB SQL基本语法示例-CASE表达式36GaussDB SQL基础语法示例-BOOLEAN表达式37GaussDB SQL基础语法示例-常见的条件表达式38GaussDB SQL基础语法示例-数组表达式39GaussDB SQL基础语法-变量&常量40GaussDB SQL基础语法示例-循环语句41GaussDB数据库中的MERGE INTO介绍
-
我按照文档描述配置,提示异常没找到驱动包
-
1.背景GaussDB作为一款企业级分布式数据库,提供了“同城跨AZ双活、两地三中心、双集群强一致”等极致的高可用容灾能力。当某个数据库节点由于故障无法对外提供服务时,为了继续保证数据库服务的可用性,JDBC驱动会将业务后续的数据库连接请求发送到其它可用节点上。但故障发生后,已经与故障节点建立会话的连接无法自动切换到可用节点上,导致使用这些连接的业务单元发生报错。如果业务单元缺少连接重试或业务一致性校验,可能会引起应用中断,甚至业务数据不一致的问题,造成用户严重的业务损失。因此,华为云GaussDB数据库提供了一种在数据库故障情况下的客户端连接转移方案 —— ALT(Application Lossless Transparent,应用无损透明)。该方案的原理是,当数据库集群的某个节点由于故障无法对外提供服务,若此时集群内还存在其它可用节点,则将故障节点上的会话连接自动迁移到目标节点上,客户端无需再次发出连接请求,仍然可以继续执行数据库操作。整个过程中,客户端应用程序是无感知的,就像是经历了一次略有延迟的SQL请求处理,极大地提高了数据库服务的可用性。2.技术架构我们先来看下ALT的技术架构和运行原理:图1 - ALT架构示意图从上图中可以看到,GaussDB集群引入了一个独立组件GNS(GaussDB Notification Service),用于检测获取数据库各节点的实时状态信息。当应用程序调用JDBC接口首次向集群中的任意节点建立连接时,JDBC驱动会与GNS服务建立集群状态订阅链路。当GNS检测到集群状态发生变化,会通过订阅链路将状态变化事件发送给JDBC驱动,事件处理线程收到任务后,再通过集群连接管理器中保存的引用副本对受到影响的连接进行管理和迁移。GNS组件采用的是多节点对等多活的部署方式,每个GNS服务都拥有集群的全量状态数据,JDBC驱动只需要与其中任意一个GNS建立订阅服务,就可以管理应用程序在该集群所有节点上的连接。 3.关键能力在了解了ALT的整体架构和运行原理之后,我们再来看看它具备哪些关键能力,这些能力可以为客户带来什么样的业务价值。快速应用通知ALT提供了一种数据库状态变化的主动消息通知机制。JDBC驱动通过GNS服务来订阅业务所用数据库集群的状态,当集群中的节点发生状态变化时,GNS将变化事件推送给JDBC驱动,后者再根据集群的最新状态对目标数据库上的连接进行管理和迁移。同时,JDBC驱动也向应用程序提供了集群状态变化的回调函数注册接口。应用程序可以针对某些数据库连接,向JDBC驱动注册状态变化的回调函数。当集群状态发生变化时,JDBC驱动会对注册的函数进行调用,通过注册回调函数,可以很方便地在业务侧实现数据库状态变化的邮件通知、告警平台上报等运维管理操作。连接无感迁移 当检测到GaussDB数据库发生故障或即将进行停机维护时,JDBC驱动的事件处理线程分析每条受影响的连接,确定是否有满足连接要求的其它数据库节点,如果存在,则将连接迁移至可用节点,并且恢复连接的会话状态信息。在主动停机维护场景下,使用者还可以通过参数来配置等待可用节点出现的连接挂起时长,从而提高集群统一维护场景下的服务可用性。事务断点续传连接开启ALT后,JDBC驱动和GaussDB服务端都会跟踪记录当前会话的事务状态信息。如果数据库正在处理SQL请求时发生故障,当连接迁移到新节点后,ALT根据记录的事务状态信息将会话恢复至故障前,事务则从中断的位置继续执行,避免了由于数据库故障导致的业务中断和应用层的数据不一致现象。ALT特性给客户带来的价值可以总结为:(1)避免数据库故障时,无法及时获取服务端状态而导致RTO过大;(2)加速JDBC指定节点类型(targetServerType)的连接建立;(3)集群停机维护时的业务连续性保证;(4)数据库故障时的业务连续性保证;(5)集群容灾切换时的快速应用通知。备注:事务断点续传功能开启后,JDBC驱动的内存使用量略微增大。4. ALT特性演示JDBC开启ALT方式 样例如下:URL=jdbc:opengauss://host1:port1,host2:port2,host3:port3/database?enableALT=true&gns=gns_host1:gns_port1, gns_host2:gns_port2当应用程序使用JDBC驱动访问GaussDB数据库时,只需要在连接URL中添加配置项enableALT和GNS监听地址即可开启ALT服务。ALT服务的最小订阅粒度是连接级别的,JDBC驱动支持向同一集群同时建立ALT连接和普通连接。演示场景GaussDB集中式集群进行switchover操作时,观察使用ALT连接的SQL请求执行情况。 演示步骤应用程序与数据库主节点分别建立普通JDBC连接和启用ALT特性的连接,使用两条连接同时执行下述SQL命令,观察集群完成switchover后,数据库连接是否可以正常使用。1. 客户端发送SQL请求:查看当前访问的数据库实例信息SQL> show listen_addresses;2. 客户端发送SQL请求:创建和使用数据库对象SQL> create table alt_test_switchover(mes text);SQL> insert into alt_test_switchover values('message before switchover');<-- 集群操作:switchover -->3. 客户端发送SQL请求:使用数据库对象SQL> insert into alt_test_switchover values('message after switchover');SQL> select mes from alt_test_switchover;4. 客户端发送SQL请求:查看当前访问的数据库实例信息SQL> show listen_addresses;对比结果(1)普通JDBC连接:集群进行switchover后,数据库连接断开,应用程序无法再使用该连接发送SQL请求。图2 – 普通JDBC连接日志(2)启用ALT特性的连接:集群进行switchover后,数据库连接自动迁移到新的主节点上,应用程序可以继续使用该连接发送SQL请求。图3 – ALT连接日志GaussDB作为一款企业级分布式数据库,具备五高两易(高可用、高安全、高性能、高弹性、高智能,易部署、易迁移)的核心优势。在满足金融核心业务的可靠性要求方面,GaussDB与工行联创推出了国内首个双集群强一致方案,实现集群级故障完全隔离RPO=0,而全新的应用无损透明方案,又做到了系统故障应用无感知,真正实现了业务7*24小时不中断,为企业带来更极致的高可用体验。本文作者 华为云GaussDB研发高级工程师 藏琦
-
背景对数据库集群内资源管控与资源隔离一直是企业客户长久以来的诉求。华为云GaussDB作为一款企业级分布式数据库,一直致力于满足企业对大型数据库集群的管理需要。数据库可以管理的资源有计算资源与存储资源,计算资源包括CPU、内存、IO与网络,存储资源包括数据存储空间、日志存储空间与临时文件等。从用户角度来看,资源管控通过设定阈值或者优先级限定程序对资源的使用,保证承诺服务等级协议的同时,又满足不同用户间资源隔离,达成多个租户共享数据库资源的目的。从系统的角度来看,引入资源监控与控制的手段,可以实现资源在可控情况下被合理利用的目的,避免资源耗尽,防止系统停止响应、崩溃等情况的发生。作业优先级,可以保证作业平稳运行,避免某个作业占用资源过高时影响其他作业,并在资源富裕时,实现资源利用的最大化。除此以外,还能满足外部的期望,保证系统资源使用最大化。通过对作业控制,可以保证作业是平稳的,避免作业执行过程中出现不可控的行为。为了解决上述目标,华为云GaussDB数据库提供了一种对数据库集群内资源进行细粒度管控的方案——细粒度资源管控。该方案在不同的管控粒度(如用户级、会话级与语句级)和不同的管控维度(CPU、内存与IO)都提供了对应的管控能力。用户可以根据自己业务需求采取合适的管控维度与管控粒度来达成资源管控与资源隔离的目标,满足不同场景的资源控制的需要。技术架构我们先来看下细粒度资源管控的技术架构和运行原理:从上图中可以看到,GaussDB提供资源池模块来完成CPU、内存与IO的管控逻辑。用户可以创建一个资源池并指定其可以使用的CPU、内存与IO的份额,并把资源池与用户绑定。之后该用户发起的作业在数据库内核优化解析、执行引擎以及存储引擎模块运行的过程中都会受到实时资源管控,确保其CPU、内存与IO都在对应资源池的范围内。假设A公司部署了一套GaussDB实例,其同时存在三个不同的应用来访问该实例,如OLTP业务、报表业务、其他低优先级业务。A公司希望对三个业务做资源的合理管控,在保证资源使用最大化的情况下,系统平稳运行。我们可以使用系统管理员执行如下命令来为三个业务的用户设置,其资源份额比例为50:30:10,剩余的10%为系统预留。这里仅做简单的使用示例,每一个参数的具体含义会在后面的章节进行详细说明。create resource pool respool_tp with(control_group="cgroup_tp", max_dynamic_memory="5GB", max_shared_memory="5GB", io_limits=50, io_priority="High"); alter role tp_user RESOURCE POOL 'respool_tp'; create resource pool respool_report with(control_group="cgroup_report", max_dynamic_memory="3GB", max_shared_memory="3GB", io_limits=30, io_priority="Medium"); alter role report_user RESOURCE POOL 'respool_report'; create resource pool respool_other with(control_group="cgroup_other", max_dynamic_memory="1GB", max_shared_memory="1GB", io_limits=10, io_priority="Low"); alter role other_user RESOURCE POOL 'respool_other';如上操作后,OLTP业务、报表业务与其他低优先级业务分别使用tp_user、report_user与other_user连入GaussDB执行作业时,这三个业务则会受到对应的资源池respool_tp、respool_report与respool_other的管控,在资源发生争抢的时候保证三个业务分别可以使用GaussDB集群50%、30%以及10%的资源。关键能力在了解了细粒度资源管控的整体架构和使用方法之后,我们再来看看它具备哪些关键能力,这些能力可以为客户带来什么样的业务价值。 CPU管控GaussDB的CPU管控是以资源池粒度来做用户资源管控的,每一个资源池绑定一个控制组,通过控制组(Control Group,CGroup)来实现CPU的管控。CGroup是Linux内核提供的一种限制、记录、隔离进程组所使用的物理资源(如CPU、Memory、IO等)的机制。考虑到数据库系统、用户、作业不同维度的隔离性和可配置性,GaussDB使用控制组的层级特性构造符合数据库场景的模型(见下图),其满足客户SLA的关键特性,并支持三个维度的层次隔离和控制:数据库程序与非数据库程序隔离、数据库常驻后备线程与执行作业线程隔离以及数据库多用户之间的隔离。GaussDB控制组可以设置CPU的百分比以及核数的上限,其中根节点负责管控GaussDB进程可用的CPU份额;Backend控制组负责管控数据库常驻后台线程的CPU份额(Vacuum、DefaultBackend);Class控制组负责管控用户的作业线程的CPU份额(UserClass1,UserClass2,...UserClassN);Class控制组内还可以创建Workload控制组(TopWD,RemainWD...)进行更细粒度的管控。接上面的示例,我们用GaussDB提供的CGroup工具来为A公司的OLTP业务、报表业务以及其他低优先级业务分别创建控制组,CPU分配比例为50%、30%与10%。gs_cgroup -c -S cgroup_tp -s 50; gs_cgroup -c -S cgroup_report -s 30; gs_cgroup -c -S cgroup_other -s 10;执行如上命令就代表我们成功创建了3个控制组,之后可以在创建资源池时指定该控制组名称。绑定资源池的用户所发起的作业就会收到控制组对应CPU份额的管控。CGroup管控CPU有两个问题需要注意:一是,如果线程的CPU需要受CGroup管控,那么需要执行CGroup的系统API来为线程绑定对应的CGroup,该操作较为耗时;二是,CGroup的CPU管控效果,在线程数与CPU成比例的情况下,管控效果最佳。基于这些问题GaussDB提出了线程组的概念,每一个资源池对应一个线程组,线程组里的线程都绑定了该资源池所对应的CGroup。同时,GaussDB会将每一个线程组的线程数量调整到与对应CGroup的CPU份额一致。具体可见下图:每一个用户发起的作业都会被分发到对应的线程组里的线程来执行,由于线程已经绑定了对应的Cgroup节点,所以操作系统会在线程调度时完成CPU管控。GaussDB提供两层用户机制,绑定Class控制组的资源池称之为组资源池,对应的用户为组用户,绑定Workload控制组的资源池称之为业务资源池,对应的用户为业务用户。组用户一般对应一个部门,而业务用户对应这个部门的不同的业务。业务资源池的各个资源维度的资源份额会不会超过所属组资源池的份额,从而达到两级资源管控的目标。CPU管控也提供名称为session_respool的GUC来限制单个会话的CPU不超过对应资源池的CPU上限。 内存管控GaussDB提供动态内存与共享缓存的管控,创建资源池时可以指定max_dynamic_memory与max_shared_memory来分别完成动态内存与共享缓存的阈值设置。动态内存管控并没有更改其原有的内存资源分配机制,仅在分配内存之前增加一个逻辑判断层,对多分配出的内存进行记账,通过检查该记账值是否达到允许使用的内存上限来完成内存的管控。当动态内存超过上限时,作业申请内存会失败。作业退出时,该作业已申请的内存会进行释放来保证其他作业可以正常执行。同理,当作业使用的共享缓存超过资源池的管控上限时,再次申请共享缓存,需要先释放自己已经占用的共享缓存,比如BufferPool,作业申请页面时,会对自己已经占用的页面进行淘汰,淘汰之后空余出来的页面供自己继续使用。GaussDB除了用户粒度的内存管控外,也提供session_max_dynamic_memory与query_max_mem两个GUC参数来完成会话级与语句级动态内存的管控,当一个会话或者语句所使用的动态内存达到GUC的阈值时,作业申请内存失败。 IO管控GaussDB的磁盘读写IO都由后台线程完成,该线程无法区分页面属主,只是按照时间顺序依次落盘,无法针对不同用户管控不同的IO使用。基于此,考虑IO管控功能采用逻辑IO统计方式,对用户或者会话的读写IO进行管控限制,在工作线程和共享缓存之间增加了逻辑IO计数,对于行存表来说每6000(可通过io_control_unit GUC进行修改)行算做一次IO,当一秒产生的读写IO请求数超过资源池设置的阈值时,则将该IO请求加入到后台线程的一个等待队列里,后台线程将对等待队列里的这些IO请求进行监控,当其等待时间符合条件时,将这些IO请求从等待队列中唤醒。GaussDB支持两种模式的IO资源管控,上线数值模式是通过设置固定的触发IO次数的数值,进行IO资源控制;优先级模式是指在当前磁盘长时间使用率达到95%以上,所有作业都无法达到上线数值模式时,用户可通过该模式进行IO控制,控制该作业原本触发IO的优先级比例,优先级包含三挡:High、Medium与Low。接上面的示例,我们为A公司的OLTP业务、报表业务以及其他低优先级业务分别创建资源池,IO权重分别设置的为High、Medium与Low。那么,OLTP业务能使用50%的IO请求向BufferPool中读取或写入数据,少量的IO请求会进入等待队列等待;报表业务能使用20%的IO请求向BufferPool中读取或写入数据,较多的IO请求会进入等待队列等待;其他低优先级业务能使用10%的IO请求向BufferPool中读取或写入数据,较多的IO请求会进入等待队列等待;后台监控线程会周期性的遍历IO等待队列,唤醒等待时间符合要求的IO请求从BufferPool读取或写入数据。GaussDB除了支持用户粒度的IO管控外,也支持通过设置会话级GUC参数io_limits与io_priority,来完成指定会话上允许作业的IO管控。 连接数与并发管控GaussDB提供基于资源池的连接数管控与并发管控,创建资源池时可以指定max_connections与max_concurrency来分别完成连接数与并发数的设置,可以使用如下SQL,为前面示例A公司的三个业务对应的资源池完成连接数与并发数管控:alter resource pool respool_tp with(max_connections=-1, max_concurrency = -1); alter resource pool respool_report with(max_connections=200, max_concurrency = 100); alter resource pool respool_other with(max_connections=100, max_concurrency = 50);如上SQL执行成功后,实时生效。A公司OLTP业务的连接数与并发数不受限制,只有集群有资源它都可以使用到;报表业务的最大连接数为200,其他低优先级业务的最大连接数为100,当这两个业务建立的连接数超过该值时,GaussDB内核会自动拦截,报当前连接数不足,链接失败;报表业务的最大并发数为100,其他低优先级业务的最大并发数为50,当这两个业务同时发起的作业数超过该值时,超出的作业将会进入等待队列,直到已有的作业完成之后GaussDB才会将其唤醒继续执行作业。 存储空间管控存储空间管控,用于限定不同用户可以使用的空间配额,防止单用户存储空间使用过大导致整个数据库业务受阻。GaussDB通过在创建用户时指定存储空间的大小来实现对存储资源的管控。存储空间资源分为三种类型:永久表空间(Perm Space)、临时表空间(Temp Space)与算子下盘空间(Spill Space)。可以使用如下SQL,为前面示例A公司的三个业务对应的用户完成磁盘空间额管控。alter user tp_user PERM SPACE '200G' TEMP SPACE '20G' SPILL SPACE '20G'; alter user report_user PERM SPACE '100G' TEMP SPACE '10G' SPILL SPACE '10G'; alter user other_user PERM SPACE '100G' TEMP SPACE '10G' SPILL SPACE '10G';存储空间管理支持对组用户和业务用户的存储空间管理。当业务用户对应的组用户存在空间限制时,业务用户的空间也受到该组用户的空间限制。指定存储空间的大小后,该用户在DN上所有的写操作会增加用户已用空间,删除操作减少用户已用空间,CN会周期性的从DN获取一次已用空间总和,并对用户已用空间进行判断,超过最大值后cancel掉写作业(insert/create table as/copy),后面写作业报错退出。特性演示特性演示这里我们就简单的为大家演示一下CPU的管控效果,因为对业务影响最大的就是CPU。创建两个资源池分别设置20%与60%的CPU,然后使用两个绑定了该资源池的用户开始跑业务。观测CPU的实际使用情况。1. 创建控制组:gs_cgroup -c -S class1 -s 20; gs_cgroup -c -S class2 -s 60;2. 创建资源池:CREATE RESOURCE POOL xuuer_pool with(control_group = "class1"); CREATE RESOURCE POOL xyuser1_pool with(control_group = "class2");3. 创建用户绑定资源池:create role user1 RESOURCE POOL 'xuuer_pool'; create role user2 RESOURCE POOL 'xyuser1_pool';4. 通过Top观察系统CPU状态,同时细粒度资源管控提供gs_wlm_respool_cpu_info函数来观察各个资源池的CPU实时情况。如上图,可知初期系统CPU是空闲状态,资源池的CPU监控视图也显示CPU使用为0。让user1开始跑业务,观测可知系统CPU有一定业务占用,查询资源池的CPU监控视图显示,user1可以使用80%的CPU。此时,让user2也开始跑业务,观测可知系统CPU进入繁忙状态,查询资源池的CPU资源监控的系统函数可知user1的CPU使用率开始下降,user2的CPU使用率开始上升。整理两个用户的CPU使用率并绘制曲线图如下图,可看出user1与user2的CPU使用率最终会平衡到3比1的状态,符合资源池对应的CGroup控制组里设置的20%与60%的比例,达到了CPU管控的效果。总结细粒度资源管控特性目前支持集中式与分布式。分布式下的计算资源管控是各个节点独立管控自己节点的资源,存储资源管控是以集群维度来整体管控的。细粒度资源管控作为多租户的资源隔离的底座,实现资源的精准划分与控制,并解决高负载场景下资源不足而导致集群不可服务的问题。该特性适用于数据隔离不敏感,但对不同业务有资源隔离需求的场景,如果客户对资源隔离和数据隔离都有需求的话,可以关注一下我们后面即将分享的多租数据库特性哦!
-
SQL于关系型数据库而言,重要性不言而喻。就像一个乐团的指挥,指导着作品的正确演绎和节奏的和谐统一。华为云GaussDB作为新一代关系型分布式数据库,具备卓越的技术性能和行业竞争力。很多人对GaussDB的关键技术很好奇,纷纷在论坛帖上留言:GaussDB SQL语句到底是如何执行的?GaussDB SQL引擎原理是什么?GaussDB SQL引擎有哪些关键技术点?…….今天我们就从GaussDB SQL引擎入手,了解一下GaussDB SQL查询语句的执行过程,包括GaussDB SQL引擎原理和关键技术点。首先,简单介绍一下GaussDB的系统结构,再解析GaussDB SQL查询语句的执行过程。GaussDB系统架构GaussDB在华为云上有集中式(图1)和分布式(图2)两种部署形态,如下图所示:图(1) 集中式图(2) 分布式在GaussDB SQL语句执行过程中,会涉及以下几个关键角色:GTM全局事务管理器(Global Transaction Manager),负责生成和维护全局事务ID、事务快照、时间戳、sequence信息等全局唯一的信息。CN协调节点(Coordinator Node)。负责接收来自应用的访问请求,并向客户端返回执行结果;负责分解任务,并调度任务分片在各DN上并行执行。每个CN与每个DN相连接,每个CN各持有一份元数据,元数据内容相同。DN数据节点(Data Node)。负责存储业务数据(支持行存、列存、混合存储)、执行数据查询任务以及向CN返回执行结果。其中,DN主要承担GaussDB SQL语句的执行,其逻辑架构如下图所示:图(3) GaussDB逻辑架构GaussDB包括两个主要引擎:SQL引擎 (SQL Engine) 和存储引擎 (Storage Engine) 。SQL引擎有时也被称为查询处理器,它的主要功能是SQL 解析、查询优化和查询执行。SQL解析对输入的 SQL 语句进行词法解析、语法解析、语义解析,从而生成查询树。查询树经过规则优化(RBO)和代价优化(CBO)之后,产生执行计划。执行器基于该执行计划对相关数据进行提取、运算、更新、删除等操作,以达到用户查询想要实现的结果。存储引擎负责管理所有数据的I/O,它包含数据读写处理(处理行、索引、页、分配和行版本的I/O请求)、数据缓冲管理(Buffer Pool)和事务管理器。其中,事务管理又涉及到保持ACID属性的锁机制(Lock)和事务日志管理(XLOG)。在SQL引擎和存储引擎之间是AM(Access Method) 层。AM对存储层做了封装,以支持多种存储引擎(Astore,Ustore,etc.)。SQL层不直接调用存储层,而是通过AM层,AM层会根据不同的存储引擎调用不同的执行体。从GaussDB逻辑架构图中可以看出,GaussDB架构设计遵循现代软件系统抽象化和分层解耦的设计原则,包括:统一事务机制、统一日志系统、统一并发控制系统、统一元信息系统、统一缓存管理系统。因此,GaussDB技术架构具备以下主要特点:支持SQL优化、执行、存储分层解耦;支持可插拔存储引擎。SQL查询语句的执行过程一条SQL查询(SELECT)语句的执行过程,如下所示:图(4) 查询语句的执行过程从上图可以看出,一条SQL语句需要经过SQL解析生成查询树、查询优化生成执行计划,然后将执行计划转交给查询执行器做物理算子的执行操作。SQL是介于关系演算和关系代数之间的一种描述性语言,它吸取了关系代数中一部分逻辑算子的描述,而放弃了关系代数中 “过程化” 的部分。SQL解析主要的作用就是将一个SQL语句编译成为一个由关系算子组成的查询树,通常包含词法解析、语法解析、语义解析几个子模块。规则优化(RBO)则是在查询树的基础上进行等价的关系代数变换,把一条SQL语句转换为更高效的等价SQL,并在数据库优化器中扮演关键角色。尤其在复杂查询中,它能够在性能上带来数量级的提升。查询执行是根据执行计划来执行SQL查询语句。底层存储方式的选择合理性,将影响查询执行效率。解析器GaussDB SQL解析通常包含词法解析、语法解析、语义解析:1.词法解析:从查询语句中识别出系统支持的关键字、标识符、运算符、终结符等,确定每个词固有的词性。SQL标准定义了SQL的关键字以及语法规则信息,GaussDB在做词法分析过程中会将一个SQL语句根据关键字信息以及间隔信息划分为独立的原子单位,每个单位以一个词的方式展现。2. 语法解析:根据定义的SQL语法规则,使用词法分析中产生的词去匹配语法规则,并生成对应的抽象语法树(Abstract Syntax Tree,AST)。3. 语义解析:对语法树进行有效性检查,检查语法树中对应的表、列、函数、表达式是否有对应的元数据,将抽象语法树转换为查询树。语义解析的过程也是有效性语义绑定的过程,通过语义分析的检查,抽象语法树就转换成一个查询树。查询树可以通过关系代数表达式的形式来表现。优化器优化器是提升查询效率非常重要的一个手段,它包括规则优化和查询优化两部分。规则优化(RBO)规则优化是在查询树的基础上进行等价的关系代数变换,由于它是建立在关系代数基础之上的优化形式,也可称为代数优化。虽然两个关系代数式获得的结果完全相同,但是它们的执行代价却可能有很大的差异,这就构成了规则优化的基础。规则优化遵循两个基本原则:(1)等价性:原语句和重写后的语句输出结果相同。(2)高效性:重写后的语句比原语句执行时间短,且资源使用更高效。GaussDB实现了一些关键的规则优化技术,例如:谓词下推:更早地触发条件过滤,减少处理行数冗余运算消除:消除冗余的表、列,减少计算量子查询提升:提升后可以匹配更多连接顺序Outer-To-Inner转换:Inner Join可以匹配更多连接顺序子链接提升:减少subplan和Broadcast运算消除不等值连接:减少NestLoop和Broadcast运算在服务大量的客户过程中,GaussDB对业务 SQL使用模式进行抽象,并实现了一些高级重写规则。在今后的栏目中,我们会对GaussDB的规则优化技术做详细介绍。查询优化查询优化是根据“规则优化”的输出,结合数据库内部统计信息来规划SQL语句具体的执行方式,也就是执行计划。基于优化方法的不同,查询优化技术可以分为:(1)CBO(Cost Based Optimization,基于代价的查询优化):对SQL语句对应的待选执行路径进行代价估算,从待选路径中选择代价最低的执行路径作为最终的执行计划。(2)ABO(AI Based Optimization,基于机器学习的查询优化):通过对历史经验的不断学习,ABO将目标场景的模式进行抽象化,形成动态的模型,自适应地针对用户的实际场景进行优化,从而获得最优的执行计划。GaussDB采用基于CBO的优化技术,并结合ABO在建模效率、估算准确率和自适应性等方向进行积极探索,步骤如下:图(5) 查询优化步骤统计信息模型:统计信息是计算计划路径代价的基石,统计信息的准确度对代价估算模型中行数估算和代价估算起着至关重要的作用,直接影响查询计划的优劣。GaussDB基表数据的特征包括distinct值、MCV (Most Common Values) 值、直方图等。行数估算 (Row Estimation):当一个约束条件确定了选择率之后,就可以确定每个计划路径所需要处理的行数,并根据行数推算出所需要处理的页面数,为代价估算做准备。代价估算 (Cost Estimation):根据数据量估算不同算子执行代价,各算子代价之和即为计划的总代价。当计划路径处理页面的时候,会产生I/O代价,而当计划路径处理元组的时候(例如,针对元组做表达式计算 ),会产生CPU代价。由于GaussDB是分布式数据库,在CN和DN之间传输数据又会产生通信代价,因此一个计划的总代价可以表示为:总代价 = IO代价 + CPU代价 + 通信代价路径搜索:通过求解路径最优算法(动态规划、遗传算法)处理连接路径搜索过程,以最小搜索空间找到最优连接路径。GaussDB采用的是自底向上和随机搜索模式相结合的方式。搜索过程也都是一个从查询树向执行计划转变的过程,例如针对每个表可以有不同的扫描算子,而逻辑连接算子也可以转换为多种不同的物理连接算子。计划生成:将查询执行路径转换成执行计划(PlanTree),提供给执行器执行。查询优化可能需要花费较长时间,特别是在处理复杂查询时。计划缓存是GaussDB的一个重要功能,它可以缓存查询语句的执行计划,以便在下次执行相同查询时可以直接使用缓存中的执行计划,从而避免重复计算和优化查询性能。【关键技术点】CBO + ABO:通过引入AI算法,改进CBO模型,赋予查询优化器能够根据数据而动态调整评估结果的能力。【关键技术点】计划缓存:GaussDB 的计划缓存具备计划自适应选择和自动更新的能力。它可以自动为不同参数配置选择最佳的缓存计划,以保证查询性能的稳定和优化。分布式查询优化作为原生分布式数据库,分布式查询优化技术尤为重要。GaussDB分布式架构充分运用每个节点的计算资源,且随着节点规模的扩大其整体性能也呈线性增长。为了实现分布式架构下性能和资源的利用最大化,GaussDB支持四种分布式计划,分别为CN 轻量化计划、FQS(Fast Query Shipping)计划、Stream计划和Remote-Query计划,如下图所示:图(6) 四种分布式计划CN 轻量化: 语句直接下发到单个 DN 上执行(LIGHT_PROXY)执行原理:CN通过socket直接下发语句QPBE报文到对应DN。适用场景:语句可以直接在一个DN执行(单shard语句)。FQS(Fast Query Shipping)语句下发: 下发SQL语句的计划(REMOTE_FQS_QUERY)执行原理:CN不通过优化器,直接生成RemoteQuery计划,走执行器逻辑下发到DN。各DN根据下推语句生成执行计划并进行执行,执行结果在CN上进行汇总。适用场景:语句可以完全下推到多个DN上执行,且DN之间不需要数据交互。STREAM 计划下发:下发SQL计划的分布式计划(STREAM)执行原理:CN根据原语句通过优化器生成带stream算子的执行计划,下发给DN进行执行,DN执行过程中存在数据交互(stream节点)。stream算子在DN之间建立连接进行数据交互,CN汇总执行结果。DN承担了大部分计算。适用场景:执行时CN和DN之间、DN和DN之间有数据交互的复杂语句。Remote-Query 计划:下发部分SQL语句的分布式计划 (REMOTE_QUERY)执行原理:CN通过优化器把原语句中的部分语句生成RemoteQuery计划,把每个RemoteQuery下发到DN,DN执行后把中间结果数据发送给CN,CN收集后进行剩余执行计划的执行计算,因此,CN承担了大部分计算。适用场景:不满足前三种生成条件的极少数场景,性能非常差。在分布式架构下,同一个表的数据会分布到不同的数据节点上,创建表的时候可以选择将数据在每个表上做哈希(Hash)分布或者随机分布。为了正确执行两表连接操作,有可能需要将两个表的数据重新分布,因此,GaussDB的分布式执行计划中增加了三个使数据形成特定分布方式的Stream算子。图(7) Stream算子分布式路径生成时,会考虑两表及连接条件上的数据是否处于同一个数据节点,如果不是,则会添加相应的数据分发算子。根据降低数据在DN节点间流动的原则来选择重分布的Stream算子。正是基于Stream算子的合理运用,GaussDB在分布式架构下处理大规模数据才成为可能。针对Stream算子的优化也是GaussDB 查询优化的重要部分。图(8) GaussDB分布式查询优化技术【关键技术点】分布式查询优化:四种分布式执行计划、三个Stream算子。执行器执行器接收到的指令就是由优化器针对SQL查询语句而产生的执行计划,而执行计划是由一些执行算子(Operator)、表达式等组成,主要是对关系集合进行运算,最终输出用户想要的结果集。下面是几类常见的执行算子:1. 扫描算子(Scan Plan Node)扫描节点负责从底层数据来源抽取数据,数据来源可能是来自文件系统,也可能来自网络。一般而言扫描节点都位于执行树的叶子节 点,作为执行的数据输入来源,典型代表SeqScan、IndexScan、 SubQueryScan 。关键特征:输入数据、叶子节点、表达式过滤2. 控制算子(Control Plan Node)控制算子一般不映射代数运算符,是为了执行器完成一些特殊的流程引入的算子,例如Limit、RecursiveUnion、Union。关键特征:用于控制数据流程3. 物化算子(Materialize Plan Node)物化算子一般指算法要求,在做算子逻辑处理的时候,要求把下层 的数据进行缓存处理,因为对于下层算子返回的数据量不可提前预 知,因此需要在算法上考虑数据无法全部放置到内存的情况,例如 Agg、Sort 。关键特征:需要扫描所有数据之后才返回4. 连接算子(Join Plan Node) 这类算子是为了应对数据库中最常见的关联操作,根据处理算法和 数据输入源的不同分成MergeJoin, NestLoop Join, HashJoin。关键特征:关联查询5. 其它算子执行器的架构和技术也决定了数据库查询执行的整体运行效率。GaussDB执行引擎充分结合现代硬件技术的特征,采用了诸如向量化引擎、LLVM等多种现代软件技术,进行高效执行。图(9) GaussDB全并行执行架构GaussDB 在执行分布式计划过程中,也采用了多种技术来提升查询执行的性能。例如,在执行复杂查询时,会将重执行算子下推到 DN 节点执行,如 AGG 算子等。在下推算子执行时,会考虑数据本地性,尽可能在本地计算,减少数据在网络中的传输开销。【关键技术点】全并行执行架构:MPP,SMP,LLVM,SIMD 全并行执行,发挥系统极致性能,充分利用CPU资源来提高查询性能,后期我们将对全并行执行中的技术一一展开介绍。点击链接,获取更多GaussTech技术专栏内容
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签