华为云用户手册

  • 示例:多线程导入 规划数据服务器与集群处于同一内网,数据服务器IP为192.168.0.90,导入的数据源文件格式为 CS V,同时导入2个目标表。 在数据库中创建导入的目标表tpcds.reasons1和tpcds.reasons2。 1 2 3 4 5 6 postgres=# CREATE TABLE tpcds.reasons1 ( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100) ) ; 1 2 3 4 5 6 postgres=# CREATE TABLE tpcds.reasons2 ( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100) ) ; (可选)创建用户及其所属的用户组。此用户用于启动GDS。若该用户及所属用户组已存在,可跳过此步骤。 groupadd gdsgrp useradd -g gdsgrp gds_user 切换用户gds_user,登录GDS数据服务器,创建数据文件存放目录“/input_data”,以及子目录“/input_data/import1/”和“/input_data/import2/”。 su - gds_user mkdir -p /input_data 将目标表tpcds.reasons1的数据源文件存放在数据服务器“/input_data/import1/”目录下,将目标表tpcds.reasons2的数据源文件存放在目录“/input_data/import2/”下。 修改数据服务器上数据文件及数据文件目录“/input_data”的属主为gds_user。 chown -R gds_user:gdsgrp /input_data 以gds_user用户登录数据服务器上启动GDS。 其中GDS安装路径为“/gds”,数据文件存放在“/input_data/”目录下,数据服务器所在IP为192.168.0.90,GDS侦听端口为5000,以后台方式运行,设定并发度为2,并设定递归文件目录。 /gds/gds -d /input_data -p 192.168.0.90:5000 -H 10.10.0.1/24 -D -t 2 -r 在数据库中创建外表tpcds.foreign_tpcds_reasons1和tpcds.foreign_tpcds_reasons2用于接收数据服务器上的数据。 以下以外表tpcds.foreign_tpcds_reasons1为例,讲解设置的导入外表参数信息。 其中设置的导入模式信息如下所示: 导入模式为Normal模式。 由于启动GDS时,设置的数据源文件存放目录为“/input_data/”,GDS侦听端口为5000,实际存放数据源文件目录为“/input_data/import1/”,所以设置参数“location”为“gsfs://192.168.0.90:5000/import1/*”。 设置的数据格式信息是根据导出时设置的详细数据格式参数信息指定的,参数设置如下所示: 数据源文件格式(format)为CSV。 编码格式(encoding)为UTF-8。 字段分隔符(delimiter)为E'\x08'。 引号字符(quote)为0x1b。 数据文件中空值(null)为没有引号的空字符串。 逃逸字符(escape)为默认值双引号。 数据文件是否包含标题行(header)为默认值false,即导入时数据文件第一行被识别为数据。 设置的导入容错性如下所示: 允许出现的数据格式错误个数(PER NODE REJECT LIMIT 'value')为unlimited,即接受导入过程中所有数据格式错误。 将数据导入过程中出现的数据格式错误信息( LOG INTO error_table_name)写入表err_tpcds_reasons1。 当数据源文件中一行的最后一个字段缺失(fill_missing_fields)时,自动设置为NULL。 根据以上信息,创建的外表tpcds.foreign_tpcds_reasons1如下所示: 1 2 3 4 5 6 postgres=# CREATE FOREIGN TABLE tpcds.foreign_tpcds_reasons1 ( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100) ) SERVER gsmpp_server OPTIONS (location 'gsfs://192.168.0.90:5000/import1/*', format 'CSV',mode 'Normal', encoding 'utf8', delimiter E'\x08', quote E'\x1b', null '',fill_missing_fields 'on')LOG INTO err_tpcds_reasons1 PER NODE REJECT LIMIT 'unlimited'; 参考以上设置,创建的外表tpcds.foreign_tpcds_reasons2如下所示: 1 2 3 4 5 6 postgres=# CREATE FOREIGN TABLE tpcds.foreign_tpcds_reasons2 ( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100) ) SERVER gsmpp_server OPTIONS (location 'gsfs://192.168.0.90:5000/import2/*', format 'CSV',mode 'Normal', encoding 'utf8', delimiter E'\x08', quote E'\x1b', null '',fill_missing_fields 'on')LOG INTO err_tpcds_reasons2 PER NODE REJECT LIMIT 'unlimited'; 通过外表tpcds.foreign_tpcds_reasons1和tpcds.foreign_tpcds_reasons2将数据分别导入tpcds.reasons1和tpcds.reasons2。 1 postgres=# INSERT INTO tpcds.reasons1 SELECT * FROM tpcds.foreign_tpcds_reasons1; 1 postgres=# INSERT INTO tpcds.reasons2 SELECT * FROM tpcds.foreign_tpcds_reasons2; 查询错误信息表err_tpcds_reasons1和err_tpcds_reasons2,处理数据导入错误。详细请参见处理错误表。 1 2 postgres=# SELECT * FROM err_tpcds_reasons1; postgres=# SELECT * FROM err_tpcds_reasons2; 待数据导入完成后,以gds_user用户登录数据服务器,停止GDS。 其中GDS进程号为128954。 ps -ef|grep gds gds_user 128954 1 0 15:03 ? 00:00:00 gds -d /input_data -p 192.168.0.90:5000 -D -t 2 -r gds_user 129003 118723 0 15:04 pts/0 00:00:00 grep gds kill -9 128954
  • 示例:多数据服务器并行导入 规划数据服务器与集群处于同一内网,数据服务器IP为192.168.0.90和192.168.0.91。数据源文件格式为CSV。 创建导入的目标表tpcds.reasons。 1 2 3 4 5 6 postgres=# CREATE TABLE tpcds.reasons ( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100) ); (可选)创建用户及其所属的用户组。此用户用于启动GDS。若该类用户及所属用户组已存在,可跳过此步骤。 groupadd gdsgrp useradd -g gdsgrp gds_user 切换用户gds_user,登录每台GDS数据服务器,在两台数据服务器上,分别创建数据文件存放目录“/input_data”。以下以IP为192.168.0.90的数据服务器为例进行操作,剩余服务器上的操作与它一致。 su - gds_user mkdir -p /input_data 将数据源文件均匀分发至相应数据服务器的“/input_data”目录中。 修改每台数据服务器上数据文件及数据文件目录“/input_data”的属主为gds_user。以下以IP为192.168.0.90的数据服务器为例,进行操作。 chown -R gds_user:gdsgrp /input_data 以gds_user用户登录每台数据服务器上分别启动GDS。 其中GDS安装路径为“/opt/bin/gds”,数据文件存放在“/input_data/”目录下,数据服务器所在IP为192.168.0.90和192.168.0.91,GDS侦听端口为5000,以后台方式运行。 在IP为192.168.0.90的数据服务器上启动GDS。 /gds/gds -d /input_data -p 192.168.0.90:5000 -H 10.10.0.1/24 -D 在IP为192.168.0.91的数据服务器上启动GDS。 /gds/gds -d /input_data -p 192.168.0.91:5000 -H 10.10.0.1/24 -D 创建外表tpcds.foreign_tpcds_reasons用于接收数据服务器上的数据。 其中设置导入模式信息如下所示: 导入模式为Normal模式。 由于启动GDS时,设置的数据源文件存放目录为“/input_data”,GDS侦听端口为5000,所以设置参数“location”为“gsfs://192.168.0.90:5000/* | gsfs://192.168.0.91:5000/*”。 设置数据格式信息是根据导出时设置的详细数据格式参数信息指定的,参数设置如下所示: 数据源文件格式(format)为CSV。 编码格式(encoding)为UTF-8。 字段分隔符(delimiter)为E'\x08'。 引号字符(quote)为0x1b。 数据文件中空值(null)为没有引号的空字符串。 逃逸字符(escape)为默认值双引号。 数据文件是否包含标题行(header)为默认值false,即导入时数据文件第一行被识别为数据。 设置导入容错性如下所示: 允许出现的数据格式错误个数(PER NODE REJECT LIMIT 'value')为unlimited,即接受导入过程中所有数据格式错误。 将数据导入过程中出现的数据格式错误信息(LOG INTO error_table_name)写入表err_tpcds_reasons。 根据以上信息,创建的外表如下所示: 1 2 3 4 5 6 7 postgres=# CREATE FOREIGN TABLE tpcds.foreign_tpcds_reasons ( r_reason_sk integer not null, r_reason_id char(16) not null, r_reason_desc char(100) ) SERVER gsmpp_server OPTIONS (location 'gsfs://192.168.0.90:5000/* | gsfs://192.168.0.91:5000/*', format 'CSV',mode 'Normal', encoding 'utf8', delimter E'\x08', quote E'\x1b', null '', fill_missing_fields 'false') LOG INTO err_tpcds_reasons PER NODE REJECT LIMIT 'unlimited'; 通过外表tpcds.foreign_tpcds_reasons,将数据导入目标表tpcds.reasons。 1 postgres=# INSERT INTO tpcds.reasons SELECT * FROM tpcds.foreign_tpcds_reasons; 查询错误信息表err_tpcds_reasons,处理数据导入错误。详细请参见处理错误表。 1 postgres=# SELECT * FROM err_tpcds_reasons; 待数据导入完成后,以gds_user用户登录每台数据服务器,分别停止GDS。 以下以IP为192.168.0.90的数据服务器为例,停止GDS。其中GDS进程号为128954。 ps -ef|grep gds gds_user 128954 1 0 15:03 ? 00:00:00 gds -d /input_data -p 192.168.0.90:5000 -D gds_user 129003 118723 0 15:04 pts/0 00:00:00 grep gds kill -9 128954
  • HashFunc函数 bucketabstime(value,flag) 描述:对abstime格式的数值value计算hash值并找到对应的hashbucket桶。 参数:value为需要转换的数值,类型为abstime,flag为int类型表示数据分布方式,0表示hash分布。 返回值类型:int32 示例: 1 2 3 4 5 postgres=# select bucketabstime('2011-10-01 10:10:10.112',1); bucketabstime --------------- 13954 (1 row) bucketbool(value,flag) 描述:对bool格式的数值value计算hash值并找到对应的hashbucket桶。 参数:value为需要转换的数值,类型为bool,flag为int类型表示数据分布方式,0表示hash分布。 返回值类型:int32 示例: 1 2 3 4 5 6 7 8 9 10 postgres=# select bucketbool(true,1); bucketbool ------------ 1 (1 row) postgres=# select bucketbool(false,1); bucketbool ------------ 0 (1 row) bucketbpchar(value, flag) 描述:对bpchar格式的数值value计算hash值并找到对应的hashbucket桶。 参数:value为需要转换的数值,类型为bpchar,flag为int类型表示数据分布方式,0表示hash分布。 返回值类型:int32 示例: 1 2 3 4 5 postgres=# select bucketbpchar('test',1); bucketbpchar -------------- 9761 (1 row) bucketbytea(value,flag) 描述:对bytea格式的数值value计算hash值并找到对应的hashbucket桶。 参数:value为需要转换的数值,类型为bytea,flag为int类型表示数据分布方式,0表示hash分布。 返回值类型:int32 示例: 1 2 3 4 5 postgres=# select bucketbytea('test',1); bucketbytea ------------- 9761 (1 row) bucketcash(value,flag) 描述:对money格式的数值value计算hash值并找到对应的hashbucket桶。 参数:value为需要转换的数值,类型为money,flag为int类型表示数据分布方式,0表示hash分布。 返回值类型:int32 示例: 1 2 3 4 5 postgres=# select bucketcash(10::money,1); bucketcash ------------ 8468 (1 row) getbucket(value,flag) 描述:从分布列获取hashbucket桶。 value为需要输入的数值,类型: “char”,abstime,bigint,boolean,bytea,character varying,character,date,double precision,int2vector,integer,interval,money,name,numeric,nvarchar2,oid,oidvector,raw,real,record,reltime,smalldatetime,smallint,text,time with time zone,time without time zone,timestamp with time zone,timestamp without time zone,tinyint,uuid。 flag表示数据分布方式,类型:integer 返回值类型:integer 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 postgres=# select getbucket(10,'H'); getbucket ----------- 14535 (1 row) postgres=# select getbucket(11,'H'); getbucket ----------- 13449 (1 row) postgres=# select getbucket(11,'R'); getbucket ----------- 13449 (1 row) postgres=# select getbucket(12,'R'); getbucket ----------- 9412 (1 row) hash_array(anyarray) 描述:数组哈希,将数组的元素通过哈希函数得到结果,并返回合并结果。 参数:数据类型为anyarray。 返回值类型:integer 示例: 1 2 3 4 5 postgres=# select hash_array(ARRAY[[1,2,3],[1,2,3]]); hash_array ------------ -382888479 (1 row) hash_group(key) 描述:流引擎中,该函数可将Group Clause中的各列计算为一个hash值。 参数:key为Group Clause中各列的值。 返回值类型:32位hash值 示例: 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 按照步骤依次执行。 postgres=# CREATE TABLE tt(a int, b int,c int,d int); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'a' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE postgres=# select * from tt; a | b | c | d ---+---+---+--- (0 rows) postgres=# insert into tt values(1,2,3,4); INSERT 0 1 postgres=# select * from tt; a | b | c | d ---+---+---+--- 1 | 2 | 3 | 4 (1 row) postgres=# insert into tt values(5,6,7,8); INSERT 0 1 postgres=# select * from tt; a | b | c | d ---+---+---+--- 1 | 2 | 3 | 4 5 | 6 | 7 | 8 (2 rows) postgres=# select hash_group(a,b) from tt where a=1 and b=2; hash_group ------------ 990882385 (1 row) hash_numeric(numeric) 描述:计算Numeric类型的数据的hash值。 参数:Numeric类型的数据。 返回值类型:integer 示例: 1 2 3 4 5 postgres=# select hash_numeric(30); hash_numeric -------------- -282860963 (1 row) hash_range(anyrange) 描述:计算range的哈希值。 参数:anyrange类型的数据。 返回值类型:integer 示例: 1 2 3 4 5 postgres=# select hash_range(numrange(1.1,2.2)); hash_range ------------ 683508754 (1 row) hashbpchar(character) 描述:计算bpchar的哈希值。 参数:character类型的数据。 返回值类型:integer 示例: 1 2 3 4 5 postgres=# select hashbpchar('hello'); hashbpchar ------------- -1870292951 (1 row) hashchar(char) 描述:char和布尔数据转换为哈希值。 参数:char类型的数据或者bool类型的数据。 返回值类型:integer 示例: 1 2 3 4 5 6 7 8 9 10 11 postgres=# select hashbpchar('hello'); hashbpchar ------------- -1870292951 (1 row) postgres=# select hashchar('true'); hashchar ------------ 1686226652 (1 row) hashenum(anyenum) 描述:枚举类型转哈希值。 参数:anyenum类型的数据。 返回值类型:integer 示例: 1 2 3 4 5 6 7 postgres=# CREATE TYPE b1 AS ENUM('good', 'bad', 'ugly'); CREATE TYPE postgres=# call hashenum('good'::b1); hashenum ------------ 1821213359 (1 row) hashfloat4(real) 描述:float4转哈希值。 参数:real类型的数据。 返回值类型:integer 示例: 1 2 3 4 5 postgres=# select hashfloat4(12.1234); hashfloat4 ------------ 1398514061 (1 row) hashfloat8(double precision) 描述:float8转哈希值。 参数:double precision类型的数据。 返回值类型:integer 示例: 1 2 3 4 5 postgres=# select hashfloat8(123456.1234); hashfloat8 ------------ 1673665593 (1 row) hashinet(inet) 描述:支持inet / cidr上的哈希索引的功能。返回传入inet的hash值。 参数:inet类型的数据。 返回值类型:integer 示例: 1 2 3 4 5 postgres=# select hashinet('127.0.0.1'::inet); hashinet ------------- -1435793109 (1 row) hashint1(tinyint) 描述:INT1转哈希值。 参数:tinyint类型的数据。 返回值类型:uint32 示例: 1 2 3 4 5 postgres=# select hashint1(20); hashint1 ------------- -2014641093 (1 row) hashint2(smallint) 描述:INT2转哈希值。 参数:smallint类型的数据。 返回值类型:uint32 示例: postgres=# select hashint2(20000); hashint2 ------------ -863179081 (1 row) bucketchar 描述:计算入参的哈希值。 参数:char, integer 返回值类型:integer bucketdate 描述:计算入参的哈希值。 参数:date, integer 返回值类型:integer bucketfloat4 描述:计算入参的哈希值。 参数:real, integer 返回值类型:integer bucketfloat8 描述:计算入参的哈希值。 参数:double precision, integer 返回值类型:integer bucketint1 描述:计算入参的哈希值。 参数:tinyint, integer 返回值类型:integer bucketint2 描述:计算入参的哈希值。 参数:smallint, integer 返回值类型:integer bucketint2vector 描述:计算入参的哈希值。 参数:int2vector, integer 返回值类型:integer bucketint4 描述:计算入参的哈希值。 参数:integer, integer 返回值类型:integer bucketint8 描述:计算入参的哈希值。 参数:bigint, integer 返回值类型:integer bucketinterval 描述:计算入参的哈希值。 参数:interval, integer 返回值类型:integer bucketname 描述:计算入参的哈希值。 参数:name, integer 返回值类型:integer bucketnumeric 描述:计算入参的哈希值。 参数:numeric, integer 返回值类型:integer bucketnvarchar2 描述:计算入参的哈希值。 参数:nvarchar2, integer 返回值类型:integer bucketoid 描述:计算入参的哈希值。 参数:oid, integer 返回值类型:integer bucketoidvector 描述:计算入参的哈希值。 参数:oidvector, integer 返回值类型:integer bucketraw 描述:计算入参的哈希值。 参数:raw, integer 返回值类型:integer bucketreltime 描述:计算入参的哈希值。 参数:reltime, integer 返回值类型:integer bucketsmalldatetime 描述:计算入参的哈希值。 参数:smalldatetime, integer 返回值类型:integer buckettext 描述:计算入参的哈希值。 参数:text, integer 返回值类型:integer buckettime 描述:计算入参的哈希值。 参数:time without time zone, integer 返回值类型:integer buckettimestamp 描述:计算入参的哈希值。 参数:timestamp without time zone, integer 返回值类型:integer buckettimestamptz 描述:计算入参的哈希值。 参数:timestamp with time zone, integer 返回值类型:integer buckettimetz 描述:计算入参的哈希值。 参数:time with time zone, integer 返回值类型:integer bucketuuid 描述:计算入参的哈希值。 参数:uuid, integer 返回值类型:integer bucketvarchar 描述:计算入参的哈希值。 参数:character varying, integer 返回值类型:integer 父主题: 函数和操作符
  • 语法格式 1 2 3 4 5 6 7 8 9 CREATE DATABASE database_name [ [ WITH ] { [ OWNER [=] user_name ] | [ TEMPLATE [=] template ] | [ ENCODING [=] encoding ] | [ LC_COLLATE [=] lc_collate ] | [ LC_CTYPE [=] lc_ctype ] | [ DBCOMPATIBILITY [=] compatibilty_type ] | [ TABLESPACE [=] tablespace_name ] | [ CONNECTION LIMIT [=] connlimit ]}[...] ];
  • 示例 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 --创建jim和tom用户。 postgres=# CREATE USER jim PASSWORD 'xxxxxxxxxx'; postgres=# CREATE USER tom PASSWORD 'xxxxxxxxxx'; --创建一个GBK编码的数据库music(本地环境的编码格式必须也为GBK)。 postgres=# CREATE DATABASE music ENCODING 'GBK' template = template0; --创建数据库music2,并指定所有者为jim。 postgres=# CREATE DATABASE music2 OWNER jim; --用模板template0创建数据库music3,并指定所有者为jim。 postgres=# CREATE DATABASE music3 OWNER jim TEMPLATE template0; --设置music数据库的连接数为10。 postgres=# ALTER DATABASE music CONNECTION LIMIT= 10; --将music名称改为music4。 postgres=# ALTER DATABASE music RENAME TO music4; --将数据库music2的所属者改为tom。 postgres=# ALTER DATABASE music2 OWNER TO tom; --删除数据库。 postgres=# DROP DATABASE music2; postgres=# DROP DATABASE music3; postgres=# DROP DATABASE music4; --删除jim和tom用户。 postgres=# DROP USER jim; postgres=# DROP USER tom; --创建兼容TD格式的数据库。 postgres=# CREATE DATABASE td_compatible_db DBCOMPATIBILITY 'TD'; --创建兼容ORA格式的数据库。 postgres=# CREATE DATABASE ora_compatible_db DBCOMPATIBILITY 'ORA'; --删除兼容TD、ORA格式的数据库。 postgres=# DROP DATABASE td_compatible_db; postgres=# DROP DATABASE ora_compatible_db;
  • resource_track_log 参数说明:控制自诊断的日志级别。目前仅对多列统计信息进行控制。 该参数属于USERSET类型参数,请参考重设参数中对应设置方法进行设置。 取值范围:字符串 summary:显示简略的诊断信息。 detail:显示详细的诊断信息。 目前这两个参数值只在显示多列统计信息未收集的告警的情况下有差别,summary不显示未收集多列统计信息的告警,detail会显示这类告警。 默认值:summary
  • log_temp_files 参数说明:控制记录临时文件的删除信息。临时文件可以用来排序、哈希及临时查询结果。当一个临时文件被删除时,将会产生一条日志消息。 该参数属于SUSET类型参数,请参考重设参数中对应设置方法进行设置。 取值范围:整型,-1 ~ 2147483647,单位KB。 正整数表示只记录比log_temp_files设定值大的临时文件的删除信息。 0表示记录所有的临时文件的删除信息。 -1表示不记录任何临时文件的删除信息。 默认值:-1
  • enable_unshipping_log 参数说明:用于控制是否打印语句不下推的日志,主要用于帮助用户定位不下推语句可能导致的性能问题。当enable_stream_operator参数关闭时,如果这个参数设置为on,会有大量关于计划不能下推的日志记录到日志文件中。如果用户不需要这些日志内容,建议用户在enable_stream_operator参数关闭时,也同时关闭enable_unshipping_log参数。 该参数属于USERSET类型参数,请参考重设参数中对应设置方法进行设置。 取值范围:布尔型 on表示打印日志。 off表示不打印日志。 默认值:off
  • log_statement 参数说明:控制记录SQL语句。对于使用扩展查询协议的客户端,记录接收到执行消息的事件和绑定参数的值(内置单引号要双写)。 该参数属于SUSET类型参数,请参考重设参数中对应设置方法进行设置。 即使log_statement设置为all,包含简单语法错误的语句也不会被记录,因为仅在完成基本的语法分析并确定了语句类型之后才记录日志。在使用扩展查询协议的情况下,在执行阶段之前(语法分析或规划阶段)同样不会记录。将log_min_error_statement设为ERROR或更低才能记录这些语句。 取值范围:枚举类型 none表示不记录语句。 ddl表示记录所有的数据定义语句,比如CREATE、ALTER和DROP语句。 mod表示记录所有DDL语句,还包括数据修改语句INSERT、UPDATE、DELETE、TRUNCATE和COPY FROM 。 all表示记录所有语句,PREPARE、EXECUTE和EXPLAIN ANALYZE语句也同样被记录。 默认值:none
  • logging_module 参数说明:用于设置或者显示模块日志在服务端的可输出性。该参数属于会话级参数。 该参数属于USERSET类型参数,设置请参考重设参数中对应设置的方法进行设置。 取值范围:字符串 默认值:所有模块日志在服务端是不输出的,可由SHOW logging_module查看。为 ALL,on(),off(DFS,GUC,ORC,SLRU,MEM_CTL,AUTOVAC,CACHE,ADIO,SSL,GDS,TBLSPC,WLM,OBS,EXECUTOR,VEC_EXECUTOR,STREAM,LLVM,OPT,OPT_REWRITE,OPT_JOIN,OPT_AGG,OPT_SUBPLAN,OPT_SETOP,OPT_SKEW,UDF,COOP_ANALYZE,WLMCP,ACCELERATE,PARQUET,PLANHINT,SNAPSHOT,XACT,HANDLE,CLOG,EC,REMOTE,CN_RETRY,PLSQL,TEXTSEARCH,SEQ,REDO,FUNCTION,PARSER,INSTR,INCRE_CKPT,DBL_WRT,RTO,HEARTBEAT,COMM_IPC,COMM_PA RAM ) 设置方法:首先,可以通过SHOW logging_module来查看哪些模块是支持可控制的。例如,查询输出结果为: 1 2 3 4 5 postgres=# show logging_module; logging_module -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ALL,on(),off(DFS,GUC,ORC,SLRU,MEM_CTL,AUTOVAC,CACHE,ADIO,SSL,GDS,TBLSPC,WLM,OBS,EXECUTOR,VEC_EXECUTOR,STREAM,LLVM,OPT,OPT_REWRITE,OPT_JOIN,OPT_AGG,OPT_SUBPLAN,OPT_SETOP,OPT_SKEW,UDF,COOP_ANALYZE,WLMCP,ACCELERATE,PARQUET,PLANHINT,SNAPSHOT,XACT,HANDLE,CLOG,EC,REMOTE,CN_RETRY,PLSQL,TEXTSEARCH,SEQ,REDO,FUNCTION,PARSER,INSTR,INCRE_CKPT,DBL_WRT,RTO,HEARTBEAT,COMM_IPC,COMM_PARAM) (1 row) 支持可控制的模块使用大写来标识,特殊标识ALL用于对所有模块日志进行设置。可以使用on/off来控制模块日志的输出。设置SSL模块日志为可输出,使用如下命令: 1 2 3 4 5 postgres=# set logging_module='on(SSL)'; SET postgres=# show logging_module; logging_module ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ALL,on(SSL),off(DFS,GUC,ORC,SLRU,MEM_CTL,AUTOVAC,CACHE,ADIO,GDS,TBLSPC,WLM,OBS,EXECUTOR,VEC_EXECUTOR,STREAM,LLVM,OPT,OPT_REWRITE,OPT_JOIN,OPT_AGG,OPT_SUBPLAN,OPT_SETOP,OPT_SKEW,UDF,COOP_ANALYZE,WLMCP,ACCELERATE,PARQUET,PLANHINT,SNAPSHOT,XACT,HANDLE,CLOG,EC,REMOTE,CN_RETRY,PLSQL,TEXTSEARCH,SEQ,REDO,FUNCTION,PARSER,INSTR,INCRE_CKPT,DBL_WRT,RTO,HEARTBEAT,COMM_IPC,COMM_PARAM) (1 row) 可以看到模块SSL的日志输出被打开。 ALL标识是相当于一个快捷操作,即对所有模块的日志可输出进行开启或关闭。 1 2 3 4 5 6 7 8 9 10 11 postgres=# set logging_module='off(ALL)'; SET postgres=# show logging_module; logging_module -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ALL,on(),off(DFS,GUC,ORC,SLRU,MEM_CTL,AUTOVAC,CACHE,ADIO,SSL,GDS,TBLSPC,WLM,OBS,EXECUTOR,VEC_EXECUTOR,STREAM,LLVM,OPT,OPT_REWRITE,OPT_JOIN,OPT_AGG,OPT_SUBPLAN,OPT_SETOP,OPT_SKEW,UDF,COOP_ANALYZE,WLMCP,ACCELERATE,PARQUET,PLANHINT,SNAPSHOT,XACT,HANDLE,CLOG,EC,REMOTE,CN_RETRY,PLSQL,TEXTSEARCH,SEQ,REDO,FUNCTION,PARSER,INSTR,INCRE_CKPT,DBL_WRT,RTO,HEARTBEAT,COMM_IPC,COMM_PARAM) (1 row) postgres=# set logging_module='on(ALL)'; SET postgres=# show logging_module; logging_module -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ALL,on(DFS,GUC,ORC,SLRU,MEM_CTL,AUTOVAC,CACHE,ADIO,SSL,GDS,TBLSPC,WLM,OBS,EXECUTOR,VEC_EXECUTOR,STREAM,LLVM,OPT,OPT_REWRITE,OPT_JOIN,OPT_AGG,OPT_SUBPLAN,OPT_SETOP,OPT_SKEW,UDF,COOP_ANALYZE,WLMCP,ACCELERATE,PARQUET,PLANHINT,SNAPSHOT,XACT,HANDLE,CLOG,EC,REMOTE,CN_RETRY,PLSQL,TEXTSEARCH,SEQ,REDO,FUNCTION,PARSER,INSTR,INCRE_CKPT,DBL_WRT,RTO,HEARTBEAT,COMM_IPC,COMM_PARAM),off() (1 row) 依赖关系:该参数依赖于log_min_level参数的设置
  • opfusion_debug_mode 参数说明:用于调试简单查询是否进行查询优化。设置成log级别可以在DN的执行计划中看到没有查询优化的具体原因。 该参数属于USERSET类型参数,请参考重设参数中对应设置方法进行设置。 取值范围:枚举类型 off表示不打开该功能。 log表示打开该功能,可以在DN的执行计划中看到没有查询优化的具体原因。 需要设置参数max_datanode_for_plan才能看到DN的执行计划。 提供在log中显示语句没有查询优化的具体原因,需要将参数设置成log级别,log_min_messages设置成debug4级别,logging_module设置'on(OPFUSION)',注意log内容可能会比较多,尽可能在调优期间执行少量作业使用。 默认值:off
  • log_duration 参数说明:控制记录每个已完成SQL语句的执行时间。对使用扩展查询协议的客户端、会记录语法分析、绑定和执行每一步所花费的时间。 该参数属于SUSET类型参数,请参考重设参数中对应设置方法进行设置。 取值范围:布尔型 设置为off ,该选项与log_min_duration_statement的不同之处在于log_min_duration_statement强制记录查询文本。 设置为on并且log_min_duration_statement大于零,记录所有持续时间,但是仅记录超过阈值的语句。这可用于在高负载情况下搜集统计信息。 默认值:on
  • log_error_verbosity 参数说明:控制服务器日志中每条记录的消息写入的详细度。 该参数属于SUSET类型参数,请参考重设参数中对应设置方法进行设置。 取值范围:枚举类型 terse输出不包括DETAIL、HINT、QUERY及CONTEXT错误信息的记录。 verbose输出包括SQLSTATE错误代码 、源代码文件名、函数名及产生错误所在的行号。 default输出包括DETAIL、HINT、QUERY及CONTEXT错误信息的记录,不包括SQLSTATE错误代码 、源代码文件名、函数名及产生错误所在的行号。 默认值:default
  • log_line_prefix 参数说明:控制每条日志信息的前缀格式。日志前缀类似于printf风格的字符串,在日志的每行开头输出。用以%为开头的“转义字符”代替表1中的状态信息。 该参数属于SIGHUP类型参数,请参考重设参数中对应设置方法进行设置。 表1 转义字符表 转义字符 效果 %a 应用程序名称。 %u 用户名。 %d 数据库名。 %r 远端主机名或者IP地址以及远端端口,在不启动log_hostname时显示IP地址及远端端口。 %h 远端主机名或者IP地址,在不启动log_hostname时只显示IP地址。 %p 线程ID。 %t 时间戳(没有毫秒,Windows上没有时区)。 %m 带毫秒的时间戳。 %n 表示指定错误从哪个节点上报的。 %i 命令标签:会话当前执行的命令类型。 %e SQLSTATE错误码。 %c 会话ID,详见说明。 %l 每个会话的日志编号,从1开始。 %s 会话启动时间。 %v 虚拟事务ID(backendID/ localXID)。 %x 事务ID(0表示没有分配事务ID)。 %q 不产生任何输出。如果当前线程是后端线程,忽略这个转义序列,继续处理后面的转义序列;如果当前线程不是后端线程,忽略这个转义序列和它后面的所有转义序列。 %S 会话ID。 %% 字符%。 转义字符%c打印一个唯一的会话ID,由两个4字节的十六进制数组成,通过字符“.”分开。这两个十六进制数分别表示进程的启动时间及进程编号,所以%c也可以看作是保存打印这些名目的途径的空间。比如,从pg_stat_activity中产生会话ID,可以用下面的查询: 1 2 3 SELECT to_hex(EXTRACT(EPOCH FROM backend_start)::integer) || '.' || to_hex(pid) FROM pg_stat_activity; 当log_line_prefix设置为非空值时,请保证最后一个字符是一个空格,以此来直观地与后续的日志行进行区分,也可以使用一个标点符号。 Syslog生成自己的时间戳及进程ID信息,所以当登录日志时,不需要包含这些转义字符。 取值范围:字符串 默认值:'%m %n %u %d %h %p %S %x %a ' %m %n %u %d %h %p %S %x %a 表示会话开始时间戳、错误上报节点、用户名、远程主机名、线程ID、会话ID、事物ID、应用名。
  • log_checkpoints 参数说明:控制在服务器日志中记录检查点和重启点的信息。打开此参数时,服务器日志消息包含涉及检查点和重启点的统计量,其中包含需要写的缓存区的数量及写入所花费的时间等。 该参数属于SIGHUP类型参数,请参考重设参数中对应设置方法进行设置。 取值范围:布尔型 on表示打开此参数时,服务器日志消息包含涉及检查点和重启点的统计量。 off表示关闭此参数时,服务器日志消息包含不涉及检查点和重启点的统计量。 默认值:off
  • debug_print_plan 参数说明:用于设置是否将查询的执行计划打印到日志中。 该参数属于SIGHUP类型参数,请参考重设参数中对应设置方法进行设置。 取值范围:布尔型 on表示开启打印结果的功能。 off表示关闭打印结果的功能。 默认值:off 只有当日志的级别为log及以上时,debug_print_parse、debug_print_rewritten和debug_print_plan的调试信息才会输出。当这些选项打开时,调试信息只会记录在服务器的日志中,而不会输出到客户端的日志中。通过设置client_min_messages和log_min_messages参数可以改变日志级别。 在打开debug_print_plan开关的情况下需尽量避免调用gs_encrypt_aes128及gs_decrypt_aes128函数,避免敏感参数信息在日志中泄露的风险。同时建议用户在打开debug_print_plan开关生成的日志中对gs_encrypt_aes128及gs_decrypt_aes128函数的参数信息进行过滤后再提供给外部维护人员定位,日志使用完成后请及时删除。
  • 示例 1 2 3 4 5 6 7 8 9 10 11 12 --创建资源池pool1。 postgres=# CREATE RESOURCE POOL pool1; --创建负载组group1。 postgres=# CREATE WORKLOAD GROUP group1; -- 更新一个负载组group1的并发数量为10。其关联的资源池为pool1。 postgres=# ALTER WORKLOAD GROUP group1 USING RESOURCE POOL pool1 WITH (ACT_STATEMENTS=10); --删除负载组group1和资源池pool1。 postgres=# DROP WORKLOAD GROUP group1; postgres=# DROP RESOURCE POOL pool1;
  • 注意事项 要删除表中的数据,用户必须对它有DELETE权限。同样也必须有USING子句引用的表以及condition上读取的表的SELECT权限。 对于行存复制表,仅支持两种场景下的delete操作:1)有主键约束的场景;2)执行计划能下推的场景。 Delete ...... Limit row_count 仅支持执行计划下推的部分场景,前置条件是过滤条件需要包含等值分布列,且过滤条件相对简单,避免使用强制类型转换。如果执行失败,请简化过滤条件。 对于列存复制表只支持执行计划能下推的场景。 对于列存表,暂时不支持RETURNING子句。 对于时序表,只支持按时间进行删除的场景,暂不支持RETURNING子句。
  • 语法格式 1 2 3 4 5 [ WITH [ RECURSIVE ] with_query [, ...] ] DELETE FROM [ ONLY ] table_name [ * ] [ [ AS ] alias ] [ USING using_list ] [ WHERE condition | WHERE CURRENT OF cursor_name ] [ LIMIT row_count ] [ RETURNING { * | { output_expr [ [ AS ] output_name ] } [, ...] } ];
  • 参数说明 WITH [ RECURSIVE ] with_query [, ...] 用于声明一个或多个可以在主查询中通过名称引用的子查询,相当于临时表。 如果声明了RECURSIVE,那么允许SELECT子查询通过名称引用它自己。 其中with_query的详细格式为: with_query_name [ ( column_name [, ...] ) ] AS ( {select | values | insert | update | delete} ) – with_query_name指定子查询生成的结果集名称,在查询中可使用该名称访问子查询的结果集。 – column_name指定子查询结果集中显示的列名。 – 每个子查询可以是SELECT,VALUES,INSERT,UPDATE或DELETE语句。 ONLY 如果指定ONLY则只有该表被删除;如果没有声明,则该表和它的所有子表将都被删除。 table_name 目标表的名称(可以有模式修饰)。 取值范围:已存在的表名。 alias 目标表的别名。 取值范围:字符串,符合标识符命名规范。 using_list using子句。 condition 一个返回Boolean值的表达式,用于判断哪些行需要被删除。 WHERE CURRENT OF cursor_name 当前不支持,仅保留语法接口。 output_expr DELETE命令删除行之后计算输出结果的表达式。该表达式可以使用表的任意字段。可以使用*返回被删除行的所有字段。 output_name 一个字段的输出名称。 取值范围:字符串,符合标识符命名规范。
  • 示例:通过本地文件导入导出数据 在使用JAVA语言基于 GaussDB 进行二次开发时,可以使用CopyManager接口,通过流方式,将数据库中的数据导出到本地文件或者将本地文件导入数据库中,文件格式支持CSV、TEXT等格式。 样例程序如下,执行时需要加载GaussDB jdbc驱动。 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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 //以下用例以gsjdbc4.jar为例。 // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 import java.sql.Connection; import java.sql.DriverManager; import java.io.IOException; import java.io.FileInputStream; import java.io.FileOutputStream; import java.sql.SQLException; import org.postgresql.copy.CopyManager; import org.postgresql.core.BaseConnection; public class Copy{ public static void main(String[] args) { String urls = new String("jdbc:postgresql://$ip:$port/postgres"); //数据库URL String username = System.getenv("EXAMPLE_USERNAME_ENV"); //用户名 String password = System.getenv("EXAMPLE_PASSWORD_ENV"); //密码 String tablename = new String("migration_table"); //定义表信息 String tablename1 = new String("migration_table_1"); //定义表信息 String driver = "org.postgresql.Driver"; Connection conn = null; try { Class.forName(driver); conn = DriverManager.getConnection(urls, username, password); } catch (ClassNotFoundException e) { e.printStackTrace(System.out); } catch (SQLException e) { e.printStackTrace(System.out); } // 将SELECT * FROM migration_table查询结果导出到本地文件d:/data.txt try { copyToFile(conn, "d:/data.txt", "(SELECT * FROM migration_table)"); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //将d:/data.txt中的数据导入到migration_table_1中。 try { copyFromFile(conn, "d:/data.txt", tablename1); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // 将migration_table_1中的数据导出到本地文件d:/data1.txt try { copyToFile(conn, "d:/data1.txt", tablename1); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } // 使用copyIn把数据从文件中导入数据库, public static void copyFromFile(Connection connection, String filePath, String tableName) throws SQLException, IOException { FileInputStream fileInputStream = null; try { CopyManager copyManager = new CopyManager((BaseConnection)connection); fileInputStream = new FileInputStream(filePath); copyManager.copyIn("COPY " + tableName + " FROM STDIN", fileInputStream); } finally { if (fileInputStream != null) { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } // 使用copyOut把数据从数据库中导出到文件中 public static void copyToFile(Connection connection, String filePath, String tableOrQuery) throws SQLException, IOException { FileOutputStream fileOutputStream = null; try { CopyManager copyManager = new CopyManager((BaseConnection)connection); fileOutputStream = new FileOutputStream(filePath); copyManager.copyOut("COPY " + tableOrQuery + " TO STDOUT", fileOutputStream); } finally { if (fileOutputStream != null) { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } } 父主题: 基于JDBC开发
  • 更新表中数据 修改已经存储在数据库中数据的行为叫做更新。用户可以更新单独一行,所有行或者指定的部分行。还可以独立更新每个字段,而其他字段则不受影响。 使用UPDATE命令更新现有行,需要提供以下三种信息: 表的名称和要更新的字段名 字段的新值 要更新哪些行 SQL通常不会为数据行提供唯一标识,因此无法直接声明需要更新哪一行。但是可以通过声明一个被更新的行必须满足的条件。只有在表里存在主键的时候,才可以通过主键指定一个独立的行。 建立表和插入数据的步骤请参考创建表和向表中插入数据。 需要将表customer_t1中c_customer_sk为9527的地域重新定义为9876: 1 postgres=# UPDATE customer_t1 SET c_customer_sk = 9876 WHERE c_customer_sk = 9527; 这里的表名称也可以使用模式名修饰,否则会从默认的模式路径找到这个表。SET后面紧跟字段和新的字段值。新的字段值不仅可以是常量,也可以是变量表达式。 比如,把所有c_customer_sk的值增加100: 1 postgres=# UPDATE customer_t1 SET c_customer_sk = c_customer_sk + 100; 在这里省略了WHERE子句,表示表中的所有行都要被更新。如果出现了WHERE子句,那么只有匹配其条件的行才会被更新。 在SET子句中的等号是一个赋值,而在WHERE子句中的等号是比较。WHERE条件不一定是相等测试,许多其他的操作符也可以使用。 用户可以在一个UPDATE命令中更新更多的字段,方法是在SET子句中列出更多赋值,比如: 1 postgres=# UPDATE customer_t1 SET c_customer_id = 'Admin', c_first_name = 'Local' WHERE c_customer_sk = 4421; 批量更新或删除数据后,会在数据文件中产生大量的删除标记,查询过程中标记删除的数据也是需要扫描的。故多次批量更新/删除后,标记删除的数据量过大会严重影响查询的性能。建议在批量更新/删除业务会反复执行的场景下,定期执行VACUUM FULL以保持查询性能。 父主题: 创建和管理表
  • 原型 1 2 3 4 SQLRETURN SQLSetStmtAttr(SQLHSTMT StatementHandle SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER StringLength);
  • 参数 表1 SQLSetStmtAttr参数 关键字 参数说明 StatementHandle 语句句柄。 Attribute 需设置的属性。 ValuePtr 指向对应Attribute的值。依赖于Attribute的值,ValuePtr可能是32位无符号整型值,或指向以空结束的字符串,二进制缓冲区,或者驱动定义值。注意,如果ValuePtr参数是驱动程序指定值。ValuePtr可能是有符号的整数。 StringLength 如果ValuePtr指向字符串或二进制缓冲区,这个参数是*ValuePtr长度,如果ValuePtr指向整型,忽略StringLength。
  • 语法 语法请参见图1。 图1 call_procedure::= using_clause子句的语法参见图2。 图2 using_clause::= 对以上语法格式的解释如下: CALL procedure_name,调用存储过程。 [:placeholder1,:placeholder2,…],存储过程参数占位符列表。占位符个数与参数个数相同。 USING [IN|OUT|IN OUT] bind_argument,用于指定存放传递给存储过程参数值的变量。bind_argument前的修饰符与对应参数的修饰符一致。
  • 示例 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 --创建存储过程proc_add。 postgres=# CREATE OR REPLACE PROCEDURE proc_add ( param1 in INTEGER, param2 out INTEGER, param3 in INTEGER ) AS BEGIN param2:= param1 + param3; END; / postgres=# DECLARE input1 INTEGER:=1; input2 INTEGER:=2; statement VARCHAR2(200); param2 INTEGER; BEGIN --声明调用语句 statement := 'call proc_add(:col_1, :col_2, :col_3)'; --执行语句 EXECUTE IMMEDIATE statement USING IN input1, OUT param2, IN input2; dbe_output.print_line('result is: '||to_char(param2)); END; / --删除存储过程 postgres=# DROP PROCEDURE proc_add;
  • 查看和停止正在运行的查询语句 通过视图PG_STAT_ACTIVITY可以查看正在运行的查询语句。方法如下: 设置参数track_activities为on。 1 SET track_activities = on; 当此参数为on时,数据库系统才会收集当前活动查询的运行信息。 查看正在运行的查询语句。以查看正在运行的查询语句所连接的数据库名、执行查询的用户、查询状态及查询对应的PID为例: 1 SELECT datname, usename, state,pid FROM pg_stat_activity; 1 2 3 4 5 6 7 8 datname | usename | state | pid ----------+---------+--------+----------------- postgres | Ruby | active | 140298793514752 postgres | Ruby | active | 140298718004992 postgres | Ruby | idle | 140298650908416 postgres | Ruby | idle | 140298625742592 postgres | omm | active | 140298575406848 (5 rows) 如果state字段显示为idle,则表明此连接处于空闲,等待用户输入命令。 如果仅需要查看非空闲的查询语句,则使用如下命令查看: 1 SELECT datname, usename, state FROM pg_stat_activity WHERE state != 'idle'; 若需要取消运行时间过长的查询,通过PG_TERMINATE_BACKEND函数,根据线程ID(即2中查询结果的pid字段)结束会话。 1 SELECT PG_TERMINATE_BACKEND(140298793514752); 显示类似如下信息,表示结束会话成功。 1 2 3 4 PG_TERMINATE_BACKEND ---------------------- t (1 row) 显示类似如下信息,表示用户执行了结束当前会话的操作。 1 2 FATAL: terminating connection due to administrator command FATAL: terminating connection due to administrator command 1. gsql客户端使用PG_TERMINATE_BACKEND函数结束当前正在执行会话的后台线程时,如果当前的用户是初始用户,客户端不会退出而是自动重连,即还会返回“The connection to the server was lost. Attempting reset: Succeeded.”;否则客户端会重连失败,即返回“The connection to the server was lost. Attempting reset: Failed.”。这是因为只有初始用户可以免密登录,普遍用户不能免密登录,从而重连失败。 2. 对于使用PG_TERMINATE_BACKEND函数结束非活跃的后台线程时。如果打开了线程池,此时空闲的会话没有线程ID,无法结束会话。非线程池模式下,结束的会话不会自动重连。
  • 查看数据库中包含的表 例如,在PG_TABLES系统表中查看public schema中包含的所有表。 1 SELECT distinct(tablename) FROM pg_tables WHERE SCHEMANAME = 'public'; 结果类似如下这样: 1 2 3 4 5 6 7 8 9 tablename ------------------- err_hr_staffs test err_hr_staffs_ft3 web_returns_p1 mig_seq_table films4 (6 rows)
  • 查看数据库用户 通过PG_USER可以查看数据库中所有用户的列表,还可以查看用户ID(USESYSID)和用户权限。 1 SELECT * FROM pg_user; 1 2 3 4 5 6 usename | usesysid | usecreatedb | usesuper | usecatupd | userepl | passwd | valbegin | valuntil | respool | parent | spacelimit | useconfig | nodegroup | tempspacelimit | spillspacelimit ---------+----------+-------------+----------+-----------+---------+----------+----------+----------+--------------+------ -------+------------+-----------+-----------+----------------+----------------- roach | 10 | t | t | t | t | ******** | | | default_pool | 0 | | | | | (1 row)
  • 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 --创建dev_audit和bob_audit用户。 postgres=# CREATE USER dev_audit PASSWORD 'dev@1234'; postgres=# CREATE USER bob_audit password 'bob@1234'; --创建一个表tb_for_audit postgres=# CREATE TABLE tb_for_audit(col1 text, col2 text, col3 text); --创建资源标签 postgres=# CREATE RESOURCE LABEL adt_lb0 add TABLE(tb_for_audit); --对数据库执行create操作创建审计策略 postgres=# CREATE AUDIT POLICY adt1 PRIVILEGES CREATE; --对数据库执行select操作创建审计策略 postgres=# CREATE AUDIT POLICY adt2 AC CES S SELECT; --仅审计记录用户dev_audit和bob_audit在执行针对adt_lb0资源进行的create操作数据库创建审计策略 postgres=# CREATE AUDIT POLICY adt3 PRIVILEGES CREATE ON LABEL(adt_lb0) FILTER ON ROLES(dev_audit, bob_audit); --仅审计记录用户dev_audit和bob_audit,客户端工具为psql和gsql,IP地址为'10.20.30.40', '127.0.0.0/24',在执行针对adt_lb0资源进行的select、insert、delete操作数据库创建审计策略。 postgres=# CREATE AUDIT POLICY adt4 ACCESS SELECT ON LABEL(adt_lb0), INSERT ON LABEL(adt_lb0), DELETE FILTER ON ROLES(dev_audit, bob_audit), APP(psql, gsql), IP('10.20.30.40', '127.0.0.0/24');
共100000条