华为云用户手册

  • pg_delete_audit() 描述:删除指定时间段的审计日志。 返回值类型:void 基于数据库安全考虑,不提供删除指定时间段的审计日志的函数接口,调用该函数将直接报“ERROR: For security purposes, it is not allowed to manually delete audit logs”。 12 SELECT * FROM pg_delete_audit('2023-01-10 17:00:00','2023-01-10 19:00:00');ERROR: For security purposes, it is not allowed to manually delete audit logs
  • login_audit_messages_pid(flag boolean) 描述:查看登录用户的登录信息。与login_audit_messages的区别在于结果基于当前backendid向前查找。所以不会因为同一用户的后续登录,而影响本次登录的查询结果。也就是查询不到该用户后续登录的信息。 返回值类型:元组 示例: 查看上一次登录认证通过的日期、时间和IP等信息: 12345 SELECT * FROM login_audit_messages_pid(true); username | database | logintime | type | result | client_conninfo | backendid------------+----------+------------------------+---------------+--------+-------------------- dbadmin | postgres | 2017-06-02 15:28:34+08 | login_success | ok | gsql@[local] | 140311900702464(1 row) 查看上一次登录认证失败的日期、时间和IP等信息: 1234 SELECT * FROM login_audit_messages_pid(false) ORDER BY logintime desc limit 1; username | database | logintime | type | result | client_conninfo | backendid------------+----------+------------------------+--------------+--------+-------------------------(0 rows) 查看自从最后一次认证通过以来失败的尝试次数、日期和时间: 1234 SELECT * FROM login_audit_messages_pid(false); username | database | logintime | type | result | client_conninfo | backendid------------+----------+------------------------+--------------+--------+-------------------------(0 rows)
  • pg_query_audit() 描述:查看当前CN节点审计日志。 返回值类型:record 函数返回字段如下表1: 表1 pg_query_audit函数返回字段 名称 类型 描述 begintime timestamp with time zone 操作的执行开始时间。 endtime timestamp with time zone 操作的执行结束时间。 operation_type text 操作类型,具体类型见表2。 audit_type text 审计类型,具体类型见表3。 result text 操作结果。 username text 执行操作的用户名。 database text 数据库名称。 client_conninfo text 客户端连接信息,即gsql,jdbc或odbc。 object_name text 操作对象名称。 command_text text 操作的执行命令。 detail_info text 执行操作详细信息。 transaction_xid text 事务ID。 query_id text 查询ID。 node_name text 节点名称。 thread_id text 线程ID。 local_port text 本地端口。 remote_port text 远端端口。 表2 operation_type操作类型项 操作类型 描述 audit_switch 表示对用户打开和关闭审计日志操作场景进行审计。 login_logout 表示对用户登录和登出操作场景进行审计。 system 表示对系统的启停、实例切换操作场景进行审计。 sql_parse 表示对SQL语句解析场景进行审计。 user_lock 表示对用户锁定和解锁操作的场景进行审计。 grant_revoke 表示对用户权限授予和回收操作场景进行审计。 violation 表示对用户访问存在越权的场景进行审计。 ddl 表示对DDL操作场景进行审计,因为DDL操作会根据操作对象进行更细粒度控制,仍然沿用审计开关audit_system_object,即由audit_system_object控制对哪些对象的DDL操作进行审计(此处不配置ddl,只要配置了audit_system_object,审计也会生效)。 dml 表示对DML操作场景进行审计。 select 表示对SELECT操作场景进行审计。 internal_event 表示对内部事件操作场景进行审计。 user_func 表示对用户自定义函数、存储过程、匿名块操作场景进行审计。 special_func 表示对特殊函数调用操作场景进行审计,特殊函数包括:pg_terminate_backend和pg_cancel_backend。 copy 表示对COPY操作场景进行审计。 set 表示对SET操作场景进行审计。 transaction 表示对事务操作场景进行审计。 vacuum 表示对VACUUM操作场景进行审计。 analyze 表示对ANALYZE操作场景进行审计。 cursor 表示对游标操作的场景进行审计。 anonymous_block 表示对匿名块操作场景进行审计。 explain 表示对EXPLAIN操作场景进行审计。 show 表示对SHOW操作场景进行审计。 lock_table 表示对锁表操作场景进行审计。 comment 表示对COMMENT操作场景进行审计。 preparestmt 表示对PREPARE、EXECUTE、DEALLOCATE操作场景进行审计。 cluster 表示对CLUSTER操作场景进行审计。 constraints 表示对CONSTRAINTS操作场景进行审计。 checkpoint 表示对CHECKPOINT操作场景进行审计。 barrier 表示对BARRIER操作场景进行审计。 cleanconn 表示对CLEAN CONNECTION操作场景进行审计。 seclabel 表示对安全标签操作进行审计。 notify 表示对通知操作进行审计。 load 表示对加载操作进行审计。 表3 audit_type审计类型项 审计类型 描述 audit_open/audit_close 表示审计类型为打开和关闭审计日志操作。 user_login/user_logout 表示审计类型为用户登录/退出成功的操作和用户。 system_start/system_stop/system_recover/system_switch 表示审计类型为系统的启停、实例切换操作。 sql_wait/sql_parse 表示审计类型为SQL语句解析。 lock_user/unlock_user 表示审计类型为用户锁定和解锁成功的操作。 grant_role/revoke__role 表示审计类型为用户权限授予和回收的操作。 user_violation 表示审计类型为用户访问存在越权的操作。 ddl_数据库对象 表示审计类型为DDL操作,因为DDL操作由会根据操作对象进行更细粒度控制,仍然沿用审计开关audit_system_object,即由audit_system_object控制对哪些对象的DDL操作进行审计(此处不配置ddl,只要配置了audit_system_object,审计也会生效)。 例如:ddl_sequence表示审计类型为序列相关操作。 dml_action_insert/dml_action_delete/dml_action_update/dml_action_merge/dml_action_select 表示审计类型为INSERT、DELETE、UPDATE、MERGE等DML操作。 internal_event 表示审计类型为内部事件。 user_func 表示审计类型为用户自定义函数、存储过程、匿名块操作。 special_func 表示审计类型为特殊函数调用操作,特殊函数包括:pg_terminate_backend和pg_cancel_backend。 copy_to/copy_from 表示审计类型为COPY相关操作。 set_parameter 表示审计类型为SET操作。 trans_begin/trans_commit/trans_prepare/trans_rollback_to/trans_release/trans_savepoint/trans_commit_prepare/trans_rollback_prepare/trans_rollback 表示审计类型为事务相关操作。 vacuum/vacuum_full/vacuum_merge 表示审计类型为VACUUM相关操作。 analyze/analyze_verify 表示审计类型为ANALYZE相关操作。 cursor_declare/cursor_move/cursor_fetch/cursor_close 表示审计类型为游标相关操作。 codeblock_execute 表示审计类型为匿名块。 explain 表示审计类型为EXPLAIN操作。 show 表示审计类型为SHOW操作。 lock_table 表示审计类型为锁表操作。 comment 表示审计类型为COMMENT操作。 prepare/execute/deallocate 表示审计类型为PREPARE、EXECUTE或DEALLOCATE操作。 cluster 表示审计类型为CLUSTER操作。 constraints 表示审计类型为CONSTRAINTS操作。 checkpoint 表示审计类型为CHECKPOINT操作。 barrier 表示审计类型为BARRIER操作。 cleanconn 表示审计类型为CLEAN CONNECTION操作。 seclabel 表示审计类型为安全标签操作。 notify 表示审计类型为通知操作。 load 表示审计类型为加载操作。
  • login_audit_messages(flag boolean) 描述:查看登录用户的登录信息。 返回值类型:元组 示例: 查看上一次登录认证通过的日期、时间和IP等信息: 12345 SELECT * FROM login_audit_messages(true); username | database | logintime | type | result | client_conninfo ------------+----------+------------------------+---------------+--------+-------------------- dbadmin | gaussdb | 2017-06-02 15:28:34+08 | login_success | ok | gsql@[local](1 row) 查看上一次登录认证失败的日期、时间和IP等信息: 1234 SELECT * FROM login_audit_messages(false) ORDER BY logintime desc limit 1; username | database | logintime | type | result | client_conninfo ------------+----------+------------------------+--------------+--------+-------------------------(0 rows) 查看自从最后一次认证通过以来失败的尝试次数、日期和时间: 1234 SELECT * FROM login_audit_messages(false); username | database | logintime | type | result | client_conninfo ------------+----------+------------------------+--------------+--------+-------------------------(0 rows)
  • gs_password_deadline() 描述:显示当前账户距离密码过期的时间。密码过期后提示用户修改密码。与GUC参数password_effect_time相关。 返回值类型:interval 示例: 12345 SELECT gs_password_deadline(); gs_password_deadline ------------------------- 83 days 17:44:32.196094(1 row)
  • gs_password_expiration() 描述:显示当前账户距离密码过期的时间。密码过期后用户无法登录数据库。与创建用户的DDL语句PASSWORD EXPIRATION period相关,函数返回值大于等于-1,如果创建用户时未指定PASSWORD EXPIRATION period,该函数的缺省值为-1,表示没有过期限制。 返回值类型:interval 示例: 12345 SELECT gs_password_expiration(); gs_password_expiration ------------------------- 29 days 23:59:49.731482(1 row)
  • 全文检索概述 全文检索(或者说文本搜索)提供了查询可读性文档的能力,并且通过查询相关度将结果进行排序。搜索最常见的方式是:找到包含指定查询词的所有记录,并且按照查询顺序返回这些记录。 文本搜索操作符在数据库中已存在多年。 GaussDB (DWS)为文本数据类型提供~、~*、LIKE和ILIKE操作符,但这些操作符缺乏现代信息系统所要求的许多必要属性,不过这一问题可以通过使用索引及词典进行解决。 实时数仓(单机部署)暂不支持全文检索功能。 文本检索缺乏信息系统所要求的必要属性: 没有语义支持,即使是英语也是如此。 要识别派生词并不是那么容易,即使正则表达式也不能满足要求。例如satisfies和satisfy,当使用正则表达式寻找satisfy时,并不会查询到包含satisfies的文档。用户可以使用OR搜索多种派生形式,但过程非常繁琐。并且有些词会有上千的派生词,容易出错。 没有对搜索结果的分类(排序)。当搜索出成千的文档时,查找效率很低。 由于没有索引的支持,每一次的搜索需要遍历所有的文档,整体搜索比较缓慢。 使用全文索引可以对文档进行预处理,并且可以使后续的搜索更快速。预处理过程包括: 将文档解析成token。 为每个文档标记不同类别的token是非常有必要的,例如:数字、文字、复合词、电子邮件地址,这样就可以针对不同类别做不同的处理。原则上token的类别依赖于具体的应用,但对于大多数的应用来说,可以使用一组预定义的token类。 将token转换为词素。 词素像token一样是一个字符串,但它已经标准化处理,这样同一个词的不同形式是一样的。例如,标准化通常包括:将大写字母折成小写字母、删除后缀(如英语中的s或者es)。这将允许通过搜索找到同一个词的不同形式,不需要繁琐地输入所有可能的变形样式。同时,这一步通常会删除停用词。这些停用词通常因为太常见而对搜索无用。(总之,token是文档文本的原片段,而词素被认为是有用的索引和搜索词。)GaussDB(DWS)使用词典执行这一步,且提供了各种标准的词典。 保存搜索优化后的预处理文档。 比如,每个文档可以呈现为标准化词素的有序组合。伴随词素,通常还需要存储词素位置信息以用于邻近排序。因此文档包含的查询词越密集其排序越高。 词典能够对token如何标准化做到细粒度控制。使用合适的词典,可以定义不被索引的停用词。 数据类型tsvector用于存储预处理文档,tsquery用于存储查询条件,详细内容可参见文本搜索类型。为数据类型tsvector提供的函数和操作符可参见文本检索函数和操作符,其中最重要的是匹配运算符@@,请参见基本文本匹配。 父主题: 介绍
  • 函数类型解析 从系统表PG_PROC中选择所有可能被选到的函数。如果使用了一个不带模式修饰的函数名字,那么认为该函数是那些在当前搜索路径中的函数。如果给出一个带修饰的函数名,那么只考虑指定模式中的函数。 如果搜索路径中找到了多个不同参数类型的函数。将从中选择一个合适的函数。 查找和输入参数类型完全匹配的函数。如果找到一个,则用之。如果输入的实参类型都是unknown类型,则不会找到匹配的函数。 如果未找到完全匹配,请查看该函数是否为一个特殊的类型转换函数。 寻找最优匹配。 抛弃那些输入类型不匹配并且也不能隐式转换成匹配的候选函数。unknown文本在这种情况下可以转换成任何东西。如果只剩下一个候选项,则用之,否则继续下一步。 遍历所有候选函数,保留那些输入类型匹配最准确的。此时,域被看作和它们的基本类型相同。如果没有一个函数能准确匹配,则保留所有候选。如果只剩下一个候选项,则用之,否则继续下一步。 遍历所有候选函数,保留那些需要类型转换时接受首选类型位置最多的函数。如果没有接受首选类型的函数,则保留所有候选。如果只剩下一个候选项,则用之,否则继续下一步。 如果有任何输入参数是unknown类型,检查剩余的候选函数对应参数位置的类型范畴。在每一个能够接受字符串类型范畴的位置使用string类型(这种对字符串的偏爱是合适的,因为unknown文本确实像字符串)。另外,如果所有剩下的候选函数都接受相同的类型范畴,则选择该类型范畴,否则抛出一个错误(因为在没有更多线索的条件下无法作出正确的选择)。现在抛弃不接受选定的类型范畴的候选函数,然后,如果任意候选函数在那个范畴接受一个首选类型,则抛弃那些在该参数位置接受非首选类型的候选函数。如果没有一个候选符合这些测试则保留所有候选。如果只有一个候选函数符合,则使用它;否则,继续下一步。 如果同时有unknown和已知类型的参数,并且所有已知类型的参数有相同的类型,假设unknown参数也是这种类型,检查哪个候选函数可以在unknown参数位置接受这种类型。如果正好一个候选符合,那么使用它。否则,产生一个错误。
  • 示例 示例1:圆整函数参数类型解析。只有一个round函数有两个参数(第一个是numeric,第二个是integer)。所以下面的查询自动把第一个类型为integer的参数转换成numeric类型。 1 SELECT round(4, 4); 图1 round返回信息 实际上它被分析器转换成: 1 SELECT round(CAST (4 AS numeric), 4); 因为带小数点的数值常量初始时被赋予numeric类型,因此下面的查询将不需要类型转换,并且可能会略微高效一些: 1 SELECT round(4.0, 4); 示例2:子字符串函数类型解析。有好几个substr函数,其中一个接受text和integer类型。如果用一个未声明类型的字符串常量调用它,系统将选择接受string类型范畴的首选类型(也就是text类型)的候选函数。 1 SELECT substr('1234', 3); 图2 substr返回信息 如果该字符串声明为varchar类型,就像从表中取出来的数据一样,分析器将试着将其转换成text类型: 1 SELECT substr(varchar '1234', 3); 图3 substr返回信息 被分析器转换后实际上变成: 1 SELECT substr(CAST (varchar '1234' AS text), 3); 分析器从PG_CAST表中获取到text和varchar是二进制兼容的,即可传递给接受类型的函数而不需要做任何物理转换。因此,在这种情况下,实际上没有做任何类型转换。 而且,如果以integer为参数调用函数,分析器将试图将其转换成text类型: 1 SELECT substr(1234, 3); 图4 substr返回信息 被分析器转换后实际上变成: SELECT substr(CAST (1234 AS text), 3); 图5 substr返回信息
  • 基本文本匹配 GaussDB(DWS)的全文检索基于匹配算子@@,当一个tsvector(document)匹配到一个tsquery(query)时,则返回true。其中,tsvector(document)和tsquery(query)两种数据类型可以任意排序。 12345 SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector @@ 'cat & rat'::tsquery AS RESULT; result---------- t(1 row) 12345 SELECT 'fat & cow'::tsquery @@ 'a fat cat sat on a mat and ate a fat rat'::tsvector AS RESULT; result---------- f(1 row) 正如上面例子表明,tsquery不仅是文本,且比tsvector包含的要多。tsquery包含已经标注化为词条的搜索词,同时可能是使用AND、OR、或NOT操作符连接的多个术语。详细请参见文本搜索类型。函数to_tsquery和plainto_tsquery对于将用户书写文本转换成适合的tsquery是非常有用的,比如将文本中的词标准化。类似地,to_tsvector用于解析和标准化文档字符串。因此,实际中文本搜索匹配看起来更像这样: 12345 SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat') AS RESULT;result---------- t(1 row) 需要注意的是,下面这种方式是不可行的: 12345 SELECT 'fat cats ate fat rats'::tsvector @@ to_tsquery('fat & rat')AS RESULT;result---------- f(1 row) 由于tsvector没有对rats进行标准化,所以rats不匹配rat。 @@操作符也支持text输入,允许一个文本字符串的显示转换为tsvector或者在简单情况下忽略tsquery。可用形式是: 1234 tsvector @@ tsquerytsquery @@ tsvectortext @@ tsquerytext @@ text 形式text @@ tsquery等价于to_tsvector(text) @@ tsquery,而text @@ text等价于to_tsvector(text) @@ plainto_tsquery(text)。 父主题: 介绍
  • 处理tsquery GaussDB(DWS)提供了函数和操作符用来操作tsquery类型的查询。 tsquery && tsquery 返回两个给定查询tsquery的与结果。 tsquery || tsquery 返回两个给定查询tsquery的或结果。 !! tsquery 返回给定查询tsquery的非结果。 numnode(query tsquery) returns integer 返回tsquery中的节点数目(词素加操作符),这个函数在检查查询是否有效(返回值大于0),或者只包含停用词(返回值等于0)时,是有用的。例如: 1 2 3 4 5 6 7 8 910111213 SELECT numnode(plainto_tsquery('the any'));NOTICE: text-search query contains only stop words or doesn't contain lexemes, ignoredCONTEXT: referenced column: numnode numnode --------- 0(1 row)SELECT numnode('foo & bar'::tsquery); numnode--------- 3(1 row) querytree(query tsquery) returns text 返回可用于索引搜索的tsquery部分,该函数对于检测非索引查询是有用的(例如只包含停用词或否定项)。例如: 12345 SELECT querytree(to_tsquery('!defined')); querytree ----------- T(1 row) 父主题: 附加功能
  • 注意事项 只有数据库所有者有权限执行DROP DATABASE命令,系统管理员默认拥有此权限。 不能对系统默认安装的三个数据库(gaussdb、TEMPLATE0和TEMPLATE1)执行删除操作,系统做了保护。如果想查看当前服务中有哪几个数据库,可以用gsql的\l命令查看。 如果有用户正在与要删除的数据库连接,则删除操作失败。如果要查看当前存在哪些数据库连接,可以通过视图v$session查看。 不能在事务块中执行DROP DATABASE命令。 如果执行DROP DATABASE失败,事务回滚,需要再次执行一次DROP DATABASE IF EXISTS。 DROP DATABASE若提示database is being accessed by other users类错误,可能原因为CLEAN CONNECTION过程存在线程无法及时响应信号,出现连接清理不完全的情况,需要再次执行CLEAN CONNECTION。 DROP对象操作(如DATABASE、USER/ROLE、SCHEMA、TABLE、VIEW等对象)存在数据丢失风险,尤其含带CASCADE级联删除场景,会将关联的对象一并删除,操作需谨慎,操作前需考虑数据备份。 更多开发设计规范参见总体开发设计规范。
  • 示例 创建外表OBS_ft,用来以txt格式导入OBS上指定的对象数据到row_tbl表中: 认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 123456789 DROP FOREIGN TABLE IF EXISTS OBS_ft;CREATE FOREIGN TABLE OBS_ft( a int, b int)SERVER gsmpp_server OPTIONS (location 'obs://gaussdbcheck/obs_ddl/test_case_data/txt_obs_informatonal_test001',format 'text',encoding 'utf8',chunksize '32', encrypt 'on',AC CES S_KEY 'access_key_value_to_be_replaced',SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced',delimiter E'\x08') read only;DROP TABLE row_tbl;CREATE TABLE row_tbl( a int, b int);INSERT INTO row_tbl SELECT * FROM OBS_ft;
  • 参数概览 创建外表语法提供了多个参数,常用参数分类如下。 必需参数 table_name column_name type_name SERVER gsmpp_server access_key secret_access_key OPTIONS参数 外表的数据源位置参数location 数据格式参数 format header(仅支持 CS V格式) delimiter quote(仅支持CSV格式) escape (仅支持CSV格式) null noescaping(仅支持TEXT格式) encoding eol bom(仅支持CSV格式) 容错性参数 fill_missing_fields ignore_extra_data compatible_illegal_chars PER NODE REJECT LIMIT 'val... LOG INTO error_table_name WITH error_table_name
  • 语法格式 12345678 CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name ( { column_name type_name [column_constraint ] | LIKE source_table | table_constraint [, ...]} [, ...] ) SERVER gsmpp_server OPTIONS ( { option_name ' value ' } [, ...] ) [ { WRITE ONLY | READ ONLY }] [ WITH error_table_name | LOG INTO error_table_name] [PER NODE REJECT LIMIT 'value'];
  • 注意事项 这种方式仅支持TEXT和CSV格式,并且需要额外指定OBS连接信息。对于OBS上的ORC、Carbondata等格式数据,不适用这种方式,请参考CREATE FOREIGN TABLE (SQL on OBS or Hadoop)。 创建的外表分为只读外表(READ ONLY)和只写外表(WRITE ONLY),缺省为只读外表。数据导入集群时,请将外表设为READ ONLY;导出时,请设为WRITE ONLY。 外表由命令执行者所有; OBS外表不需要显式指定分布方式,默认支持ROUNDROBIN分布方式; 所创建外表只对信息约束(Informational Constraint)约束生效。 OBS导入导出数据时,不支持中文路径。
  • 语法格式 1234 CREATE SEQUENCE name [ INCREMENT [ BY ] increment ] [ MINVALUE minvalue | NO MINVALUE | NOMINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE | NOMAXVALUE] [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE | NOCYCLE ] [ OWNED BY { table_name.column_name | NONE } ];
  • 示例 创建一个名为serial的递增序列,从101开始: 123 CREATE SEQUENCE serial START 101 CACHE 20; 从序列中选出下一个数字: 1 SELECT nextval('serial'); 图1 结果1 从序列中选出下一个数字: 1 SELECT nextval('serial'); 图2 结果2 创建与表关联的序列: 1 2 3 4 5 6 7 8 9101112131415161718192021 CREATE TABLE customer_address( ca_address_sk integer not null, ca_address_id char(16) not null, ca_street_number char(10) , ca_street_name varchar(60) , ca_street_type char(15) , ca_suite_number char(10) , ca_city varchar(60) , ca_county varchar(30) , ca_state char(2) , ca_zip char(10) , ca_country varchar(20) , ca_gmt_offset decimal(5,2) , ca_location_type char(20) ) ;CREATE SEQUENCE serial1 START 101 CACHE 20OWNED BY customer_address.ca_address_sk; 使用serial创建主键自增序列表serial_table: 123 CREATE TABLE serial_table(a int, b serial);INSERT INTO serial_table (a) VALUES (1),(2),(3);SELECT * FROM serial_table ORDER BY b;
  • 参数说明 name 将要创建的序列名称。 取值范围:仅可以使用小写字母(a~z)、 大写字母(A~Z),数字和特殊字符"#","_","$"的组合。 increment 指定序列的步长。一个正数将生成一个递增的序列,一个负数将生成一个递减的序列。 缺省值:1。 MINVALUE minvalue | NO MINVALUE| NOMINVALUE 执行序列的最小值。如果没有声明minvalue或者声明了NO MINVALUE,则递增序列的缺省值为1,递减序列的缺省值为-263-1。 NOMINVALUE等价于NO MINVALUE MAXVALUE maxvalue | NO MAXVALUE| NOMAXVALUE 执行序列的最大值。如果没有声明maxvalue或者声明了NO MAXVALUE,则递增序列的缺省值为263-1,递减序列的缺省值为-1。 NOMAXVALUE等价于NO MAXVALUE start 指定序列的起始值。 缺省值:对于递增序列为minvalue,递减序列为maxvalue。 cache 为了快速访问,而在内存中预先存储序列号的个数。一个缓存周期内,CN不再向GTM索取序列号,而是使用本地预先申请的序列号。 缺省值为1,表示一次只能生成一个值,也就是没有缓存。 不建议同时定义cache和maxvalue或minvalue。因为定义cache后不能保证序列的连续性,可能会产生空洞,造成序列号段浪费。 建议cache值不要设置过大,否则会出现缓存序列号时(每个cache周期的第一个nextval)耗时过长的情况;同时建议cache值小于100000000。实际使用时应根据业务设置合理的cache值,既能保证快速访问,又不会浪费序列号。 CYCLE 用于使序列达到maxvalue或者minvalue后可循环并继续下去。 如果声明了NO CYCLE,则在序列达到其最大值后任何对nextval的调用都会返回一个错误。 NOCYCLE的作用等价于NO CYCLE。 缺省值为NO CYCLE。 若定义序列为CYCLE,则不能保证序列的唯一性。 OWNED BY- 将序列和一个表的指定字段进行关联。这样,在删除那个字段或其所在表的时候会自动删除已关联的序列。关联的表和序列的所有者必须是同一个用户,并且在同一个模式中。需要注意的是,通过指定OWNED BY,仅是建立了表的对应列和Sequence之间关联关系,并不会在插入数据时在该列上产生自增序列。 缺省值为OWNED BY NONE,表示不存在这样的关联。 通过OWNED BY创建的Sequence不建议用于其他表,如果希望多个表共享Sequence,该Sequence不应该从属于特定表。
  • 注意事项 SEQUENCE是一个存放等差数列的特殊表,该表受DBMS控制。这个表没有实际意义,通常用于为行或者表生成唯一的标识符。 如果给出一个模式名,则该序列就在给定的模式中创建,否则会在当前模式中创建。序列名必须和同一个模式中的其他序列、表、索引、视图或外表的名字不同。 创建序列后,在表中使用序列的nextval()函数和generate_series(1,N)函数对表插入数据,请保证nextval的可调用次数大于等于N+1次,否则会因为generate_series()函数会调用N+1次而导致报错。 不支持在template1数据库中创建SEQUENCE。
  • 参数说明 pool_name 资源池名称。 资源池名称不能和当前数据库里已有的资源池重名。 取值范围:字符串,要符合标识符的命名规范。 group_name 控制组名称。 设置控制组名称时,语法可以使用双引号,也可以使用单引号。 group_name对大小写敏感。 不指定group_name时,默认指定的字符串为“Medium”,代表指定DefaultClass控制组的 “Medium”Timeshare控制组。 若数据库管理员指定自定义Class组下的Workload控制组,如control_group的字符串为:“class1:workload1”;代表此资源池指定到class1控制组下的workload1控制组。也可同时指定Workload控制组的层次,如control_group的字符串为:“class1:workload1:1”。 若数据库用户指定Timeshare控制组代表的字符串,即“Rush”、“High”、“Medium”或“Low”其中一种,如control_group的字符串为“High”;代表资源池指定到DefaultClass控制组下的“High”Timeshare控制组。 多租户场景下,组资源池关联的控制组为Class级别,业务资源池关联Workload控制组。且不允许在各种资源池间相互切换。 取值范围:字符串,要符合说明中的规则,其指定已创建的控制组。 stmt 资源池语句执行的最大并发数量。 取值范围:数值型,-1~INT_MAX。 dop 资源池简单语句执行的最大并发数量。 取值范围:数值型,1~INT_MAX。 memory_size 资源池最大使用内存。 取值范围:字符串,内容范围1KB~2047GB。 mem_percent 资源池可用内存占全部内存或者组用户内存使用的比例。 在多租户场景下,组用户和业务用户的mem_percent范围1-100,默认为20。 在普通场景下,普通用户的mem_percent范围为0-100,默认值为0。 mem_percent和memory_limit同时指定时,只有mem_percent起作用。 io_limits 该参数8.1.2版本中已废弃,为兼容历史版本保留该参数。 io_priority 该参数8.1.2版本中已废弃,为兼容历史版本保留该参数。 nodegroup 在逻辑集群模式下,指定资源池所属的逻辑集群名称。必须是存在的逻辑集群。 如果逻辑集群名称包含大写字符、特殊符号或以数字开头,SQL语句中对逻辑集群名称需要加双引号。 is_foreign 在逻辑集群模式下,指定当前资源池用于控制没有关联本逻辑集群的普通用户的资源。这里的逻辑集群是由资源池nodegroup字段指定的。 nodegroup必须是存在的逻辑集群,不能是elastic_group和安装的nodegroup (group_version1)。 如果指定了is_foreign为true,则资源池不能再关联用户,即不允许通过CREATE USER ... RESOURCE POOL语句来将该资源池配置给用户。该资源池自动检查用户是否关联到资源池指定的逻辑集群,如果用户没有关联到该逻辑集群,则这些用户在逻辑集群所包含的DN上运行将受到该资源池的资源控制。
  • 示例 本示例假定用户已预先成功创建控制组。 创建一个默认资源池,其控制组为“DefaultClass”组下属的“Medium”Timeshare Workload控制组: 1 CREATE RESOURCE POOL pool1; 创建一个资源池,其控制组指定为“DefaultClass”组下属的"High" Timeshare Workload控制组: 1 CREATE RESOURCE POOL pool2 WITH (CONTROL_GROUP="High");
  • 语法格式 12 CREATE RESOURCE POOL pool_name [WITH ({MEM_PERCENT=pct | CONTROL_GROUP="group_name" | ACTIVE_STATEMENTS=stmt | MAX_DOP = dop | MEMORY_LIMIT='memory_size' | io_limits=io_limits | io_priority='io_priority' | nodegroup="nodegroupname" | is_foreign=boolean }[, ... ])];
  • 示例5 通过外表读取 DLI 多版本外表。DLI多版本外表示例仅8.1.1及以上版本支持。 创建dli_server,对应的foreign data wrapper为DFS_FDW。 123456789 CREATE SERVER dli_server FOREIGN DATA WRAPPER DFS_FDW OPTIONS ( ADDRESS 'obs.example.com', ACCESS_KEY 'xxxxxxxxx', SECRET_ACCESS_KEY 'yyyyyyyyyyyyy', TYPE 'DLI', DLI_ADDRESS 'dli.example.com', DLI_ACCESS_KEY 'xxxxxxxxx', DLI_SECRET_ACCESS_KEY 'yyyyyyyyyyyyy'); ADDRESS是OBS的终端节点(Endpoint)。DLI_ADDRESS是DLI的终端节点(Endpoint),请根据实际替换。 ACCESS_KEY和SECRET_ACCESS_KEY是云账号体系访问OBS服务的密钥。请根据实际替换。 DLI_ACCESS_KEY和DLI_SECRET_ACCESS_KEY是云账号体系访问DLI服务的密钥。请根据实际替换。 认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 TYPE表示创建的Server为DLI Server。请保持DLI取值不变。 创建访问DLI多版本的OBS外表customer_address,不包含分区列,表关联的DLI服务器为dli_server。其中project_id为xxxxxxxxxxxxxxx,dli上的database_name为database123,需要访问的table_name为table456,根据实际替换。 认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 1 2 3 4 5 6 7 8 9101112131415161718192021222324 CREATE FOREIGN TABLE customer_address( ca_address_sk integer not null, ca_address_id char(16) not null, ca_street_number char(10) , ca_street_name varchar(60) , ca_street_type char(15) , ca_suite_number char(10) , ca_city varchar(60) , ca_county varchar(30) , ca_state char(2) , ca_zip char(10) , ca_country varchar(20) , ca_gmt_offset decimal(36,33) , ca_location_type char(20) ) SERVER dli_server OPTIONS ( FORMAT 'ORC', ENCODING 'utf8', DLI_PROJECT_ID 'xxxxxxxxxxxxxxx', DLI_DATABASE_NAME 'database123', DLI_TABLE_NAME 'table456')DISTRIBUTE BY roundrobin; 通过外表查询DLI多版本表的数据。 1 SELECT COUNT(*) FROM customer_address; 图5 查询结果
  • 示例1 在HDFS通过HIVE导入TPC-H benchmark测试数据表part表及region表。part表的文件路径为/user/hive/warehouse/partition.db/part_4,region表的文件路径为/user/hive/warehouse/gauss.db/region_orc11_64stripe/。 创建HDFS_Server,对应的foreign data wrapper为HDFS_FDW或者DFS_FDW。 1 CREATE SERVER hdfs_server FOREIGN DATA WRAPPER HDFS_FDW OPTIONS (address '10.10.0.100:25000,10.10.0.101:25000',hdfscfgpath '/opt/hadoop_client/HDFS/hadoop/etc/hadoop',type'HDFS'); 在可选项options里面写入了HDFS集群对应的NameNode的IP地址及端口号。具体端口号请在 MRS -HDFS服务配置中搜索参数“dfs.namenode.rpc.port”查看。本示例假设端口号为25000。 ‘10.10.0.100:25000,10.10.0.101:25000’中列出了两组NameNode的地址及端口号,分别表示HDFS的主NameNode及备NameNode,这里推荐使用该种主备方式填写。两组参量中间使用“,”进行分割。 创建HDFS外表。表关联的HDFS server为hdfs_server,表ft_region对应的HDFS服务器上的文件格式为‘orc’,在HDFS文件系统上对应的文件目录为'/user/hive/warehouse/gauss.db/region_orc11_64stripe/'。 创建不包含分区列的HDFS外表: 1 2 3 4 5 6 7 8 91011121314151617 DROP FOREIGN TABLE IF EXISTS ft_region;CREATE FOREIGN TABLE ft_region( R_REGIONKEY INT4, R_NAME TEXT, R_COMMENT TEXT)SERVER hdfs_serverOPTIONS( FORMAT 'orc', encoding 'utf8', FOLDERNAME '/user/hive/warehouse/gauss.db/region_orc11_64stripe/')DISTRIBUTE BY roundrobin; 创建包含分区列的HDFS外表: 1 2 3 4 5 6 7 8 9101112131415161718192021222324 CREATE FOREIGN TABLE ft_part ( p_partkey int, p_name text, p_mfgr text, p_brand text, p_type text, p_size int, p_container text, p_retailprice float8, p_comment text)SERVER hdfs_serverOPTIONS( FORMAT 'orc', encoding 'utf8', FOLDERNAME '/user/hive/warehouse/partition.db/part_4')DISTRIBUTE BY roundrobinPARTITION BY (p_mfgr) AUTOMAPPED; GaussDB(DWS)支持2种文件指定方式:通过关键字filenames指定和通过foldername指定。推荐通过使用foldername进行指定。关键字distribute指定了表ft_region的存储分布方式。 查看创建的外表: 12 SELECT * FROM pg_foreign_table WHERE ftrelid='ft_region'::regclass;SELECT * FROM pg_foreign_table WHERE ftrelid='ft_part'::regclass;
  • 示例4 通过外表读取OBS上的json数据。 OBS上有如下json文件,json对象中存在嵌套、数组,部分对象的某些字段缺失,部分对象name重复。 {"A" : "simple1", "B" : {"C" : "nesting1"}, "D" : ["array", 2, {"E" : "complicated"}]}{"A" : "simple2", "D" : ["array", 2, {"E" : "complicated"}]}{"A" : "simple3", "B" : {"C" : "nesting3"}, "D" : ["array", 2, {"E" : "complicated3"}]}{"B" : {"C" : "nesting4"},"A" : "simple4", "D" : ["array", 2, {"E" : "complicated4"}]}{"A" : "simple5", "B" : {"C" : "nesting5"}, "D" : ["array", 2, {"E" : "complicated5"}]} 创建obs_server,对应的foreign data wrapper为DFS_FDW。 123456 CREATE SERVER obs_server FOREIGN DATA WRAPPER DFS_FDW OPTIONS ( ADDRESS 'obs.example.com', ACCESS_KEY 'xxxxxxxxx', SECRET_ACCESS_KEY 'yyyyyyyyyyyyy', TYPE 'OBS'); ADDRESS是OBS的终端节点(Endpoint),请根据实际替换。也是使用region参数,通过指定regionCode在region_map文件中查找对应的 域名 。 ACCESS_KEY和SECRET_ACCESS_KEY是云账号体系访问密钥。请根据实际替换。 认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 TYPE表示创建的Server为OBS Server。请保持OBS取值不变。 创建OBS外表json_f ,定义字段名,以d#2_e为例,从命名可以看出该字段是数组d的第二个元素里嵌套的e对象。表关联的OBS服务器为obs_server。foldername为外表中数据源文件目录,即表数据目录在OBS上对应的文件目录。 认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 1 2 3 4 5 6 7 8 91011 CREATE FOREIGN TABLE json_f ( a VARCHAR(10), b_c TEXT, d#1 INTEGER, d#2_e VARCHAR(30))SERVER obs_server OPTIONS ( foldername '/xxx/xxx/', format 'json', encoding 'utf8', force_mapping 'true')distribute by roundrobin; 查询外表json_f。由于容错性参数force_mapping默认打开,json对象缺失的字段会填NULL;json对象name重复的以最后一次出现的name为准。 1 SELECT * FROM json_f; 图4 查看外表json_f结果
  • 示例2 通过HDFS只写外表,将TPC-H benchmark测试数据表region中的数据导出至HDFS文件系统的/user/hive/warehouse/gauss.db/regin_orc/目录下。 创建HDFS外表,对应的foreign data wrapper为HDFS_FDW或者DFS_FDW,同示例一。 创建HDFS只写外表。 1 2 3 4 5 6 7 8 9101112131415 CREATE FOREIGN TABLE ft_wo_region( R_REGIONKEY INT4, R_NAME TEXT, R_COMMENT TEXT)SERVER hdfs_serverOPTIONS( FORMAT 'orc', encoding 'utf8', FOLDERNAME '/user/hive/warehouse/gauss.db/regin_orc/')WRITE ONLY; 通过只写外表向HDFS文件系统写入数据。 1 INSERT INTO ft_wo_region SELECT * FROM region;
  • 信息约束(Informational Constraint) 在GaussDB(DWS)中,数据的约束完全由使用者保证,数据源数据能够严格遵守某种信息约束条件,能够加速对已经具有这种约束特征数据的查询。目前外表不支持索引,所以采取使用Informational Constraint信息优化Plan,提高查询性能。 建立外表信息约束的约束条件: 只有用户保证表中的其中一列的非空值具有唯一性时才可以建立Informational Constraint,否则查询结果将与期望值不同。 GaussDB(DWS)的Informational Constraint只支持PRIMARY KEY和UNIQUE两种约束。 GaussDB(DWS)的Informational Constraint支持NOT ENFORCED属性,不支持ENFORCED属性。 一个表上的多列可以分别建立UNIQUE类型的Informational Constraint,但是PRIMARY KEY一个表中只能建立一个。 一个表的一列上可以建立多个Informational Constraint(由于一个列上有多个约束和一个的作用一致,所以不建议一个列上建立多个Informational Constraint),但是Primary Key类型只能建立一个。 不支持COMMENT。 不支持多列组合约束。 ORC格式只写外表不支持同一个集群不同CN向同一外表并发导出。 ORC格式只写外表的目录,只能用于GaussDB(DWS)的单个外表的导出目录,不能用于多个外表,并且其他组件不能向此目录写入其他文件。
  • 示例3 关于包含信息约束(Informational Constraint)HDFS外表的相关操作。 创建含有信息约束(Informational Constraint)的HDFS外表。 1 2 3 4 5 6 7 8 910 CREATE FOREIGN TABLE ft_region ( R_REGIONKEY int, R_NAME TEXT, R_COMMENT TEXT , primary key (R_REGIONKEY) not enforced)SERVER hdfs_serverOPTIONS(format 'orc', encoding 'utf8', foldername '/user/hive/warehouse/gauss.db/region_orc11_64stripe')DISTRIBUTE BY roundrobin; 查看region表是否有信息约束索引: 1 SELECT relname,relhasindex FROM pg_class WHERE oid='ft_region'::regclass; 图1 查看relname 1 SELECT conname, contype, consoft, conopt, conindid, conkey FROM pg_constraint WHERE conname ='ft_region_pkey'; 图2 查看信息约束索引 删除信息约束: 12 ALTER FOREIGN TABLE ft_region DROP CONSTRAINT ft_region_pkey RESTRICT;SELECT conname, contype, consoft, conindid, conkey FROM pg_constraint WHERE conname ='ft_region_pkey'; 图3 删除信息约束 添加一个唯一信息约束: 1 ALTER FOREIGN TABLE ft_region ADD CONSTRAINT constr_unique UNIQUE(R_REGIONKEY) NOT ENFORCED; 删除唯一信息约束: 12 ALTER FOREIGN TABLE ft_region DROP CONSTRAINT constr_unique RESTRICT;SELECT conname, contype, consoft, conindid, conkey FROM pg_constraint WHERE conname ='constr_unique'; 添加一个唯一信息约束: 12 ALTER FOREIGN TABLE ft_region ADD CONSTRAINT constr_unique UNIQUE(R_REGIONKEY) NOT ENFORCED disable query optimization;SELECT relname,relhasindex FROM pg_class WHERE oid='ft_region'::regclass; 删除唯一信息约束: 1 ALTER FOREIGN TABLE ft_region DROP CONSTRAINT constr_unique CASCADE;
  • 功能描述 在当前数据库创建一个HDFS或OBS外表,用来访问存储在HDFS或者OBS分布式集群文件系统上的结构化数据。也可以导出ORC格式数据到HDFS或者OBS上。 数据存储在OBS:数据存储和计算分离,集群存储成本低,存储量不受限制,并且集群可以随时删除,但计算性能取决于OBS访问性能,相对HDFS有所下降,建议在数据计算不频繁场景下使用。 数据存储在HDFS:数据存储和计算不分离,集群成本较高,计算性能高,但存储量受磁盘空间限制,删除集群前需将数据导出保存,建议在数据计算频繁场景下使用。 实时数仓(单机部署)暂不支持OBS和HDFS外表导入导出功能。
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全