华为云用户手册

  • 内置角色 GaussDB提供了一组默认角色,以gs_role_开头命名。它们提供对特定的、通常需要高权限的操作的访问,可以将这些角色授权给数据库内的其他用户或角色,让这些用户能够使用特定的功能。在授予这些角色时应当非常小心,以确保它们被用在需要的地方。表1描述了内置角色允许的权限范围。 表1 内置角色权限描述 角色 权限描述 gs_role_signal_backend 具有调用函数pg_cancel_backend、pg_terminate_backend和pg_terminate_session来取消或终止其他会话的权限,但不能操作属于初始用户和PERSISTENCE用户的会话。 gs_role_tablespace 具有创建表空间(tablespace)的权限。 gs_role_replication 具有调用逻辑复制相关函数的权限,例如kill_snapshot、pg_create_logical_replication_slot、pg_create_physical_replication_slot、pg_drop_replication_slot、pg_replication_slot_advance、pg_create_physical_replication_slot_extern、pg_logical_slot_get_changes、pg_logical_slot_peek_changes、pg_logical_slot_get_binary_changes、pg_logical_slot_peek_binary_changes。 gs_role_account_lock 具有加解锁用户的权限,但不能加解锁初始用户和PERSISTENCE用户。 gs_role_pldebugger 具有执行dbe_pldebugger下调试函数的权限。 gs_role_public_dblink_drop 具有执行删除public database link对象的权限。 gs_role_public_dblink_alter 具有执行修改public database link对象的权限。 gs_role_seclabel 具有创建、删除和应用安全标签的权限。 gs_role_public_synonym_create 具有创建public同义词的权限。 gs_role_public_synonym_drop 具有删除public同义词的权限。 关于内置角色的管理有如下约束: 以gs_role_开头的角色名作为数据库的内置角色保留名,禁止新建以“gs_role_”开头的用户/角色/模式,也禁止将已有的用户/角色/模式重命名为以“gs_role_”开头。 禁止对内置角色进行ALTER和DROP操作。 内置角色默认没有LOGIN权限,不设预置密码。 gsql元命令\du和\dg不显示内置角色的相关信息,但若显示指定了pattern为特定内置角色则会显示。 三权分立关闭时,初始用户、具有SYSADMIN权限的用户和具有内置角色ADMIN OPTION权限的用户有权对内置角色执行GRANT/REVOKE管理。三权分立打开时,初始用户和具有内置角色ADMIN OPTION权限的用户有权对内置角色执行GRANT/REVOKE管理。例如: 1 2 GRANT gs_role_signal_backend TO user1; REVOKE gs_role_signal_backend FROM user1;
  • ADM_IND_EXPRESSIONS ADM_IND_EXPRESSIONS视图显示数据库中表达式索引的信息。默认只有系统管理员权限才可以访问,普通用户需要授权才可以访问。该视图同时存在于PG_CATALOG和SYS Schema下。 表1 ADM_IND_EXPRESSIONS字段 名称 类型 描述 table_owner character varying(64) 表的所有者。 table_name character varying(64) 表名。 index_owner character varying(64) 索引的所有者。 index_name character varying(64) 索引名。 column_expression text 定义列的基于函数的索引表达式。 column_position smallint 索引中列的位置。 父主题: 其他系统视图
  • thread_pool_stream_attr 参数说明:用于控制stream线程池功能的详细属性,stream线程只在DN生效,该参数仅在enable_thread_pool打开后生效,仅sysadmin用户可以访问。该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 取值范围:字符串,长度大于0 该参数分为4个部分,'stream_thread_num, stream_proc_ratio ,group_num ,cpubind_info',这4个部分的具体含义如下: stream_thread_num:stream线程池中的线程总数,取值范围是0~4096。其中0的含义是数据库根据系统CPU core的数量来自动配置线程池的线程数,如果参数值大于0,线程池中的线程数等于stream_thread_num。线程池大小推荐根据硬件配置设置,计算公式如下:stream_thread_num = CPU核数*3~5,stream_thread_num最大值为4096。 stream_proc_ratio:预留给stream线程的proc数量比例,浮点类型,默认为0.2,预留proc计算方式为:stream_proc_ratio * stream_thread_num。 group_num:线程池中的线程分组个数,取值范围是0~64。其中0的含义是数据库根据系统NUMA组的个数来自动配置线程池的线程分组个数,如果参数值大于0,线程池中的线程组个数等于group_num。thread_pool_stream_attr的group_num需与thread_pool_attr的group_num配置和使用保持一致,若设置为不同值,以thread_pool_attr的group_num为准。 cpubind_info:线程池是否绑核的配置参数。可选择的配置方式有集中:1. '(nobind)' ,线程不做绑核;2. '(allbind)',利用当前系统所有能查询到的CPU core做线程绑核;3. '(nodebind: 1, 2)',利用NUMA组1,2中的CPU core进行绑核;4. '(cpubind: 0-30)',利用0-30号CPU core进行绑核;5. '(numabind: 0-30)',在NUMA组内利用0-30号CPU core进行绑核。该参数不区分大小写。thread_pool_stream_attr的cpubind_info需与thread_pool_attr的cpubind_info配置和使用保持一致,若设置为不同值,以thread_pool_attr的cpubind_info为准。 默认值: stream_thread_num:16 stream_proc_ratio:0.2 group_num、cpubind_info:参见thread_pool_attr。
  • resilience_threadpool_reject_cond 参数说明:用于控制线程池过载逃生的线程池使用率比例。该参数仅在GUC参数use_workload_manager和enable_thread_pool打开时生效。该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。 取值范围:字符串,长度大于0 该参数分为recover_threadpool_percent、overload_threadpool_percent 2部分,这2个部分的具体含义如下: recover_threadpool_percent:线程池恢复正常状态时的线程池使用率,当线程池使用率小于该值时,停止过载逃生并放开新连接接入,取值为0~INT_MAX,设置为多少表示百分之多少。 overload_threadpool_percent:线程池过载时的线程池使用率,当线程池使用率大于该值时,表示当前线程池已经过载,触发过载逃生kill会话并禁止新连接接入,取值为0~INT_MAX,设置为多少表示百分之多少。 默认值:'0,0',表示关闭线程池逃生功能。 示例: resilience_threadpool_reject_cond = '50,90' 表示线程池使用率超过90%后禁止新连接接入并kill堆积的会话,kill会话过程中线程池使用率下降到50%时停止kill会话并允许新连接接入。 线程池使用率可以通过DBE_PERF.local_threadpool_status视图查询获得;线程池设置的初试线程池线程数目可以通过查询thread_pool_attr参数获得。 该参数如果设置的百分比过小,则会频繁触发线程池过载逃生流程,会使正在执行的会话被强制退出,新连接短时间接入失败,需要根据实际线程池使用情况慎重设置。 recover_threadpool_percent和overload_threadpool_percent的值可以同时为0,除此之外,recover_threadpool_percent的值必须要小于overload_threadpool_percent,否则会设置不生效。
  • thread_pool_attr 参数说明:用于控制线程池功能的详细属性,该参数仅在enable_thread_pool打开后生效,仅sysadmin用户可以访问。 参数类型:字符串 参数单位:无 取值范围: 该参数分为3个部分,'thread_num, group_num, cpubind_info',这3个部分的具体含义如下: thread_num:线程池中的初始线程总数,可以动态扩充,取值范围是0~4096。其中0的含义是数据库根据系统CPU core的数量来自动配置线程池的线程数,如果参数值大于0,线程池中的线程数等于thread_num。线程池大小建议根据硬件配置进行设置,计算公式如下:thread_num = CPU核数*3~5,thread_num最大值为4096。 group_num:线程池中的线程分组个数,取值范围是0~64。其中0的含义是数据库根据系统NUMA组的个数来自动配置线程池的线程分组个数,如果参数值大于0,线程池中的线程组个数等于group_num。 cpubind_info:线程池是否绑核的配置参数。可选择的配置方式有:1. '(nobind)' ,线程不做绑核;2. '(allbind)',利用当前系统所有能查询到的CPU core做线程绑核;3. '(nodebind: 1, 2)',利用NUMA组1,2中的CPU core进行绑核;4. '(cpubind: 0-30)',利用0-30号CPU core进行绑核;5. '(numabind: 0-30)',在NUMA组内利用0-30号CPU core进行绑核。该参数不区分大小写。当开启资源多租模式时,该参数不生效。 默认值:'4096,2,(nobind)'(196核CPU/1536G内存,128核CPU/1024G内存,104核CPU/1024G内存,96核CPU/1024G内存);'2048,2,(nobind)'(96核CPU/768G内存,80核CPU/640G内存);'1024,2,(nobind)'(64核CPU/512G内存,60核CPU/480G内存,32核CPU/256G内存);'512,2,(nobind)'(16核CPU/128G内存);'256,2,(nobind)'(8核CPU/64G内存);'128,2,(nobind)'(4核CPU/32G内存);'32,1,(nobind)'(4核CPU/16G内存) 设置方式:该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 设置建议:内存充足且CPU性能好的情况,当业务需要更多连接可以增加该参数值。
  • DB_COL_PRIVS DB_COL_PRIVS视图显示以下授权信息: 当前用户作为对象所有者、授予者或被授予者时的列权限授予信息。 已启用角色或PUBLIC角色作为被授予者时的列权限授予信息。 默认所有用户都可以访问。该视图同时存在于PG_CATALOG和SYS Schema下。 表1 DB_COL_PRIVS字段 名称 类型 描述 grantor character varying(128) 执行授权的用户名。 owner character varying(128) 对象的所有者。 grantee character varying(128) 被授予权限的用户或角色的名称。 table_schema character varying(128) 对象的Schema。 table_name character varying(128) 对象的名称。 column_name character varying(128) 列的名称。 privilege character varying(40) 列的权限。 grantable character varying(3) 是否授予特权。 YES:授予特权。 NO:不授予特权。 common character varying(3) 暂不支持,值为NULL。 inherited character varying(3) 暂不支持,值为NULL。 父主题: 用户和权限管理
  • 示例 普通索引 --创建tbl_test1表。 gaussdb=# CREATE TABLE tbl_test1( id int, --用户id name varchar(50), --用户姓名 postcode char(6) --邮编 ); --创建表空间tbs_index1。 gaussdb=# CREATE TABLESPACE tbs_index1 RELATIVE LOCATION 'test_tablespace/tbs_index1'; --为表tbl_test1创建索引idx_test1指定表空间。 gaussdb=# CREATE INDEX idx_test1 ON tbl_test1(name) TABLESPACE tbs_index1; --查询索引idx_test1信息。 gaussdb=# SELECT indexname,tablename,tablespace FROM pg_indexes WHERE indexname = 'idx_test1'; indexname | tablename | tablespace -----------+-----------+------------ idx_test1 | tbl_test1 | tbs_index1 (1 row) --删除索引。 gaussdb=# DROP INDEX idx_test1; --删除表空间。 gaussdb=# DROP TABLESPACE tbs_index1; 唯一索引 --为表tbl_test1创建唯一索引idx_test2。 gaussdb=# CREATE UNIQUE INDEX idx_test2 ON tbl_test1(id); --查询索引信息。 gaussdb=# \d tbl_test1 Table "public.tbl_test1" Column | Type | Modifiers ----------+-----------------------+----------- id | integer | name | character varying(50) | postcode | character(6) | Indexes: "idx_test2" UNIQUE, btree (id) TABLESPACE pg_default --删除索引。 gaussdb=# DROP INDEX idx_test2; 表达式索引 --为表tbl_test1创建一个表达式索引。 gaussdb=# CREATE INDEX idx_test3 ON tbl_test1(substr(postcode,2)); --查询索引信息。 gaussdb=# \d tbl_test1 Table "public.tbl_test1" Column | Type | Modifiers ----------+-----------------------+----------- id | integer | name | character varying(50) | postcode | character(7) | Indexes: "idx_test3" btree (substr(postcode::text, 2)) TABLESPACE pg_default --删除索引。 gaussdb=# DROP INDEX idx_test3; 部分索引 --为表tbl_test1中id不为为空的数据建立索引。 gaussdb=# CREATE INDEX idx_test4 ON tbl_test1(id) WHERE id IS NOT NULL; --删除索引。 gaussdb=# DROP INDEX idx_test4; --删除表。 gaussdb=# DROP TABLE tbl_test1; 分区索引 --建表。 gaussdb=# CREATE TABLE student(id int, name varchar(20)) PARTITION BY RANGE (id) ( PARTITION p1 VALUES LESS THAN (200), PARTITION pmax VALUES LESS THAN (MAXVALUE) ); --创建LOCAL分区索引不指定索引分区的名称。 gaussdb=# CREATE INDEX idx_student1 ON student(id) LOCAL; --查看索引分区信息,LOCAL索引分区数和表的分区数一致。 gaussdb=# SELECT relname FROM pg_partition WHERE parentid = 'idx_student1'::regclass; relname ------------- p1_id_idx pmax_id_idx (2 rows) --删除LOCAL分区索引。 gaussdb=# DROP INDEX idx_student1; --创建GLOBAL索引。 gaussdb=# CREATE INDEX idx_student2 ON student(name) GLOBAL; --查看索引分区信息,GLOBAL索引分区数和表的分区数不一致。 gaussdb=# SELECT relname FROM pg_partition WHERE parentid = 'idx_student2'::regclass; relname --------- (0 rows) --删除GLOBAL分区索引。 gaussdb=# DROP INDEX idx_student2; --创建LOCAL表达式索引,不指定索引分区的名称。 gaussdb=# CREATE INDEX idx_student3 ON student(lower(name)) LOCAL; --查看索引分区信息,LOCAL索引分区数和表的分区数一致。 gaussdb=# SELECT relname FROM pg_partition WHERE parentid = 'idx_student3'::regclass; relname ------------- p1_id_idx pmax_id_idx (2 rows) --删除LOCAL分区表达式索引。 gaussdb=# DROP INDEX idx_student3; --创建GLOBAL表达式索引。 gaussdb=# CREATE INDEX idx_student4 ON student(lower(name)) GLOBAL; --查看索引分区信息,GLOBAL表达式索引分区数和表的分区数不一致。 gaussdb=# SELECT relname FROM pg_partition WHERE parentid = 'idx_student4'::regclass; relname --------- (0 rows) --删除GLOBAL分区表达式索引。 gaussdb=# DROP INDEX idx_student4; --删除表。 gaussdb=# DROP TABLE student;
  • 语法格式 在表上创建索引。 1 2 3 4 5 6 7 8 CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ IF NOT EXISTS ] [ [schema_name.] index_name ] ON table_name [ USING method ] ({ { column_name [ ( length ) ] | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] }[, ...] ) [ INCLUDE ( column_name [, ...] ) ] [ WITH ( {storage_parameter = value} [, ... ] ) ] [ TABLESPACE tablespace_name ] { [ COMMENT 'string' ] [ ... ] } [ { VISIBLE | INVISIBLE } ] [ WHERE predicate ]; 在分区表上创建索引。 1 2 3 4 5 6 7 8 9 10 11 12 13 CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [schema_name.] index_name ] ON table_name [ USING method ] ( { { column_name [ ( length ) ] | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS LAST ] } [, ...] ) [ LOCAL [ ( { PARTITION index_partition_name [ FOR { partition_name | ( partition_value [, ...] ) } ] [ TABLESPACE index_partition_tablespace ] [ ( [SUBPARTITION index_subpartition_name] [ FOR { partition_name | ( partition_value [, ...] ) } ] [ TABLESPACE index_partition_tablespace ] [, ...] ) ] [, ...] } ) ] | GLOBAL ] [ INCLUDE ( column_name [, ...] ) ] [ WITH ( { storage_parameter = value } [, ...] ) ] [ TABLESPACE tablespace_name ] { [ COMMENT 'string' ] [ ... ] } [ { VISIBLE | INVISIBLE } ];
  • 优化建议 create index 约束限制: 普通表的索引支持最大列数为32列;分区表的GLOBAL索引支持最大列数为31列。 单个索引大小不能超过索引页面大小(8k),其中B-tree、UBtree索引不能超过页面大小的三分之一。 分区表上不支持创建部分索引。 分区表创建GLOBAL索引时,存在以下约束条件: 不支持表达式索引、部分索引。 仅支持Btree索引。 在相同属性列上,分区LOCAL索引与GLOBAL索引不能共存。 如果ALTER语句不带有UPDATE GLOBAL INDEX,那么原有的GLOBAL索引将失效,查询时将使用其他索引进行查询;如果ALTER语句带有UPDATE GLOBAL INDEX,原有的GLOBAL索引仍然有效,并且索引功能正确。
  • 功能描述 在指定的表上创建索引。 索引可以用来提高数据库查询性能,但是不恰当的使用将导致数据库性能下降。建议仅在匹配如下某条原则时创建索引: 经常执行查询的字段。 在连接条件上创建索引,对于存在多字段连接的查询,建议在这些字段上建立组合索引。例如:select * from t1 join t2 on t1.a=t2.a and t1.b=t2.b,可以在t1表上的a,b字段上建立组合索引。 where子句的过滤条件字段上(尤其是范围条件)。 在经常出现在order by、group by和distinct后的字段。 在分区表上创建索引与在普通表上创建索引的语法不太一样,使用时请注意,如当索引带GLOBAL/LOCAL关键字或者创建索引为GLOBAL索引时不支持创建部分索引。需要注意分区表上创建索引会根据如下规则进行判断:如果创建索引时申明了GLOBAL/LOCAL关键字,则创建对应类型的索引;如果创建索引指定分区名,则创建LOCAL索引;如果是unique索引,索引需包含分区键,此时创建LOCAL索引;否则默认创建GLOBAL索引。
  • 注意事项 基表为HASH分布时,若创建不包含基表分布键的主键或唯一索引,需要使用全局二级索引(CREATE GLOBAL INDEX),若创建包含基表分布键的主键或唯一索引,需要使用普通索引(CREATE INDEX),单DN部署形式下,使用全局二级索引或者普通索引均可创建成功;当基表为除HASH分布以外的其他分布形式时,主键或唯一索引只能使用普通索引(CREATE INDEX),即索引键必须包含基表分布键。 索引自身也占用存储空间、消耗计算资源,创建过多的索引将对数据库性能造成负面影响(尤其影响数据导入的性能,建议在数据导入后再建索引)。因此,仅在必要时创建索引。 索引定义里的所有函数和操作符都必须是immutable类型的,即它们的结果必须只能依赖于它们的输入参数,而不受任何外部的影响(如另外一个表的内容或者当前时间)。这个限制可以确保该索引的行为是定义良好的。要在一个索引上或WHERE中使用用户定义函数,请把它标记为immutable类型函数。 分区表索引分为LOCAL索引与GLOBAL索引,LOCAL索引与某个具体分区绑定,而GLOBAL索引则对应整个分区表。 被授予CREATE ANY INDEX权限的用户,可以在public模式和用户模式下创建索引。 如果基表是HASH/RANGE/LIST分布,则创建唯一索引时必须包含基表的分布键,且不能含有表达式。 如果表达式索引中调用的是用户自定义函数,按照函数创建者权限执行表达式索引函数。 不支持XML类型数据作为普通索引、UNIQUE索引、GLOBAL索引、LOCAL索引、部分索引。 在线创建索引的类型只支持btree索引和ubtree索引。索引创建形式只支持非分区表普通索引及分区表GLOBAL索引、LOCAL索引,不支持PCR ubtree索引、二级分区与GSI。在线并行创建索引只支持Astore及Ustore的普通索引、GLOBAL索引、LOCAL索引。
  • 示例 在当前数据库安装扩展。例如安装security_plugin: --安装扩展之前需要设置enable_extension为true才能够创建。 gaussdb=# SET enable_extension = true; --安装扩展。 gaussdb=# CREATE EXTENSION IF NOT EXISTS security_plugin; --删除扩展。 gaussdb=# DROP EXTENSION security_plugin;
  • 参数说明 IF NOT EXISTS 如果系统已经存在一个同名的扩展,不会报错。这种情况下会给出一个提示。请注意该参数不保证系统存在的扩展和现在脚本创建的扩展相同。 extension_name 将被安装扩展的名字,数据库将使用文件SHAREDIR/extension/extension_name.control中的详细信息创建扩展。 schema_name 扩展的实例被安装在该模式下,扩展的内容可以被重新安装。指定的模式必须已经存在,如果没有指定,扩展的控制文件也不指定一个模式,这样将使用默认模式。 扩展不属于任何模式,扩展在一个数据库范围内的名字是不受限制的,但是一个扩展的实例是属于一个模式的。 version 安装扩展的版本,可以作为一个标识符或者字符串,默认的版本在扩展的控制文件中指定。 old_version 当需要升级安装"old style" 模块中没有的内容时,需要指定FROM old_version。通过CREATE EXTENSION运行一个安装脚本将新的内容安装到扩展中,而不是创建一个新的实体。注意:SCHEMA指定了包括这些已存在实体的模式。
  • 注意事项 在使用CREATE EXTENSION载入扩展到数据库中之前,必须先安装好该扩展的支持文件。 CREATE EXTENSION命令安装一个新的扩展到一个数据库中,必须保证没有同名的扩展已经被安装。 安装一个扩展意味着执行一个扩展的脚本文件,这个脚本会创建一个新的SQL实体,例如函数、数据类型、操作符和索引支持的方法。 安装扩展需要有和创建他的组件对象相同的权限。对于大多数扩展这意味着需要超户或者数据库所有者的权限,对于后续的权限检查和该扩展脚本所创建的实体,运行CREATE EXTENSION命令的角色将变为扩展的所有者。 CREATE EXTENSION时如果数据库中存在与EXTENSION内同名的PACKAGE、同义词、操作符、目录、函数、存储过程、视图、表这些数据库对象,将会导致CREATE EXTENSION失败。 数据库禁止直接创建扩展,因为扩展可能会引起非预期的错误,且在升级后面临不兼容的问题。如果需要创建扩展,需要设置enable_extension为true才能够创建。 CREATE EXTENSION时,如果GUC参数enable_object_special_character为off,且扩展的脚本文件中使用"@extschema@",那么扩展的支持文件中schema参数的值不能包含["$'\]中任意特殊字符。
  • 参数说明 server_name server的名称。 取值范围:长度必须小于等于63字节。 fdw_name 指定外部数据封装器的名称。 取值范围:dist_fdw,log_fdw,file_fdw。其中log_fdw和file_fdw仅作语法兼容,可以创建外表,无实际使用意义,不做额外使用说明。 OPTIONS ( { option_name ' value ' } [, ...] ) 这个子句为服务器指定选项。这些选项通常定义该服务器的连接细节,但是实际的名称和值取决于该服务器的外部数据包装器。 用于指定外部服务器的各类参数,详细的参数说明如下所示。 encrypt 是否对数据进行加密,该参数仅支持type为OBS时设置。默认值为on。 取值范围: on表示对数据进行加密,使用HTTPS协议通信。 off表示不对数据进行加密,使用HTTP协议通信。 access_key OBS访问协议对应的AK值(OBS云服务界面由用户获取)。该参数仅支持type为OBS时设置。 secret_access_key OBS访问协议对应的SK值(OBS云服务界面由用户获取)。该参数仅支持type为OBS时设置。 除了libpq支持的连接参数外,还额外提供以下参数: fdw_startup_cost 执行一个外表扫描时的启动耗时估算。这个值通常包含建立连接、远端对请求的分析和生成计划的耗时。默认值为100。取值范围为大于0的实数。 fdw_typle_cost 在远端服务器上对每一个元组进行扫描时的额外消耗。这个值通常表示数据在server间传输的额外消耗。默认值为0.01。取值范围为大于0的实数。
  • 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 --创建一个表tb_for_label。 gaussdb=# CREATE TABLE tb_for_label(col1 text, col2 text, col3 text); --基于表创建资源标签。 gaussdb=# CREATE RESOURCE LABEL IF NOT EXISTS table_label add TABLE(public.tb_for_label); --再次创建已存在的表资源标签,对比加参数IF NOT EXISTS与不加IF NOT EXISTS参数的区别。 gaussdb=# CREATE RESOURCE LABEL IF NOT EXISTS table_label add TABLE(public.tb_for_label); NOTICE: table_label label already defined, skipping CREATE RESOURCE LABEL gaussdb=# CREATE RESOURCE LABEL table_label add TABLE(public.tb_for_label); ERROR: table_label label already defined --基于列创建资源标签。 gaussdb=# CREATE RESOURCE LABEL IF NOT EXISTS column_label add COLUMN(public.tb_for_label.col1); --创建一个模式schema_for_label。 gaussdb=# CREATE SCHEMA schema_for_label; --基于模式创建资源标签。 gaussdb=# CREATE RESOURCE LABEL IF NOT EXISTS schema_label add SCHEMA(schema_for_label); --创建一个视图view_for_label。 gaussdb=# CREATE VIEW view_for_label AS SELECT 1; --基于视图创建资源标签。 gaussdb=# CREATE RESOURCE LABEL IF NOT EXISTS view_label add VIEW(view_for_label); --创建一个函数func_for_label。 gaussdb=# CREATE FUNCTION func_for_label RETURNS TEXT AS $$ SELECT col1 FROM tb_for_label; $$ LANGUAGE SQL; --基于函数创建资源标签。 gaussdb=# CREATE RESOURCE LABEL IF NOT EXISTS func_label add FUNCTION(func_for_label); --删除表资源标签table_label。 gaussdb=# DROP RESOURCE LABEL IF EXISTS table_label; --删除列资源资源标签column_label。 gaussdb=# DROP RESOURCE LABEL IF EXISTS column_label; --删除函数资源标签func_for_label。 gaussdb=# DROP FUNCTION func_for_label; --删除视图资源标签view_for_label。 gaussdb=# DROP VIEW view_for_label; --删除模式资源标签schema_for_label。 gaussdb=# DROP SCHEMA schema_for_label; --删除表tb_for_label。 gaussdb=# DROP TABLE tb_for_label;
  • GLOBAL_PAGEWRITER_STATUS GLOBAL_PAGEWRITER_STATUS视图显示整个集群所有实例的刷页信息和检查点信息,如表1所示。 表1 GLOBAL_PAGEWRITER_STATUS字段 名称 类型 描述 node_name text 实例名称。 pgwr_actual_flush_total_num bigint 从启动到当前时间刷脏页的总计数量。 pgwr_last_flush_num integer 上一批刷脏页数量。 remain_dirty_page_num bigint 当前预计剩余的脏页数量。 queue_head_page_rec_lsn text 当前实例的脏页队列第一个脏页的recovery_lsn。 queue_rec_lsn text 当前实例的脏页队列的recovery_lsn。 current_xlog_insert_lsn text 当前实例xLog写入的位置。 ckpt_redo_point text 当前实例的检查点。 父主题: Utility
  • 背景信息 当用户对数据库中的一张或者多张表的某些字段的组合感兴趣,而又不想每次键入这些查询时,用户就可以定义一个视图,以便解决这个问题。 视图与基本表不同,不是物理上实际存在的,是一个虚表。数据库中仅存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。若基本表中的数据发生变化,从视图中查询出的数据也随之改变。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中用户感兴趣的数据及变化。视图每次被引用的时候都会运行一次。
  • GS_DEPENDENCIES GS_DEPENDENCIES系统表记录对象的依赖项信息,和12.2.15.4 GS_DEPENDENCIES_OBJ表是一个一对多的关系。 表1 GS_DEPENDENCIES字段 名称 类型 描述 schemaname name 名称空间的名称。 refobjpos integer 被依赖体引用的位置。 1:类型。 2:包头。 4:函数头。 8:函数体。 16:包体。 32:视图。 refobjoid oid 被依赖体的oid。 objectname text 依赖体名称。 父主题: 其他系统表
  • PG_AMOP PG_AMOP系统表存储有关和访问方法操作符族关联的信息。如果一个操作符是一个操作符族中的成员,则在这个表中会占据一行。一个族成员是一个search操作符或一个ordering操作符。一个操作符可以在多个族中出现,但是不能在一个族中的多个搜索位置或多个排序位置中出现。 表1 PG_AMOP字段 名称 类型 引用 描述 oid oid - 行标识符(隐含属性,必须明确选择)。 amopfamily oid PG_OPFAMILY.oid 这个项的操作符族。 amoplefttype oid PG_TYPE.oid 操作符的左输入类型。可能取值及其描述见于7.3 数据类型。 amoprighttype oid PG_TYPE.oid 操作符的右输入类型。可能取值及其描述见于7.3 数据类型。 amopstrategy smallint - 操作符策略数。 amoppurpose "char" - 操作符目的。 s:表示搜索。 o:表示排序。 amopopr oid PG_OPERATOR.oid 该操作符的OID。 amopmethod oid PG_AM.oid 索引访问方式操作符族。 amopsortfamily oid PG_OPFAMILY.oid 如果是一个排序操作符,则为这个项排序所依据的btree操作符族;如果是一个搜索操作符,则为0。 search操作符表明这个操作符族的一个索引可以被搜索,找到所有满足WHERE indexed_column operator constant的行。显然,这样的操作符必须返回布尔值,并且它的左输入类型必须匹配索引的字段数据类型。 ordering操作符表明这个操作符族的一个索引可以被扫描,返回以ORDER BY indexed_column operator constant顺序表示的行。这样的操作符可以返回任意可排序的数据类型,它的左输入类型也必须匹配索引的字段数据类型。 ORDER BY的确切的语义是由amopsortfamily字段指定的,该字段必须为操作符的返回类型引用一个btree操作符族。 父主题: 其他系统表
  • 废弃参数 max_query_retry_times enable_slow_query_log tde_cmk_id transparent_encrypted_string transparent_encrypt_kms_url transparent_encrypt_kms_region time_to_target_rpo prefetch_quantity backwrite_quantity cstore_prefetch_quantity cstore_backwrite_max_threshold cstore_backwrite_quantity fast_extend_file_size enable_adio_debug
  • 参数说明 DEFINER 定时任务待执行语句在执行时使用的权限。默认情况下使用当前创建定时任务者的权限,当definer被指定时,使用被指定用户user的用户权限。 definer参数只有具有sysadmin权限的用户有权指定。 ON SCHEDULE 定时任务执行时刻。其中schedule子句与CREATE EVENT中schedule一致。 RENAME TO 更新定时任务名。 ON COMPLETION [NOT] PRESERVE 默认情况下,一旦事务处于完成状态,系统表中就会立刻删除该定时任务。用户可以通过设置ON COMPLETION PRESERVE来覆盖默认行为。 ENABLE | DISABLE | DISABLE ON SLAVE 创建定时任务后,定时任务默认处于ENABLE状态,即到规定时间立即执行待执行语句。用户可以使用DISABLE关键字,改变定时任务的活动状态。DISABLE ON SLAVE表现与DISABLE一致。 COMMENT 用户可以给定时任务添加注释,注释内容在GS_JOB_ATTRIBUTE表中查看。 DO 定时任务待执行语句。
  • 语法格式 ALTER [DEFINER = user] EVENT event_name [ON SCHEDULE schedule] [ON COMPLETION [NOT] PRESERVE] [RENAME TO new_event_name] [ENABLE | DISABLE | DISABLE ON SLAVE] [COMMENT 'string'] [DO event_body] schedule: 1 2 3 4 5 6 { AT timestamp [+ INTERVAL interval] ... | EVERY interval [STARTS timestamp [+ INTERVAL interval] ...] [ENDS timestamp [+ INTERVAL interval] ...] } interval: quantity {YEAR | MONTH | DAY | HOUR | MINUTE | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
  • 示例 --创建并切换至测试数据库。 gaussdb=# CREATE DATABASE test_event WITH DBCOMPATIBILITY = 'b'; gaussdb=# \c test_event --创建表。 test_event=# CREATE TABLE t_ev(num int); --创建一个状态为DISABLE的定时任务,表示此定时任务不开启。 test_event=# CREATE EVENT IF NOT EXISTS event_e1 ON SCHEDULE AT sysdate + interval 5 second DISABLE DO insert into t_ev values(0); --查询定时任务,ENABLE值为'f'。 test_event=# SHOW EVENTS; job_name | schema_name | log_user | priv_user | job_status | start_date | interval | end_date | enable | failure_msg ----------+-------------+----------+-----------+------------+---------------------+----------+---------------------+--------+------------- event_e1 | public | omm | omm | s | 2023-11-28 09:10:58 | null | 3999-12-31 16:00:00 | f | (1 row) --修改定时任务状态为ENABLE,并五秒后查询表。 test_event=# ALTER EVENT event_e1 ENABLE; test_event=# SELECT * FROM t_ev; num ----- 0 (1 row) --创建一个每隔一分钟执行一次的定时任务。 test_event=# CREATE EVENT IF NOT EXISTS event_e2 ON SCHEDULE EVERY 1 minute DO insert into t_ev values(1); --每隔一分钟查询表,会看到新增一条数据。 test_event=# SELECT * FROM t_ev; num ----- 0 1 1 (3 rows) --修改定时任务中待执行语句并查询表。 test_event=# ALTER EVENT event_e2 DO insert into t_ev values(3); test_event=# SELECT * FROM t_ev; num ----- 0 1 1 3 (4 rows) --修改定时任务名称。 test_event=# ALTER EVENT event_e2 RENAME TO event_ee; --删除定时任务。 test_event=# DROP EVENT event_ee; --删除表。 test_event=# DROP TABLE t_ev; --切换回初始数据库,并删除测试数据库。请用真实的数据库名替换postgres。 test_event=# \c postgres gaussdb=# DROP DATABASE test_event;
  • 注意事项 定时任务相关操作只有sql_compatibility = 'B'时支持。 只有定时任务的所有者有权修改对应的定时任务,系统管理员默认拥有修改所有定时任务的权限。 可以通过SHOW EVENTS或在PG_JOB表中查看log_user列来获得job的所有者信息。 每次修改定时任务成功后,会更新被修改job的所有者为当前用户,若修改定时任务时指定了definer,则更新为被指定的definer。 definer选项场景限制与CREATE EVENT章节中对definer限制场景一致。 系统管理员修改其他用户创建的定时任务后,被修改定时任务的所有者将切换为系统管理员,待执行语句将使用系统管理员的权限执行。
  • ADM_TAB_COLUMNS ADM_TAB_COLUMNS视图显示关于表和视图的字段的信息。数据库中每个表和视图的每一个字段在ADM_TAB_COLUMNS里有一行对应的数据。默认只有系统管理员权限才可以访问,普通用户需要授权才可以访问。该视图同时存在于PG_CATALOG和SYS Schema下。 表1 ADM_TAB_COLUMNS字段 名称 类型 描述 owner character varying(64) 表的所有者。 table_name character varying(64) 表的名称。 column_name character varying(64) 列名。 data_type character varying(128) 列的数据类型。 data_type_mod character varying(3) 暂不支持,值为NULL。 data_type_owner character varying(128) 列的数据类型的所有者。 data_length integer 列的字节长度。 data_precision integer 数据类型的精度,对于numeric数据类型有效,其他类型为NULL。 data_scale integer 小数点右边的位数,对于numeric数据类型有效,其他类型为0。 nullable bpchar 该列是否允许为空。取值范围: y:允许。 n:不允许。对于主键约束和非空约束,该值为n。 column_id integer 创建表时列的序号。 default_length numeric 列的默认值字节长度,无默认值时为空。 data_default text 列的默认值。 num_distinct numeric 列中不同值的数量。 low_value raw 列中的最小值。 high_value raw 列中的最大值。 density numeric 列密度。 num_nulls numeric 列中空值数。 num_buckets numeric 列的直方图的桶数。 last_analyzed timestamp(0) without time zone 上次分析的日期。 sample_size numeric 用于分析此列的样本量。 character_set_name character varying(44) 暂不支持,值为NULL。 char_col_decl_length numeric 字符类型列的声明长度。 global_stats character varying(3) 暂不支持,值为NO。 user_stats character varying(3) 暂不支持,值为NO。 avg_col_len numeric 列的平均长度(单位字节)。 char_length numeric 列的长度(以字符计),只对varchar,nvarchar2,bpchar,char类型有效。 char_used character varying(1) 暂不支持,varchar,nvarchar2,bpchar,char类型值为B,其余值为NULL。 v80_fmt_image character varying(3) 暂不支持,值为NULL。 data_upgraded character varying(3) 暂不支持,值为YES。 histogram character varying(15) 直方图是否存在以及存在的类型: NONE:表示不存在直方图。 FREQUENCY:表示频率直方图。 EQUI_WIDTH:表示等宽直方图。 default_on_null character varying(3) 暂不支持,值为NULL。 identity_column character varying(3) 暂不支持,值为NULL。 sensitive_column character varying(3) 暂不支持,值为NULL。 evaluation_edition character varying(128) 暂不支持,值为NULL。 unusable_before character varying(128) 暂不支持,值为NULL。 unusable_beginning character varying(128) 暂不支持,值为NULL。 collation character varying(100) 列的排序规则。因该字段与保留关键字冲突,调用该字段需加视图名。 comments text 列的注释。 schema character varying(64) 列所属的名称空间的名称。 父主题: 其他系统视图
  • transaction_sync_timeout 参数说明:为保证数据一致性,当本地事务与GTM上snapshot中状态不一样时会阻塞其他事务的运行,需要等待本地节点上事务状态与GTM状态一致后再运行。当CN上等待时长超过transaction_sync_timeout时会报错,回滚事务,避免由于sync lock等其他情况长时间线程停止响应造成对系统的阻塞。 该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 取值范围:整型,0 ~ 2147483,单位为秒(s)。 默认值:10min
  • transaction_sync_naptime 参数说明:为保证数据一致性,当本地事务与GTM上snapshot中状态不一样时会阻塞其他事务的运行,需要等待本地节点上事务状态与GTM状态一致后再运行。当CN上等待时长超过transaction_sync_naptime时会主动触发gs_clean进行清理,缩短不一致时的阻塞时长。 该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 取值范围:整型,0 ~ 2147483,单位为秒(s)。 默认值:30s 若该值设为0,则不会在阻塞达到时长时主动调用gs_clean进行清理,而是靠gs_clean_timeout间隔来调用gs_clean,默认是5分钟。
  • 背景 一个数据库可能有很多的用户需要访问,为了方便管理这些用户,将用户组成一个数据库角色。一个数据库角色可以视为一个数据库用户或者一组数据库用户。 对于数据库来说,用户和角色是基本相同的概念,不同之处在于,使用CREATE ROLE创建角色,不会创建同名的SCHEMA,并且默认没有LOGIN权限;而使用CREATE USER创建用户,会自动创建同名的SCHEMA,默认有LOGIN权限。换句话说,一个拥有LOGIN权限的角色可以被认为是一个用户。在业务设计中,仅建议通过ROLE来组织权限,而不是用来访问数据库。
  • 解决方案 数据库用户 数据库用户的主要用途是使用该用户账号连接数据库、访问数据库对象和执行SQL语句。在连接数据库时,必须使用一个已经存在的数据库用户。因此,作为数据库管理员,需要为每一个需要连接数据库的使用者规划一个数据库用户。 在创建数据库用户时,至少需要指定用户名和密码。 默认情况下,数据库用户可以分为两大类,详细信息请参见表1。 表1 用户分类 分类 描述 初始用户 具有数据库的最高权限,并且具有所有的系统权限和对象权限。初始用户不受对象的权限设置影响。这个特点类似UNIX系统的root的权限。从安全角度考虑,除了必要的情况,建议尽量避免以初始用户身份操作。 在安装数据库或者初始化数据库时,可以指定初始用户名和密码。如果不指定用户名则会自动生成一个与安装数据库的OS用户同名的初始用户。如果不指定密码则安装后初始用户密码为空,需要通过gsql客户端设置初始用户的密码后才能执行其他操作。 说明: 基于安全性考虑,GaussDB Kernel禁止了所有用户trust方式的远程登录方式,禁止了初始用户的任何方式的远程登录。 普通用户 默认可以访问数据库的默认系统表和视图(pg_authid、pg_largeobject、pg_user_status和pg_auth_history除外),可以连接默认的数据库postgres以及使用public模式下的对象(包括表、视图和函数等)。 可以通过CREATE USER、ALTER USER指定系统权限,或者通过GRANT ALL PRIVILEGE授予SYSADMIN权限。 可以通过GRANT语句授予某些对象的权限。 可以通过GRANT语法将其他角色或用户的权限授权给该用户。 数据库权限分类 通过权限和角色,可以控制用户访问指定的数据,以及执行指定类型的SQL语句。详细信息请参见表2。 系统权限只能通过CREATE/ALTER USER、CREATE/ALTER ROLE语句指定(其中SYSADMIN还可以通过GRANT/REVOKE ALL PRIVILEGES的方式赋予、回收),无法从角色继承。 表2 权限分类 分类 描述 系统权限 系统权限又称为用户属性,可以在创建用户和修改用户时指定,包括SYSADMIN、MONADMIN、OPRADMIN、POLADMIN、CREATEDB、CREATEROLE、AUDITADMIN和LOGIN。 系统权限一般通过CREATE/ALTER USER语句指定。除了SYSADMIN外的其他系统权限,无法通过GRANT/REVOKE进行授予和撤销。并且,系统权限无法通过ROLE被继承。 对象权限 对象权限是指在表、视图、索引和函数等数据库对象上执行各种操作的权限,对象权限包括SELECT、INSERT、UPDATE和DELETE等。 只有对象的所有者或者系统管理员才可以执行GRANT/REVOKE语句来分配/撤销对象权限。 角色 角色是一组权限的集合,可以将一个角色的权限赋予其他角色和用户。 由于无法给其他角色和用户赋予系统权限,所以角色只有是对象权限的集合时才有意义。 数据库权限模型 系统权限模型 默认权限机制 图1 权限架构 权限架构如图1,默认权限机制下sysadmin具有大多数的权限。 初始安装用户:集群安装过程中自动生成的账户,拥有系统的最高权限,能够执行所有的操作。 SYSADMIN:系统管理员权限,权限仅次于初始安装用户,默认具有与对象所有者相同的权限,但不包括监控管理员权限和运维管理员权限。 MONADMIN:监控管理员权限,具有监控模式dbe_perf及模式下视图和函数的访问权限和授予权限。 OPRADMIN:运维管理员权限,具有使用Roach工具执行备份恢复的权限。 CREATEROLE:安全管理员权限,具有创建、修改、删除用户/角色的权限。 AUDITADMIN:审计管理员权限,具有查看和维护数据库审计日志的权限。 CREATEDB:具有创建数据库的权限。 POLADMIN:安全策略管理员权限,具有创建资源标签,数据动态脱敏策略和统一审计策略的权限。 三权分立机制 图2 三权分立机制 SYSADMIN:系统管理员权限,不再具有创建、修改、删除用户/角色的权限,也不再具有查看和维护数据库审计日志的权限。 CREATEROLE:安全管理员权限,具有创建、修改、删除用户/角色的权限。 AUDITADMIN:审计管理员权限,具有查看和维护数据库审计日志的权限。 一个用户/角色只能具有SYSADMIN、CREATEROLE和AUDITADMIN中的一项系统权限。 对象权限模型 对象权限:指在数据库、模式、表等数据库对象上执行特定动作的权限,比如:SELECT、INSERT、UPDATE、DELETE、CONNECT等。 针对不同的数据库对象有不同的对象权限,相应地可以被授予用户/角色。 通过GRANT/REVOKE来传递对象权限,对象权限可以通过角色被继承。 角色权限模型 GaussDB Kernel提供了一组默认角色,以gs_role_开头命名。它们提供对特定的、通常需要高权限操作的访问,可以将这些角色GRANT给数据库内的其他用户或角色,让这些用户能够使用特定的功能。在授予这些角色时应当非常小心,以确保它们被用在需要的地方。表3描述了内置角色允许的权限范围。 表3 内置角色权限 角色 权限描述 gs_role_copy_files 具有执行copy … to/from filename的权限,但需要先打开GUC参数enable_copy_server_files。 gs_role_signal_backend 具有调用函数pg_cancel_backend()、pg_terminate_backend()和pg_terminate_session()来取消或终止其他会话的权限,但不能操作属于初始用户和PERSISTENCE用户的会话。 gs_role_tablespace 具有创建表空间(tablespace)的权限。 gs_role_replication 具有调用逻辑复制相关函数的权限,例如kill_snapshot()、pg_create_logical_replication_slot()、pg_create_physical_replication_slot()、pg_drop_replication_slot()、pg_replication_slot_advance()、pg_create_physical_replication_slot_extern()、pg_logical_slot_get_changes()、pg_logical_slot_peek_changes(),pg_logical_slot_get_binary_changes()、pg_logical_slot_peek_binary_changes()。 gs_role_account_lock 具有加解锁用户的权限,但不能加解锁初始用户和PERSISTENCE用户。 gs_role_pldebugger 具有执行dbe_pldebugger下调试函数的权限。 gs_role_directory_create 具有执行创建directory对象的权限,但需要先打开GUC参数enable_access_server_directory。 gs_role_directory_drop 具有执行删除directory对象的权限,但需要先打开GUC参数enable_access_server_directory。 系统权限配置 默认权限机制配置方法 初始用户 数据库安装过程中自动生成的账户称为初始用户。初始用户也是系统管理员、监控管理员、运维管理员和安全策略管理员,拥有系统的最高权限,能够执行所有的操作。如果安装时不指定初始用户名称则该账户与进行数据库安装的操作系统用户同名。如果在安装时不指定初始用户的密码,安装完成后密码为空,在执行其他操作前需要通过gsql客户端修改初始用户的密码。如果初始用户密码为空,则除修改密码外无法执行其他SQL操作以及升级、扩容、节点替换等操作。 初始用户会绕过所有权限检查。建议仅将此初始用户作为DBA管理用途,而非业务用途。 系统管理员 gaussdb=#CREATE USER u_sysadmin WITH SYSADMIN password '********'; --或者使用如下SQL,效果一样,需要该用户已存在。 gaussdb=#ALTER USER u_sysadmin01 SYSADMIN; 监控管理员 gaussdb=#CREATE USER u_monadmin WITH MONADMIN password '********'; --或者使用如下SQL,效果一样,需要该用户已存在。 gaussdb=#ALTER USER u_monadmin01 MONADMIN; 运维管理员 gaussdb=#CREATE USER u_opradmin WITH OPRADMIN password "xxxxxxxxx"; --或者使用如下SQL,效果一样,需要该用户已存在。 gaussdb=#ALTER USER u_opradmin01 OPRADMIN; 安全策略管理员 gaussdb=#CREATE USER u_poladmin WITH POLADMIN password "xxxxxxxxx"; --或者使用如下SQL,效果一样,需要该用户已存在。 gaussdb=#ALTER USER u_poladmin01 POLADMIN; 三权分立机制配置方式 此模式需要设置guc参数“enableSeparationOfDut”y的值为“on”,该参数为POSTMASTER类型参数,修该完之后需要重启数据库。 gs_guc set -Z datanode -N all -I all -c "enableSeparationOfDuty=on" gs_om -t stop gs_om -t start 创建和配置相应的用户权限的语法和默认权限一致。 角色权限配置 --创建数据库test gaussdb=#CREATE DATABASE test; --创建角色role1,创建用户user1 gaussdb=#CREATE ROLE role1 PASSWORD '********'; gaussdb=#CREATE USER user1 PASSWORD '********'; --赋予CREATE ANY TABLE权限角色role1 gaussdb=#GRANT CREATE ON DATABASE test TO role1; --将角色role1赋予给用户user1,则用户user1属于组role1,继承role1的相应权限可以在test数据库中创建模式。 gaussdb=#GRANT role1 TO user1; --查询用户和角色信息 gaussdb=#\du role1|user1; List of roles Role name | Attributes | Member of -----------+--------------+----------- role1 | Cannot login | {} user1 | | {role1}
共100000条