华为云用户手册

  • Retry管理 Retry是数据库在SQL或存储过程(包含匿名块)执行失败时,在数据库内部进行重新执行的过程,以提高执行成功率和用户体验。数据库内部通过检查发生错误时的错误码及Retry相关配置,决定是否进行重试。 失败时回滚之前执行的语句,并重新执行存储过程进行Retry。 示例: 1 2 3 4 5 6 7 8 9 gaussdb=# CREATE OR REPLACE PROCEDURE retry_basic ( IN x INT) AS BEGIN INSERT INTO t1 (a) VALUES (x); INSERT INTO t1 (a) VALUES (x+1); END; / gaussdb=# CALL retry_basic(1); 父主题: 存储过程
  • STAT_ALL_TABLES 显示数据库当前节点每个表(包括TOAST表)的状态信息。 表1 STAT_ALL_TABLES字段 名称 类型 描述 relid oid 表的OID。 schemaname name 该表所在的Schema名。 relname name 表名。 seq_scan bigint 该表发起的顺序扫描数。 seq_tup_read bigint 顺序扫描抓取的活跃行数。 idx_scan bigint 该表发起的索引扫描数。 idx_tup_fetch bigint 索引扫描抓取的活跃行数。 n_tup_ins bigint 插入行数。 n_tup_upd bigint 更新行数。 n_tup_del bigint 删除行数。 n_tup_hot_upd bigint HOT更新行数(即没有更新索引列的行数)。 n_live_tup bigint 估计活跃行数。 n_dead_tup bigint 估计不活跃行数。 last_vacuum timestamp with time zone 最后一次该表是手动清理的(不计算VACUUM FULL)的时间。 last_autovacuum timestamp with time zone 上次被autovacuum守护线程清理的时间。 last_analyze timestamp with time zone 上次手动分析该表的时间。 last_autoanalyze timestamp with time zone 上次被autovacuum守护线程分析时间。 vacuum_count bigint 该表被手动清理的次数(不计算VACUUM FULL)。 autovacuum_count bigint 该表被autovacuum清理的次数。 analyze_count bigint 该表被手动分析的次数。 autoanalyze_count bigint 该表被autovacuum守护线程分析的次数。 父主题: Object
  • MY_SEQUEN CES MY_SEQUENCES视图显示当前用户的序列信息。该视图同时存在于PG_CATA LOG 和SYS Schema下。 表1 MY_SEQUENCES字段 名称 类型 描述 sequence_owner character varying(64) 序列所有者。 sequence_name character varying(64) 序列的名称。 min_value int16 序列最小值。 max_value int16 序列最大值。 increment_by int16 序列的增量。 cycle_flag character(1) 表示序列是否是循环序列,取值为Y或N: Y表示是循环序列。 N表示不是循环序列。 last_number int16 上一序列的值。 cache_size int16 序列磁盘缓存大小。 order_flag character varying(1) 表示序列是否按照请求顺序发生,暂不支持,值为NULL。 scale_flag character varying(1) 表示是否为可扩展序列,暂不支持,值为NULL。 extend_flag character varying(1) 表示可扩展序列生成的值是否超出序列最大值、最小值范围。暂不支持,值为NULL。 sharded_flag character varying(1) 表示是否为分片序列。暂不支持,值为NULL。 session_flag character varying(1) 表示序列是否为私有会话,暂不支持,值为NULL。 keep_value character varying(1) 表示在失败后的replay期间是否保留序列值。暂不支持,值为NULL。 父主题: 系统视图
  • ADM_TYPE_ATTRS ADM_TYPE_ATTRS视图描述当前数据库对象类型的属性。默认只有系统管理员权限才可以访问此系统视图,普通用户需要授权才可以访问。该视图同时存在于PG_CATALOG和SYS Schema下。 表1 ADM_TYPE_ATTRS字段 名称 类型 描述 owner oid 该类型的所有者。 type_name name 数据类型名称。 attr_name name 字段名。 attr_type_mod integer 记录创建新表时支持的类型特定的数据(比如一个varchar字段的最大长度)。它传递给类型相关的输入和长度转换函数当做第三个参数。其值对那些不需要ATTTYPMOD的类型通常为-1。 attr_type_owner oid 该类型属性的所有者。 attr_type_name name 数据类型属性名称。目前该字段记录的是转换后的类型名。 length smallint 对于定长类型是该类型内部表现形式的字节数目。对于变长类型是负数。 -1表示一种“变长”(有长度字属性的数据)。 -2表示这是一个NULL结尾的C字符串。 precision integer 数字类型的精度。 scale integer 数字类型的范围。 character_set_name character(1) 属性的字符集名称(c或n)。 c:CHAR_ CS 。 n:NCHAR_CS。 attr_no smallint 属性编号。 inherited character(1) 表示属性是否继承自超级类型(Y或N)。 attr_length integer 记录创建新表时支持的类型特定的数据(比如一个varchar字段的最大长度)。对于raw类型,因内核实现原因,暂未记录。 父主题: 系统视图
  • 示例 代码运行的前提条件: 添加JDBC用户机器IP(假设IP为10.11.12.34)到复制数据权限的白名单里,命令如下: //分布式CN强一致解码(其中CN_IP为启动逻辑解码任务的CN节点IP地址,可使用cm_ctl query -Cvip命令查询): gs_guc reload -Z datanode -N all -I all -h 'host replication all CN_IP/24 trust' gs_guc reload -Z coordinator -N all -I all -h 'host replication all 10.11.12.34/32 sha256' //分布式直连DN解码: gs_guc reload -Z datanode -N all -I all -h 'host replication all 10.11.12.34/32 sha256' 将wal_level参数设置为logical,设置方法请联系管理员处理。 创建表t1和t2,并且对该表进行DDL或DML操作。 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 108 109 110 111 112 113 114 115 // 以下用例以opengaussjdbc.jar为例。 // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全。 // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 // $ip、$port、database需要用户自行修改。 // 逻辑复制类PGReplicationStream为非线程安全类,并发调用可能导致数据异常。 import com.huawei.opengauss.jdbc.PGProperty; import com.huawei.opengauss.jdbc.jdbc.PgConnection; import com.huawei.opengauss.jdbc.replication.LogSequenceNumber; import com.huawei.opengauss.jdbc.replication.PGReplicationStream; import java.nio.ByteBuffer; import java.sql.DriverManager; import java.util.Properties; import java.util.concurrent.TimeUnit; public class LogicalReplicationDemo { private static PgConnection conn = null; public static void main(String[] args) { String driver = "com.huawei.opengauss.jdbc.Driver"; // 此处配置数据库IP以及端口,这里的端口为haPort,通常默认是所连接CN或DN的port+1端口 String sourceURL = "jdbc:opengauss://$ip:$port/database"; // 默认逻辑复制槽的名称是:replication_slot // 测试模式:创建逻辑复制槽 int TEST_MODE_CREATE_SLOT = 1; // 测试模式:开启逻辑复制(前提条件是逻辑复制槽已经存在) int TEST_MODE_START_REPL = 2; // 测试模式:删除逻辑复制槽 int TEST_MODE_DROP_SLOT = 3; // 开启不同的测试模式 int testMode = TEST_MODE_START_REPL; try { Class.forName(driver); } catch (Exception e) { e.printStackTrace(); return; } try { Properties properties = new Properties(); PGProperty.USER.set(properties, System.getenv("EXAMPLE_USERNAME_ENV")); PGProperty.PASSWORD.set(properties, System.getenv("EXAMPLE_PASSWORD_ENV")); // 对于逻辑复制,以下三个属性是必须配置项 PGProperty.ASSUME_MIN_SERVER_VERSION.set(properties, "9.4"); PGProperty.REPLICATION.set(properties, "database"); PGProperty.PREFER_QUERY_MODE.set(properties, "simple"); conn = (PgConnection) DriverManager.getConnection(sourceURL, properties); System.out.println("connection success!"); if(testMode == TEST_MODE_CREATE_SLOT){ conn.getReplicationAPI() .createReplicationSlot() .logical() .withSlotName("replication_slot") //这里字符串如包含大写字母则会自动转化为小写字母 .withOutputPlugin("mppdb_decoding") .make(); }else if(testMode == TEST_MODE_START_REPL) { // 开启此模式前需要创建复制槽 LogSequenceNumber waitLSN = LogSequenceNumber.valueOf("6F/E3C53568"); //LSN需要用户根据实际情况进行修改 PGReplicationStream stream = conn .getReplicationAPI() .replicationStream() .logical() .withSlotName("replication_slot") .withSlotOption("include-xids", true) .withSlotOption("skip-empty-xacts", true) .withStartPosition(waitLSN) .withSlotOption("parallel-decode-num", 10) // 解码线程并行度 .withSlotOption("white-table-list", "public.t1,public.t2") // 白名单列表 // .withSlotOption("standby-connection", true) // 强制备机解码 .withSlotOption("decode-style", "t") // 解码格式 .withSlotOption("sending-batch", 0) // 批量发送解码结果 .withSlotOption("max-txn-in-memory", 100) // 单个解码事务落盘内存阈值为100MB .withSlotOption("max-reorderbuffer-in-memory", 2) // 正在处理的解码事务落盘内存阈值为2GB .withSlotOption("exclude-users","userA") // 不返回用户userA执行事务的逻辑日志 .withSlotOption("include-user", false) // 事务BEGIN逻辑日志不携带用户名称 .withSlotOption("enable-heartbeat", true) // 开启心跳日志 .start(); while (true) { ByteBuffer byteBuffer = stream.readPending(); if (byteBuffer == null) { TimeUnit.MILLISECONDS.sleep(10L); continue; } int offset = byteBuffer.arrayOffset(); byte[] source = byteBuffer.array(); int length = source.length - offset; System.out.println(new String(source, offset, length)); // 如果需要flush lsn,根据业务实际情况调用以下接口,每调用一次以下接口将触发数据库复制槽落盘逻辑,可能影响解码性能,建议每10s左右调用一次 // LogSequenceNumber lastRecv = stream.getLastReceiveLSN(); // stream.setFlushedLSN(lastRecv); // stream.forceUpdateStatus(); } }else if(testMode == TEST_MODE_DROP_SLOT){ conn.getReplicationAPI() .dropReplicationSlot("replication_slot"); } } catch (Exception e) { e.printStackTrace(); return; } finally { try { conn.close(); } catch (Exception e) { e.printStackTrace(); } } } }
  • SUMMARY_STATIO_ALL_TABLES SUMMARY_STATIO_ALL_TABLES视图将包含集群内汇聚的数据库中每个表(包括TOAST表)的I/O的统计。 表1 SUMMARY_STATIO_ALL_TABLES字段 名称 类型 描述 schemaname name 该表模式名。 relname name 表名。 heap_blks_read numeric 从该表中读取的磁盘块数。 heap_blks_hit numeric 该表缓存命中数。 idx_blks_read numeric 从表中所有索引读取的磁盘块数。 idx_blks_hit numeric 表中所有索引命中缓存数。 toast_blks_read numeric 该表的TOAST表读取的磁盘块数(如果存在)。 toast_blks_hit numeric 该表的TOAST表命中缓冲区数(如果存在)。 tidx_blks_read numeric 该表的TOAST表索引读取的磁盘块数(如果存在)。 tidx_blks_hit numeric 该表的TOAST表索引命中缓冲区数(如果存在)。 父主题: Cache/IO
  • 数据加载和卸载 在INSERT语句中显式设置插入的字段列表。例如: 1 INSERT INTO task(name,id,comment) VALUES ('task1','100','第100个任务'); 在批量数据入库之后,或者数据增量达到一定阈值后,建议对表进行ANALYZE操作,防止统计信息不准确而导致的执行计划劣化。 如果要清理表中的所有数据,建议使用TRUNCATE TABLE方式,不要使用DELETE TABLE方式。DELETE TABLE方式删除性能差,且不会释放那些已经删除了的数据占用的磁盘空间。
  • DDL 在 GaussDB 中,建议DDL(建表、COMMENT等)操作统一执行。在批处理作业中尽量避免DDL操作,避免大量并发事务对性能的影响。 在非日志表(unlogged table)使用完后,立即执行数据清理(TRUNCATE)操作。因为在异常场景下,GaussDB不保证非日志表(unlogged table)数据的安全性。 临时表和非日志表的存储方式建议和基表相同。 索引字段的总长度不超过50字节。否则,索引大小会膨胀比较严重,带来较大的存储开销,同时索引性能也会下降。 不要使用DROP…CASCADE方式删除对象,除非已经明确对象间的依赖关系,以免误删。
  • GLOBAL_COMM_SEND_STREAM GLOBAL_COMM_SEND_STREAM视图展示所有DN上所有的TCP代理通信库发送流状态。 表1 GLOBAL_COMM_SEND_STREAM字段 名称 类型 描述 node_name text 节点名称。 local_tid bigint 使用此通信流的线程ID。 remote_name text 连接对端节点名称。 remote_tid bigint 连接对端线程ID。 idx integer 通信对端DN在本DN内的标识编号。 sid integer 通信流在物理连接中的标识编号。 tcp_sock integer 通信流所使用的tcp通信socket。 state text 通信流当前的状态。 query_id bigint 通信流对应的debug_query_id编号。 pn_id integer 通信流所执行查询的plan_node_id编号。 send_smp integer 通信流所执行查询send端的smpid编号。 recv_smp integer 通信流所执行查询recv端的smpid编号。 send_bytes bigint 通信流发送的数据总量(单位:Byte)。 time bigint 通信流当前生命周期使用时长(单位:毫秒)。 speed bigint 通信流的平均发送速率(单位:Byte/s)。 quota bigint 通信流当前的通信配额值(单位:Byte)。 wait_quota bigint 通信流等待quota值产生的额外时间开销(单位:毫秒)。 父主题: Comm
  • 选择数据类型 高效数据类型,主要包括以下三方面: 尽量使用执行效率比较高的数据类型 一般来说整型数据运算(包括=、>、<、≧、≦、≠等常规的比较运算,以及group by)的效率比字符串、浮点数要高。 尽量使用短字段的数据类型 长度较短的数据类型不仅可以减小数据文件的大小,提升I/O性能;同时也可以减小相关计算时的内存消耗,提升计算性能。比如对于整型数据,如果可以用smallint就尽量不用int,如果可以用int就尽量不用bigint。 使用一致的数据类型 表关联列尽量使用相同的数据类型。如果表关联列数据类型不同,数据库必须动态地转化为相同的数据类型进行比较,这种转换会带来一定的性能开销。 父主题: 表设计最佳实践
  • PGXC_STAT_ACTIVITY PGXC_STAT_ACTIVITY视图显示当前集群下所有CN的当前用户查询相关的信息,该视图只有monitor admin和sysadmin权限可以查看。 表1 PGXC_STAT_ACTIVITY字段 名称 类型 描述 coorname text 当前集群下的CN名称。 datid oid 用户会话在后台连接到的数据库OID。 datname text 用户会话在后台连接到的数据库名称。 pid bigint 后台线程ID。 sessionid bigint 会话ID。 usesysid oid 登录该后台的用户OID。 usename text 登录该后台的用户名。 application_name text 连接到该后台的应用名。 client_addr inet 连接到该后台的客户端的IP地址。 如果此字段是null,它表明通过服务器机器上UNIX套接字连接客户端或者这是内部进程,如autovacuum。 client_hostname text 客户端的主机名,这个字段是通过client_addr的反向DNS查找得到。这个字段只有在启动log_hostname且使用IP连接时才非空。 client_port integer 客户端用于与后台通讯的TCP端口号,如果使用Unix套接字,则为-1。 backend_start timestamp with time zone 该过程开始的时间,即当客户端连接服务器的时间。 xact_start timestamp with time zone 启动当前事务的时间,如果没有事务是活跃的,则为null。如果当前查询是首个事务,则这列等同于query_start列。 query_start timestamp with time zone 开始当前活跃查询的时间, 如果state的值不是active,则这个值是上一个查询的开始时间。 state_change timestamp with time zone 上次状态改变的时间。 waiting boolean 如果后台当前正等待锁则为true。否则为false。如果等待的锁发生在DN,则需要根据PG_THREAD_WAIT_STATUS视图的wait_status字段确定发生的DN,然后到对应的DN查询PG_STAT_ACTIVITY的waiting字段来确认是否发生了等待锁的行为。 enqueue text 语句当前排队状态。可能值是: waiting in queue:表示语句在排队中。 空:表示语句正在运行。 state text 该后台当前总体状态。可能值是: active:后台正在执行一个查询。 idle:后台正在等待一个新的客户端命令。 idle in transaction:后台在事务中,但事务中没有语句在执行。 idle in transaction (aborted):后台在事务中,但事务中有语句执行失败。 fastpath function call:后台正在执行一个fast-path函数。 disabled:如果后台禁用track_activities,则报告这个状态。 说明: 只有系统管理员能查看到自己账户所对应的会话状态。其他账户的state信息为空。例如以judy用户连接数据库后,在pgxc_stat_activity中查看到的普通用户joe及初始用户omm的state信息为空: SELECT datname, usename, usesysid, state,pid FROM pgxc_stat_activity; datname | usename | usesysid | state | pid ----------+---------+----------+--------+----------------- testdb | omm | 10 | | 139968752121616 testdb | omm | 10 | | 139968903116560 db_tpcds | judy | 16398 | active | 139968391403280 testdb | omm | 10 | | 139968643069712 testdb | omm | 10 | | 139968680818448 testdb | joe | 16390 | | 139968563377936 (6 rows) resource_pool name 用户使用的资源池。 query_id bigint 查询语句的ID。 query text 该后台的最新查询。如果state状态是active(活跃的),此字段显示当前正在执行的查询。所有其他情况表示上一个查询。 connection_info text json格式字符串,记录当前连接数据库的驱动类型、驱动版本号、当前驱动的部署路径、进程属主用户等信息(参见GUC参数connection_info)。 global_sessionid text 全局会话ID。 unique_sql_id bigint 语句的unique sql id。 trace_id text 驱动传入的trace id,与应用的一次请求相关联。 top_xid xid 事务的顶层事务ID。 current_xid xid 事务的当前事务ID。 xlog_quantity bigint 事务当前使用的Xlog量,单位为字节。 父主题: 系统视图
  • PG_TOTAL_USER_RESOURCE_INFO_OID PG_TOTAL_USER_RESOURCE_INFO_OID视图显示所有用户资源使用情况,需要使用管理员用户进行查询。此视图在GUC参数use_workload_manager为on时才有效。 表1 PG_TOTAL_USER_RESOURCE_INFO_OID字段 名称 类型 描述 userid oid 用户ID。 used_memory integer 正在使用的内存大小,单位MB。 total_memory integer 可以使用的内存大小,单位MB。值为0表示未限制最大可用内存,其限制取决于数据库最大可用内存。 used_cpu double precision 正在使用的CPU核数。 total_cpu integer 在该机器节点上,用户关联控制组的CPU核数总和。 used_space bigint 已使用的存储空间大小,单位kB。 total_space bigint 可使用的存储空间大小,单位kB,值为-1表示未限制最大存储空间。 used_temp_space bigint 已使用的临时空间大小,单位kB total_temp_space bigint 可使用的临时空间总大小,单位kB,值为-1表示未限制。 used_spill_space bigint 已使用的下盘空间大小。单位kB。 total_spill_space bigint 可使用的下盘空间总大小,单位kB,值为-1表示未限制。 read_kbytes bigint 读磁盘数据量,单位kB。 write_kbytes bigint 写磁盘数据量,单位kB。 read_counts bigint 读磁盘次数。 write_counts bigint 写磁盘次数。 read_speed double precision 读磁盘速率,单位B/ms。 write_speed double precision 写磁盘速率,单位B/ms。 父主题: 系统视图
  • enable_access_server_directory 参数说明:是否开启非初始用户创建、修改和删除DIRECTORY的权限。 该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。 取值范围:布尔型 on表示开启非初始用户创建、修改和删除DIRECTORY的权限。 off表示不开启非初始用户创建、修改和删除DIRECTORY的权限。 默认值:off 用户在使用高级包UTL_FILE访问服务器端文件时,要求必须拥有所指定的DIRECTORY对象的权限。 出于安全考虑,默认情况下,只有初始用户才能够创建、修改、删除DIRECTORY对象。 如果开启了enable_access_server_directory,具有SYSADMIN权限的用户和继承了内置角色gs_role_directory_create权限的用户可以创建directory对象;具有SYSADMIN权限的用户、directory对象的属主、被授予了该directory的DROP权限的用户或者继承了内置角色gs_role_directory_drop权限的用户可以删除directory对象;具有SYSADMIN权限的用户和directory对象的属主可以修改directory对象的所有者,且要求该用户是新属主的成员。
  • audit_xid_info 参数说明:这个参数决定是否在审计日志字段detail_info中记录SQL语句的事务ID。 该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。 取值范围:整型,0、1。 0表示关闭审计日志记录事务ID功能。 1表示开启审计日志记录事务ID功能。 默认值:0 如果开启此开关,审计日志中detail_info信息则以xid开始,例如: detail_info: xid=14619 , create table t1(id int); 对于不存在事务ID的审计行为,记录xid=NA。
  • enable_nonsysadmin_execute_direct 参数说明:是否允许非系统管理员和非监控管理员执行EXECUTE DIRECT ON语句。 该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 取值范围:布尔型 on表示允许任意用户执行EXECUTE DIRECT ON语句。 off表示只允许系统管理员和监控管理员执行EXECUTE DIRECT ON语句。 默认值:off
  • audit_system_function_exec 参数说明:这个参数决定在执行白名单内的系统函数时是否记录审计日志。 该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。 取值范围:整型,0、1。 0表示关闭系统函数执行的审计功能。 1表示开启系统函数执行的审计功能。 默认值:0 支持审计的系统函数白名单如下表所示: set_working_grand_version_num_manually set_config pg_terminate_backend pg_cancel_backend pg_cancel_session pg_cancel_invalid_query pg_reload_conf pg_rotate_logfile pg_terminate_session pg_terminate_backend pg_start_backup pg_stop_backup pg_create_restore_point pg_switch_xlog pg_cbm_get_merged_file pg_cbm_recycle_file pg_enable_delay_ddl_recycle pg_disable_delay_ddl_recycle pg_cbm_rotate_file gs_roach_enable_delay_ddl_recycle gs_roach_disable_delay_ddl_recycle gs_roach_stop_backup pg_last_xlog_receive_location pg_xlog_replay_pause pg_xlog_replay_resume gs_roach_switch_xlog gs_pitr_archive_slot_force_advance gs_pitr_clean_history_global_barriers gs_download_obs_file gs_upload_obs_file gs_set_obs_file_context gs_set_obs_delete_location gs_hadr_do_switchover gs_set_obs_delete_location_with_slotname gs_streaming_dr_in_switchover pg_advisory_lock pg_advisory_lock_shared pg_advisory_unlock pg_advisory_unlock_shared pg_advisory_unlock_all pg_advisory_xact_lock pg_advisory_xact_lock_shared pg_try_advisory_lock pg_try_advisory_lock_shared pg_try_advisory_xact_lock pg_try_advisory_xact_lock_shared gs_get_hadr_key_cn pg_create_physical_replication_slot_extern pg_create_logical_replication_slot pg_drop_replication_slot pg_logical_slot_peek_changes pg_logical_slot_get_changes pg_logical_slot_get_binary_changes pg_replication_origin_drop pg_replication_origin_session_reset local_space_shrink gs_space_shrink global_space_shrink pg_free_remain_segment gs_fault_inject sqladvisor.init sqladvisor.set_weight_params sqladvisor.set_cost_params sqladvisor.assign_table_type gs_repair_file local_clear_bad_block_info gs_repair_page - - - - -
  • audit_system_object 参数说明:该参数决定是否对数据库对象的CREATE、DROP、ALTER操作进行审计。数据库对象包括DATABASE、USER、schema、TABLE等。通过修改该配置参数的值,可以只审计需要的数据库对象的操作,在主备强制选主场景建议audit_system_object取最大值,所有DDL对象全部审计。 该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。 取值范围:整型,0~536870911 0代表关闭数据库对象的CREATE、DROP、ALTER操作审计功能。 非0代表只审计某类或者某些数据库对象的CREATE、DROP、ALTER操作。 取值说明: 该参数的值由29个二进制位的组合求出,这29个二进制位分别代表29类数据库对象。如果对应的二进制位取值为0,表示不审计对应的数据库对象的CREATE、DROP、ALTER操作;取值为1,表示审计对应的数据库对象的CREATE、DROP、ALTER操作。这29个二进制位代表的具体审计内容请参见表1。 用于记录SQL PATCH的参数存在特殊性,如果对该对象进行审计且audit_dml_state_select也开启时,对于一条SQL PATCH操作的审计日志会作为DML和DDL被记录两次,如果调用remote接口,则会在入参对应的节点上产生DDL日志,而不是在下发语句的节点上。 默认值:67121159,表示对DATABASE、SCHEMA、USER、DATA SOURCE、NODE GROUP、SQLPatch这几种数据库对象的DDL操作进行审计。 表1 audit_system_object取值含义说明 二进制位 含义 取值说明 第0位 是否审计DATABASE对象的CREATE、DROP、ALTER操作。 0表示不审计该对象的CREATE、DROP、ALTER操作。 1表示审计该对象的CREATE、DROP、ALTER操作。 第1位 是否审计SCHEMA对象的CREATE、DROP、ALTER操作。 0表示不审计该对象的CREATE、DROP、ALTER操作。 1表示审计该对象的CREATE、DROP、ALTER操作。 第2位 是否审计USER和USER MAPPING对象的CREATE、DROP、ALTER操作。 0表示不审计该对象的CREATE、DROP、ALTER操作。 1表示审计该对象的CREATE、DROP、ALTER操作。 第3位 是否审计TABLE对象的CREATE、DROP、ALTER、TRUNCATE操作。 0表示不审计该对象的CREATE、DROP、ALTER、TRUNCATE操作。 1表示审计该对象的CREATE、DROP、ALTER、TRUNCATE操作。 第4位 是否审计INDEX对象的CREATE、DROP、ALTER操作。 0表示不审计该对象的CREATE、DROP、ALTER操作。 1表示审计该对象的CREATE、DROP、ALTER操作。 第5位 是否审计VIEW/MATVIEW对象的CREATE、DROP操作。 0表示不审计该对象的CREATE、DROP操作。 1表示审计该对象的CREATE、DROP操作。 第6位 是否审计TRIGGER对象的CREATE、DROP、ALTER操作。 0表示不审计该对象的CREATE、DROP、ALTER操作。 1表示审计该对象的CREATE、DROP、ALTER操作。 第7位 是否审计PROCEDURE/FUNCTION对象的CREATE、DROP、ALTER操作。 0表示不审计该对象的CREATE、DROP、ALTER操作。 1表示审计该对象的CREATE、DROP、ALTER操作。 第8位 是否审计TABLESPACE对象的CREATE、DROP、ALTER操作。 0表示不审计该对象的CREATE、DROP、ALTER操作。 1表示审计该对象的CREATE、DROP、ALTER操作。 第9位 是否审计RESOURCE POOL对象的CREATE、DROP、ALTER操作。 0表示不审计该对象的CREATE、DROP、ALTER操作。 1表示审计该对象的CREATE、DROP、ALTER操作。 第10位 是否审计WORKLOAD对象的CREATE、DROP、ALTER操作。 0表示不审计该对象的CREATE、DROP、ALTER操作。 1表示审计该对象的CREATE、DROP、ALTER操作。 第11位 保留 - 第12位 是否审计DATA SOURCE对象的CRAETE、DROP、ALTER操作。 0表示不审计该对象的CREATE、DROP、ALTER操作。 1表示审计该对象的CREATE、DROP、ALTER操作。 第13位 是否审计NODE GROUP对象的CREATE、DROP操作。 0表示不审计该对象的CREATE、DROP操作。 1表示审计该对象的CREATE、DROP操作。 第14位 是否审计ROW LEVEL SECURITY对象的CREATE、DROP、ALTER操作。 0表示不审计该对象的CREATE、DROP、ALTER操作。 1表示审计该对象的CREATE、DROP、ALTER操作。 第15位 是否审计TYPE对象的CREATE、DROP、ALTER操作。 0表示不审计TYPE对象的CREATE、DROP、ALTER操作。 1表示审计TYPE对象的CREATE、DROP、ALTER操作。 第16位 是否审计TEXT SEARCH对象(CONFIGURATION和DICTIONARY)的CREATE、DROP、ALTER操作。 0表示不审计TEXT SEARCH对象的CREATE、DROP、ALTER操作。 1表示审计TEXT SEARCH对象的CREATE、DROP、ALTER操作。 第17位 是否审计DIRECTORY对象的CREATE、DROP、ALTER操作。 0表示不审计DIRECTORY对象的CREATE、DROP、ALTER操作。 1表示审计DIRECTORY对象的CREATE、DROP、ALTER操作。 第18位 是否审计SYNONYM对象的CREATE、DROP、ALTER操作。 0表示不审计SYNONYM对象的CREATE、DROP、ALTER操作。 1表示审计SYNONYM对象的CREATE、DROP、ALTER操作。 第19位 是否审计SEQUENCE对象的CREATE、DROP、ALTER操作。 0表示不审计SEQUENCE对象的CREATE、DROP、ALTER操作。 1表示审计SEQUENCE对象的CREATE、DROP、ALTER操作。 第20位 是否审计CMK、CEK对象的CREATE、ALTER、DROP操作。 0表示不审计CMK、CEK对象的CREATE、ALTER、DROP操作。 1表示审计CMK、CEK对象的CREATE、ALTER、DROP操作。 第21位 是否审计PACKAGE对象的CREATE、DROP、ALTER操作(目前仅集中式支持PACKAGE)。 0表示不审计PACKAGE对象的CREATE、DROP、ALTER操作。 1表示审计PACKAGE对象的CREATE、DROP、ALTER操作。 第22位 保留 - 第23位 保留 - 第24位 是否审计对gs_global_config全局对象的ALTER、DROP操作。 0表示不审计对系统表gs_global_config全局对象的ALTER、DROP操作。 1表示审计对系统表gs_global_config全局对象的ALTER、DROP操作。 第25位 保留 - 第26位 是否审计SQL PATCH对象的CREATE、ENABLE、DISABLE、DROP操作。 0表示不审计SQL PATCH对象的CREATE、ENABLE、DISABLE、DROP操作。 1表示审计SQL PATCH对象的CREATE、ENABLE、DISABLE、DROP操作。 第27位 保留 - 第28位 是否审计DBLINK对象的CREATE、ALTER、DROP操作。目前DATABASE LINK功能暂不支持。 0表示不审计DBLINK对象的CREATE、ALTER、DROP操作。 1表示审计DBLINK对象的CREATE、ALTER、DROP操作。
  • 语法格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ALTER NODE nodename WITH ( [ TYPE = nodetype,] [ HOST = hostname,] [ PORT = portnum,] [ HOST1 = 'hostname',] [ PORT1 = portnum,] [ HOSTPRIMARY [ = boolean ],] [ PRIMARY [ = boolean ],] [ PREFERRED [ = boolean ],] [ SCTP_PORT = portnum,] [ CONTROL_PORT = portnum,] [ SCTP_PORT1 = portnum,] [ CONTROL_PORT1 = portnum, ] [ NODEIS_CENTRAL [ = boolean ]] ); PORT选项指定的端口号为节点间内部通信绑定的端口号,不同于外部客户端连接节点的端口号,可通过pgxc_node表查询。
  • 示例 --创建集群节点,在所有CN上执行。 gaussdb=# CREATE NODE datanode1 WITH( TYPE = datanode, PREFERRED = false ); --查询集群DN初始状态。 gaussdb=# SELECT node_name, nodeis_preferred FROM pgxc_node WHERE node_type = 'D' ORDER BY 1; node_name | nodeis_preferred -----------+------------------ datanode1 | f datanode2 | f (2 rows) --将datanode1设为preferred DN。 gaussdb=# ALTER NODE datanode1 WITH(preferred = true); --查询集群DN变更后状态。 gaussdb=# SELECT node_name, nodeis_preferred FROM pgxc_node WHERE node_type = 'D' ORDER BY 1; node_name | nodeis_preferred -----------+------------------ datanode1 | t datanode2 | f (2 rows) --删除集群节点,连接一个CN即可。 gaussdb=# DROP NODE datanode1;
  • 美元引用的字符串常量 如果在字符串序列中包含有'(单引号),那么应当将'(单引号)加倍为''(两个单引号)否则sql语句很可能无法执行。 如果字符串中包含很多单引号或者反斜杠,那么理解字符串的内容可能就会变得很苦涩,并且容易出错,因为单引号都要加倍。 为了让这种场合下的查询更具可读性,我们允许另外一种称作"美元符界定"的字符串常量书写办法。一个通过美元符界定声明的字符串常量由一个美元符号($)、零个或多个字符组成的"记号"、另一个美元符号、组成字符串常量的任意字符序列、一个美元符号、与前面相同的记号、一个美元符号组成的。 gaussdb=# SELECT $$it's an example$$; ?column? ----------------- it's an example (1 row) 父主题: 附录
  • PG_SHDEPEND PG_SHDEPEND系统表记录数据库对象和共享对象(比如角色)之间的依赖性关系。这些信息允许GaussDB保证在企图删除这些对象之前,这些对象是没有被引用的。 PG_DEPEND的作用类似,只是它是用于在一个数据库内部的对象的依赖性关系的。 PG_SHDEPEND是在集群的所有数据库之间共享的,即每个集群只有一个,而不是每个数据库一个。 表1 PG_SHDEPEND字段 名称 类型 引用 描述 dbid oid PG_DATABASE.oid 依赖对象所在的数据库的OID ,如果是共享对象,则为零。 classid oid PG_CLASS.oid 依赖对象所在的系统表的OID。 objid oid 任意OID属性 指定的依赖对象的OID。 objsubid integer - 对于一个表字段,这是字段号(objid和classid参考表本身)。对于所有其他对象类型,这个字段为零。 refclassid oid PG_CLASS.oid 被引用对象所在的系统表的OID(必须是一个共享表)。 refobjid oid 任意OID属性 指定的被引用对象的OID。 deptype "char" - 一段代码,定义了这个依赖性关系的特定语义,参阅下文。 在任何情况下,一条PG_SHDEPEND记录就表明这个被引用的对象不能在未删除依赖对象的前提下删除。不过,deptype同时还标出了几种不同的子风格: SHARED_DEPENDENCY_OWNER (o) 被引用的对象(必须是一个角色)是依赖对象的所有者。 SHARED_DEPENDENCY_ACL (a) 被引用的对象(必须是一个角色)在依赖对象的ACL(访问控制列表,也就是权限列表)里提到。SHARED_DEPENDENCY_ACL不会在对象的所有者头上添加的,因为所有者会有一个SHARED_DEPENDENCY_OWNER记录。 SHARED_DEPENDENCY_PIN (p) 这类记录标识系统自身依赖于该被依赖对象,因此这样的对象不能被删除。这种类型的记录只是由initdb创建。这样的依赖对象的字段都是零。 SHARED_DEPENDENCY_ DBPRIV(d) 被引用的对象(必须是一个角色)具有依赖对象所对应的ANY权限(指定的依赖对象的OID对应的是系统表12.2.11 GS_DB_PRIVILEGE中一行)。 父主题: 系统表
  • SUMMARY_STATIO_SYS_TABLES SUMMARY_STATIO_SYS_TABLES视图显示集群内汇聚的命名空间中所有系统表的I/O状态信息。 表1 SUMMARY_STATIO_SYS_TABLES字段 名称 类型 描述 schemaname name 该表模式名。 relname name 表名。 heap_blks_read numeric 从该表中读取的磁盘块数。 heap_blks_hit numeric 该表缓存命中数。 idx_blks_read numeric 从表中所有索引读取的磁盘块数。 idx_blks_hit numeric 表中所有索引命中缓存数。 toast_blks_read numeric 该表的TOAST表读取的磁盘块数(如果存在)。 toast_blks_hit numeric 该表的TOAST表命中缓冲区数(如果存在)。 tidx_blks_read numeric 该表的TOAST表索引读取的磁盘块数(如果存在)。 tidx_blks_hit numeric 该表的TOAST表索引命中缓冲区数(如果存在)。 父主题: Cache/IO
  • date_part date_part函数是在传统的Ingres函数的基础上制作的(该函数等效于SQL标准函数extract): date_part('field', source) 这里的field参数必须是一个字符串,而不是一个名称。有效的field与extract一样,详细信息请参见EXTRACT。 示例: 1 2 3 4 5 gaussdb=# SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 16 (1 row) 1 2 3 4 5 gaussdb=# SELECT date_part('hour', INTERVAL '4 hours 3 minutes'); date_part ----------- 4 (1 row)
  • TIMESTAMPDIFF TIMESTAMPDIFF(unit , timestamp_expr1, timestamp_expr2) timestampdiff函数是计算两个日期时间之间(timestamp_expr2-timestamp_expr1)的差值,并以unit形式范围结果。timestamp_expr1,timestamp_expr2必须是一个timestamp、timestamptz、date类型的值表达式。unit表示的是两个日期差的单位。 等效于timestamp_diff(text, timestamp, timestamp)。 该函数仅在GaussDB兼容MySQL类型时(即dbcompatibility = 'MYSQL')有效,其他类型不支持该函数。 year 年份。 1 2 3 4 5 gaussdb=# SELECT TIMESTAMPDIFF(YEAR, '2018-01-01', '2020-01-01'); timestamp_diff ---------------- 2 (1 row)
  • EXTRACT EXTRACT(field FROM source) extract函数从日期或时间的数值里抽取子域,比如年、小时等。source必须是一个timestamp、time或interval类型的值表达式(类型为date的表达式转换为timestamp,因此也可以用)。field是一个标识符或者字符串,它指定从源数据中抽取的域。extract函数返回类型为double precision的数值。field的取值范围如下所示。 century 世纪。 第一个世纪从0001-01-01 00:00:00 AD开始。这个定义适用于所有使用阳历的国家。没有0世纪,直接从公元前1世纪到公元1世纪。 示例: 1 2 3 4 5 gaussdb=# SELECT EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13'); date_part ----------- 20 (1 row) day 如果source为timestamp,表示月份里的日期(1-31)。 1 2 3 4 5 gaussdb=# SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 16 (1 row) 如果source为interval,表示天数。 1 2 3 4 5 gaussdb=# SELECT EXTRACT(DAY FROM INTERVAL '40 days 1 minute'); date_part ----------- 40 (1 row) decade 年份除以10。 1 2 3 4 5 gaussdb=# SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 200 (1 row) dow 每周的星期几,星期天(0)到星期六(6)。 1 2 3 4 5 gaussdb=# SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 5 (1 row) doy 一年的第几天(1~365/366)。 1 2 3 4 5 gaussdb=# SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 47 (1 row) epoch 如果source为timestamp with time zone,表示自1970-01-01 00:00:00-00 UTC以来的秒数(结果可能是负数); 如果source为date和timestamp,表示自1970-01-01 00:00:00-00当地时间以来的秒数; 如果source为interval,表示时间间隔的总秒数。 1 2 3 4 5 gaussdb=# SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40.12-08'); date_part -------------- 982384720.12 (1 row) 1 2 3 4 5 gaussdb=# SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours'); date_part ----------- 442800 (1 row) 将epoch值转换为时间戳的方法。 1 2 3 4 5 gaussdb=# SELECT TIMESTAMP WITH TIME ZONE 'epoch' + 982384720.12 * INTERVAL '1 second' AS RESULT; result --------------------------- 2001-02-17 12:38:40.12+08 (1 row) hour 小时域(0-23)。 1 2 3 4 5 gaussdb=# SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 20 (1 row) isodow 一周的第几天(1-7)。 星期一为1,星期天为7。 除了星期天外,都与dow相同。 1 2 3 4 5 gaussdb=# SELECT EXTRACT(ISODOW FROM TIMESTAMP '2001-02-18 20:38:40'); date_part ----------- 7 (1 row) isoyear 日期中的ISO 8601标准年(不适用于间隔)。 每个带有星期一开始的周中包含1月4日的ISO年,所以在年初的1月或12月下旬的ISO年可能会不同于阳历的年。详细信息请参见后续的week描述。 1 2 3 4 5 6 7 8 9 10 gaussdb=# SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-01'); date_part ----------- 2005 (1 row) gaussdb=# SELECT EXTRACT(WEEK FROM TIMESTAMP '2006-01-01 00:00:40'); date_part ----------- 52 (1 row) 1 2 3 4 5 6 7 8 9 10 gaussdb=# SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-02'); date_part ----------- 2006 (1 row) gaussdb=# SELECT EXTRACT(WEEK FROM TIMESTAMP '2006-01-02 00:00:40'); date_part ----------- 1 (1 row) microseconds 秒域(包括小数部分)乘以1,000,000。 1 2 3 4 5 gaussdb=# SELECT EXTRACT(MICROSECONDS FROM TIME '17:12:28.5'); date_part ----------- 28500000 (1 row) millennium 千年。 20世纪(19xx年)里面的年份在第二个千年里。第三个千年从2001年1月1日零时开始。 1 2 3 4 5 gaussdb=# SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 3 (1 row) milliseconds 秒域(包括小数部分)乘以1000。请注意它包括完整的秒。 1 2 3 4 5 gaussdb=# SELECT EXTRACT(MILLISECONDS FROM TIME '17:12:28.5'); date_part ----------- 28500 (1 row) minute 分钟域(0-59)。 1 2 3 4 5 gaussdb=# SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 38 (1 row) month 如果source为timestamp,表示一年里的月份数(1-12)。 1 2 3 4 5 gaussdb=# SELECT EXTRACT(MONTH FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 2 (1 row) 如果source为interval,表示月的数目,然后对12取模(0-11)。 1 2 3 4 5 gaussdb=# SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months'); date_part ----------- 1 (1 row) quarter 该天所在的该年的季度(1-4)。 1 2 3 4 5 gaussdb=# SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 1 (1 row) second 秒域,包括小数部分(0-59)。 1 2 3 4 5 gaussdb=# SELECT EXTRACT(SECOND FROM TIME '17:12:28.5'); date_part ----------- 28.5 (1 row) timezone 与UTC的时区偏移量,单位为秒。正数对应UTC东边的时区,负数对应UTC西边的时区。 timezone_hour 时区偏移量的小时部分。 timezone_minute 时区偏移量的分钟部分。 week 该天在所在的年份里是第几周。ISO 8601定义一年的第一周包含该年的一月四日(ISO-8601 的周从星期一开始)。换句话说,一年的第一个星期四在第一周。 在ISO定义里,一月的头几天可能是前一年的第52或者第53周,十二月的后几天可能是下一年第一周。比如,2006-01-01是2005年的第52周,而2006-01-02是2006年的第1周。建议isoyear字段和week一起使用以得到一致的结果。 1 2 3 4 5 6 7 8 9 10 gaussdb=# SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-01'); date_part ----------- 2005 (1 row) gaussdb=# SELECT EXTRACT(WEEK FROM TIMESTAMP '2006-01-01 00:00:40'); date_part ----------- 52 (1 row) gaussdb=# SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-02'); date_part ----------- 2006 (1 row) gaussdb=# SELECT EXTRACT(WEEK FROM TIMESTAMP '2006-01-02 00:00:40'); date_part ----------- 1 (1 row) year 年份域。 1 2 3 4 5 gaussdb=# SELECT EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40'); date_part ----------- 2001 (1 row)
  • 时间/日期函数 age(timestamp, timestamp) 描述:将两个参数相减,并以年、月、日作为返回值。若相减值为负,则函数返回亦为负,入参可以都带timezone或都不带timezone。 返回值类型:interval 示例: 1 2 3 4 5 gaussdb=# SELECT age(timestamp '2001-04-10', timestamp '1957-06-13'); age ------------------------- 43 years 9 mons 27 days (1 row) age(timestamp) 描述:当前SQL执行开始时刻的系统时间和参数相减,入参可以带或者不带timezone。 返回值类型:interval 示例: 1 2 3 4 5 gaussdb=# SELECT age(timestamp '1957-06-13'); age ------------------------- 60 years 2 mons 18 days (1 row) clock_timestamp() 描述:返回当前函数被调用时的系统时间的时间戳。volatile函数,每次扫描都会取最新的时间戳,因此在一次查询中每次调用结果不相同。 返回值类型:timestamp with time zone 示例: 1 2 3 4 5 gaussdb=# SELECT clock_timestamp(); clock_timestamp ------------------------------- 2017-09-01 16:57:36.636205+08 (1 row) current_date 描述:返回当前本条SQL启动的系统时间的日期。 返回值类型:date 示例: 1 2 3 4 5 gaussdb=# SELECT current_date; date ------------ 2017-09-01 (1 row) 此函数在ORA兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s2的情况下返回值类型为timestamp。 current_time 描述:当前事务的开始时刻的系统时间。 返回值类型:time with time zone 示例: 1 2 3 4 5 gaussdb=# SELECT current_time; timetz -------------------- 16:58:07.086215+08 (1 row) current_timestamp 描述:返回的结果为当前SQL启动的系统时间。语句级别时间,同一个语句内返回结果不变。 返回值类型:timestamp with time zone 示例: 1 2 3 4 5 gaussdb=# SELECT current_timestamp; pg_systimestamp ------------------------------ 2017-09-01 16:58:19.22173+08 (1 row) current_timestamp(precision) 描述:返回的结果为当前事务启动的系统时间,并将结果的微秒圆整为指定小数位。 返回值类型:timestamp with time zone 示例: 1 2 3 4 5 gaussdb=# SELECT current_timestamp(1); timestamptz ------------------------------ 2017-09-01 16:58:19.2+08 (1 row) 此函数在ORA兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s2的情况下,precision参数支持numeric类型的整值,否则仅支持int输入。 微秒末位的0不显示,如2017-09-01 10:32:19.212000输出显示为2017-09-01 10:32:19.212。 pg_systimestamp() 描述:当前日期和时间(当前语句的开始)。 返回值类型:timestamp with time zone 示例: 1 2 3 4 5 gaussdb=# SELECT pg_systimestamp(); pg_systimestamp ------------------------------- 2015-10-14 11:21:28.317367+08 (1 row) date_part(text, timestamp) 描述: 获取日期或者时间值中子域的值,例如年或者小时的值。 等效于extract(field from timestamp)。 timestamp类型:abstime、date、interval、reltime、time with time zone、time without time zone、timestamp with time zone、timestamp without time zone。 返回值类型:double precision 示例: 1 2 3 4 5 gaussdb=# SELECT date_part('hour', timestamp '2001-02-16 20:38:40'); date_part ----------- 20 (1 row) date_part(text, interval) 描述:获取月份的值。如果大于12,则取与12的模。等效于extract(field from timestamp)。 返回值类型:double precision 示例: 1 2 3 4 5 gaussdb=# SELECT date_part('month', interval '2 years 3 months'); date_part ----------- 3 (1 row) date_trunc(text, timestamp) 描述:截取到参数text指定的精度。 返回值类型:interval、timestamp with time zone、timestamp without time zone 示例: 1 2 3 4 5 gaussdb=# SELECT date_trunc('hour', timestamp '2001-02-16 20:38:40'); date_trunc --------------------- 2001-02-16 20:00:00 (1 row) trunc(timestamp) 描述:默认按天截取。 示例: 1 2 3 4 gaussdb=# SELECT trunc(timestamp '2001-02-16 20:38:40'); trunc --------------------- 2001-02-16 00:00:00 (1 row) trunc(arg1, arg2) 描述:截取到arg2指定的精度。 arg1类型:interval、timestamp with time zone、timestamp without time zone arg2类型:text 返回值类型:interval、timestamp with time zone、timestamp without time zone 示例: 1 2 3 4 gaussdb=# SELECT trunc(timestamp '2001-02-16 20:38:40', 'hour'); trunc --------------------- 2001-02-16 20:00:00 (1 row) round(arg1, arg2) 描述:四舍五入到arg2指定的精度。 arg1类型:timestamp without time zone arg2类型:text 返回值类型:timestamp without time zone 示例: 1 2 3 4 gaussdb=# SELECT round(timestamp '2001-02-16 20:38:40', 'hour'); round --------------------- 2001-02-16 21:00:00 (1 row) 此函数在ORA兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s1的情况下有效。 daterange(arg1, arg2) 描述:获取时间边界信息。 arg1类型:date arg2类型:date 返回值类型:daterange 示例: 1 2 3 4 5 gaussdb=# select daterange('2000-05-06','2000-08-08'); daterange ------------------------- [2000-05-06,2000-08-08) (1 row) daterange(arg1, arg2, text) 描述:获取时间边界信息。 arg1类型:date arg2类型:date text类型:text 返回值类型:daterange 示例: 1 2 3 4 5 gaussdb=# select daterange('2000-05-06','2000-08-08','[]'); daterange ------------------------- [2000-05-06,2000-08-09) (1 row) extract(field from timestamp) 描述:获取小时的值。 返回值类型:double precision 示例: 1 2 3 4 5 gaussdb=# SELECT extract(hour from timestamp '2001-02-16 20:38:40'); date_part ----------- 20 (1 row) extract(field from interval) 描述:获取月份的值。如果大于12,则取与12的模。 返回值类型:double precision 示例: 1 2 3 4 5 gaussdb=# SELECT extract(month from interval '2 years 3 months'); date_part ----------- 3 (1 row) isfinite(date) 描述:判断日期是否为有限值,是则返回t,否则返回f。 返回值类型:Boolean 示例: 1 2 3 4 5 6 7 8 9 10 gaussdb=# SELECT isfinite(date '2001-02-16'); isfinite ---------- t (1 row) gaussdb=# SELECT isfinite(date 'infinity'); isfinite ---------- f (1 row) isfinite(timestamp) 描述:判断时间戳是否为有限值,是则返回t,否则返回f。 返回值类型:Boolean 示例: 1 2 3 4 5 6 7 8 9 10 gaussdb=# SELECT isfinite(timestamp '2001-02-16 21:28:30'); isfinite ---------- t (1 row) gaussdb=# SELECT isfinite(timestamp 'infinity'); isfinite ---------- f (1 row) isfinite(interval) 描述:判断时间间隔是否为有限值,是则返回t,暂不支持返回f,输入'infinity'会报错。 返回值类型:Boolean 示例: 1 2 3 4 5 gaussdb=# SELECT isfinite(interval '4 hours'); isfinite ---------- t (1 row) justify_days(interval) 描述:将时间间隔以月(30天为一月)为单位。 返回值类型:interval 示例: 1 2 3 4 5 gaussdb=# SELECT justify_days(interval '35 days'); justify_days -------------- 1 mon 5 days (1 row) justify_hours(interval) 描述:将时间间隔以天(24小时为一天)为单位。 返回值类型:interval 示例: 1 2 3 4 5 gaussdb=# SELECT JUSTIFY_HOURS(INTERVAL '27 HOURS'); justify_hours ---------------- 1 day 03:00:00 (1 row) justify_interval(interval) 描述:结合justify_days和justify_hours,调整interval。 返回值类型:interval 示例: 1 2 3 4 5 gaussdb=# SELECT JUSTIFY_INTERVAL(INTERVAL '1 MON -1 HOUR'); justify_interval ------------------ 29 days 23:00:00 (1 row) localtime 描述:当前事务的开始时刻的系统时间。 返回值类型:time 示例: 1 2 3 4 5 gaussdb=# SELECT localtime AS RESULT; result ---------------- 16:05:55.664681 (1 row) localtimestamp 描述:返回当前本条SQL执行开始时刻的系统日期和时间。 返回值类型:timestamp 示例: 1 2 3 4 5 gaussdb=# SELECT localtimestamp; timestamp ---------------------------- 2017-09-01 17:03:30.781902 (1 row) now() 描述:当前事务的开始时刻的系统的日期及时间,同一个事务内返回结果相同。 返回值类型:timestamp with time zone 示例: 1 2 3 4 5 gaussdb=# SELECT now(); now ------------------------------- 2017-09-01 17:03:42.549426+08 (1 row) timenow() 描述:返回当前本条SQL执行开始时刻的系统日期和时间。 返回值类型:abstime 示例: 1 2 3 4 5 gaussdb=# select timenow(); timenow ------------------------ 2020-06-23 20:36:56+08 (1 row) numtodsinterval(num, interval_unit) 描述:将数字转换为interval类型。num为numeric类型数字,interval_unit为固定格式字符串('DAY' | 'HOUR' | 'MINUTE' | 'SECOND')。 可以通过设置GUC参数IntervalStyle为ORA,兼容该函数interval输出格式。 返回值类型:interval 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 gaussdb=# SELECT numtodsinterval(100, 'HOUR'); numtodsinterval ----------------- 100:00:00 (1 row) gaussdb=# SET intervalstyle = oracle; SET gaussdb=# SELECT numtodsinterval(100, 'HOUR'); numtodsinterval ------------------------------- +000000004 04:00:00.000000000 (1 row) 此函数在ORA兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s2的情况下:当参数interval_unit为 'DAY' 时,参数num超过1000000000会报错。 numtoyminterval(num, interval_unit) 描述:将数字转换为interval类型。num为numeric类型数字,interval_unit为固定格式字符串('YEAR' | 'MONTH')。 可以通过设置GUC参数IntervalStyle为ORA,兼容interval输出格式。 返回值类型:interval 示例: 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 gaussdb=# \c gaussdb_o; Non-SSL connection (SSL connection is recommended when requiring high-security) You are now connected to database "gaussdb_o" as user "omm". gaussdb_o=# set a_format_version='10c'; SET gaussdb_o=# set a_format_dev_version='s2'; SET gaussdb=# SELECT numtoyminterval(100, 'MONTH'); numtoyminterval ----------------- 8 years 4 mons (1 row) gaussdb_o=# SET intervalstyle = oracle; SET gaussdb_o=# SELECT numtoyminterval(100, 'MONTH'); numtoyminterval ----------------- 8-4 (1 row) gaussdb_o=# \c postgres Non-SSL connection (SSL connection is recommended when requiring high-security) You are now connected to database "postgres" as user "omm". gaussdb=# DROP DATABASE gaussdb_o; DROP DATABASE 此函数在ORA兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s2的情况下有效。 new_time(date, timezone1,timezone2) 描述:当timezone1所表示时区的日期时间为date的时候,返回此时timezone2所表示时区的日期时间值。 返回值类型:timestamp 示例: 1 2 3 4 5 6 7 8 9 10 gaussdb=# select new_time('1997-10-10','AST','EST'); new_time --------------------- 1997-10-09 23:00:00 (1 row) gaussdb=# SELECT NEW_TIME(TO_TIMESTAMP ('10-Sep-02 14:10:10.123000','DD-Mon-RR HH24:MI:SS.FF'), 'AST', 'PST'); new_time ------------------------- 2002-09-10 10:10:10.123 (1 row) 此函数在ORA兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s2的情况下生效。 sessiontimezone 描述:当前会话的时区,无入参。 返回值类型:text 示例: 1 2 3 4 5 6 7 8 9 10 gaussdb=# SELECT SESSIONTIMEZONE; session_time_zone ------------------- PST8PDT (1 row) gaussdb=# SELECT LOWER(SESSIONTIMEZONE); lower ----------- @ 8 hours (1 row) 此函数在ORA兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s2的情况下生效。 当set session time zone的值为GMT+08:00/GMT-08:00格式时,正值的偏移量被用于格林威治以西的位置,例如GMT+08:00表示西八区,GMT-08:00表示东八区。 sys_extract_utc(timestamp| timestamptz) 描述:从具有时区偏移量或时区区 域名 称的日期时间值中提取UTC(协调世界时-以前称为格林威治平均时间)。如果未指定时区,则日期时间与会话时区关联。入参有timestmp和timestamp两种形式。 返回值类型:timestamp。 示例: 1 2 3 4 5 6 7 8 9 10 gaussdb=# SELECT SYS_EXTRACT_UTC(TIMESTAMP '2000-03-28 11:30:00.00'); sys_extract_utc --------------------- 2000-03-28 03:30:00 (1 row) gaussdb=# SELECT SYS_EXTRACT_UTC(TIMESTAMPTZ '2000-03-28 11:30:00.00 -08:00'); sys_extract_utc --------------------- 2000-03-28 19:30:00 (1 row) 此函数在ORA兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s2的情况下生效。 tz_offset('time_zone_name' | '(+/-)hh:mi' | SESSIONTIMEZONE | DBTIMEZONE) 描述:入参有以上四种形式,返回入参所表示时区的UTC偏移量。 返回值类型:text。 示例: 1 2 3 4 5 6 7 8 9 10 gaussdb=# SELECT TZ_OFFSET('US/Pacific'); tz_offset ----------- -08:00 (1 row) gaussdb=# SELECT TZ_OFFSET(sessiontimezone); tz_offset ----------- +08:00 (1 row) 此函数在ORA兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s2的情况下生效。 pg_sleep(seconds) 描述:服务器线程延迟时间,单位为秒。注意,当数据库调用该函数时,会获取相应的事务快照,相当于一个长事务,如果入参时间过长可能导致数据库oldestxmin无法推进,影响表的回收和查询性能。 返回值类型:void 示例: 1 2 3 4 5 gaussdb=# SELECT pg_sleep(10); pg_sleep ---------- (1 row) statement_timestamp() 描述:当前日期和时间(当前语句的开始)。 返回值类型:timestamp with time zone 示例: 1 2 3 4 5 gaussdb=# SELECT statement_timestamp(); statement_timestamp ------------------------------- 2017-09-01 17:04:39.119267+08 (1 row) sysdate 描述:返回当前本条SQL执行时刻的系统日期和时间。 返回值类型:timestamp 示例: 1 2 3 4 5 gaussdb=# SELECT sysdate; sysdate --------------------- 2017-09-01 17:04:49 (1 row) current_sysdate 描述:返回当前本条SQL执行开始时刻的系统日期和时间。 返回值类型:timestamp 示例: 1 2 3 4 5 gaussdb=# SELECT current_sysdate(); current_sysdate --------------------- 2023-06-20 20:09:02 (1 row) timeofday() 描述:返回当前函数被调用时的系统时间的时间时间戳(像clock_timestamp,但是返回时为text)。 返回值类型:text 示例: 1 2 3 4 5 gaussdb=# SELECT timeofday(); timeofday ------------------------------------- Fri Sep 01 17:05:01.167506 2017 CST (1 row) transaction_timestamp() 描述:当前事务开始的系统的日期及时间。 返回值类型:timestamp with time zone 示例: 1 2 3 4 5 gaussdb=# SELECT transaction_timestamp(); transaction_timestamp ------------------------------- 2017-09-01 17:05:13.534454+08 (1 row) add_months(d,n) 描述:用于计算时间点d再加上n个月的时间。 d:timestamp类型的值,以及可以隐式转换为timestamp类型的值。 n:INTEGER类型的值,以及可以隐式转换为INTEGER类型的值。 返回值类型:timestamp 示例: 1 2 3 4 5 gaussdb=# SELECT add_months(to_date('2017-5-29', 'yyyy-mm-dd'), 11) FROM sys_dummy; add_months --------------------- 2018-04-29 00:00:00 (1 row) 此函数在ORA兼容模式数据库中且参数a_format_version值为10c和a_format_dev_version值为s1的情况下: 当计算结果大于公元9999年时会报错。 参数n若入参为小数则不会被四舍五入,而是被截断。 last_day(d) 描述:用于计算时间点d当月最后一天的时间。 返回值类型:timestamp 示例: 1 2 3 4 5 gaussdb=# SELECT last_day(to_date('2017-01-01', 'YYYY-MM-DD')) AS cal_result; cal_result --------------------- 2017-01-31 00:00:00 (1 row)
  • 时间日期操作符 时间日期操作符请参见表1。 要尽量避免在查询中使用 'now'::date、'now'::timestamp、'now'::timestamptz字符串常量强转以及text_date('now')的类似表达式来获取数据库当前时间或者将当前时间值作为函数入参场景,在这些场景下,优化器会提前算出常量时间,造成查询结果不正确。 gaussdb=# EXPLAIN SELECT * FROM t1 WHERE b='now'::date; QUERY PLAN ----------------------------------------------------- Seq Scan on t1 (cost=0.00..13.60 rows=1 width=310) Filter: ((b)::text = '2024-11-09 15:07:56'::text) (2 rows) gaussdb=# EXPLAIN SELECT * FROM t1 WHERE b=text_date('now'); QUERY PLAN ----------------------------------------------------- Seq Scan on t1 (cost=0.00..13.60 rows=1 width=310) Filter: ((b)::text = '2024-11-09'::text) (2 rows) 推荐使用now()、currenttimestamp()函数作为获取数据库当前时间的方法。 gaussdb=# EXPLAIN SELECT * FROM t1 WHERE b=now(); QUERY PLAN ----------------------------------------------------- Seq Scan on t1 (cost=0.00..14.80 rows=1 width=310) Filter: ((b)::text = (now())::text) (2 rows) gaussdb=# EXPLAIN SELECT * FROM t1 WHERE b=text_date(now()); QUERY PLAN ---------------------------------------------------------- Seq Scan on t1 (cost=0.00..16.00 rows=1 width=310) Filter: ((b)::text = (text_date((now())::text))::text) (2 rows) 用户在使用时间和日期操作符时,对应的操作数请使用明确的类型前缀修饰,以确保数据库在解析操作数的时候能够与用户预期一致,不会产生用户非预期的结果。 比如下面示例没有明确数据类型就会出现异常错误。 1 SELECT date '2001-10-01' - '7' AS RESULT;
  • 返回值 SQL_SUCCESS:表示调用正确。 SQL_SUCCESS_WITH_INFO:表示会有一些警告信息。 SQL_NEED_DATA:表示在执行SQL语句前没有提供足够的参数。 SQL_ERROR:表示比较严重的错误,如:内存分配失败、建立连接失败等。 SQL_NO_DATA:表示SQL语句不返回结果集。 SQL_INVALID_HANDLE:表示调用无效句柄。其他API的返回值同理。 SQL_STILL_EXECUTING:表示语句正在执行。
  • PG_TS_CONFIG PG_TS_CONFIG系统表包含表示文本搜索配置的记录。一个配置指定一个特定的文本搜索解析器和一个为了每个解析器的输出类型使用的字典的列表。 解析器在PG_TS_CONFIG记录中显示,但是字典映射的标记是由PG_TS_CONFIG_MAP里面的辅助记录定义的。 表1 PG_TS_CONFIG字段 名称 类型 引用 描述 oid oid - 行标识符(隐含字段,必须明确选择)。 cfgname name - 文本搜索配置名。 cfgnamespace oid PG_NAMESPACE.oid 包含这个配置的名称空间的OID。 cfgowner oid PG_AUTHID.oid 配置的所有者。 cfgparser oid PG_TS_PARSER.oid 这个配置的文本搜索解析器的OID。 cfoptions text[] - 分词相关配置选项。 父主题: 系统表
  • 示例 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 108 109 110 111 112 113 114 115 116 117 CREATE OR REPLACE PROCEDURE test_get_time1() AS declare start_time bigint; end_time bigint; BEGIN start_time:= dbe_utility.get_time (); pg_sleep(1); end_time:=dbe_utility.get_time (); dbe_output.print_line(end_time - start_time); END; / CREATE PROCEDURE -- 给表名字符串做规范 declare cname varchar2(50); begin dbe_utility.canonicalize('seg1', cname, 50); dbe_output.put_line(cname); end; / -- 预期结果为: SEG1 ANONYMOUS BLOCK EXECUTE -- 将输入的字符串转换成一个表名的数组 DECLARE tab_list VARCHAR2(100) := 't1,t2'; len BINARY_INTEGER; tab varchar2[]; BEGIN dbe_output.put_line('table list is :' || tab_list); dbe_utility.comma_to_table(tab_list, len, tab); END; / -- 预期结果为: table list is: t1,t2 ANONYMOUS BLOCK EXECUTE -- 查看数据库的版本号和兼容性版本号 declare v_version varchar2; begin dbe_utility.db_version(v_version); v_version:=left(v_version, 8); dbe_output.print_line('version:' || v_version); end; / -- 预期结果为: version:gaussdb ANONYMOUS BLOCK EXECUTE -- 查看当前CPU处理时间的测量值 DECLARE cputime NUMBER; BEGIN cputime := dbe_utility.get_cpu_time; dbe_output.put_line('cpu time:' || cputime); END; / -- 预期结果为(数值并非固定): cpu time:70179 ANONYMOUS BLOCK EXECUTE -- 获取数据库所在平台字节序的大小端信息 BEGIN dbe_output.PUT_LINE(dbe_utility.GET_ENDIANNESS); END; / -- 预期结果为: 2 ANONYMOUS BLOCK EXECUTE -- 获取一个给定字符串的hash值 DECLARE result NUMBER(28); BEGIN result := dbe_utility.get_hash_value('hello',10,10); dbe_output.put_line(result); END; / -- 预期结果为: 11 ANONYMOUS BLOCK EXECUTE -- 判断当前数据库是否为集群模式 DECLARE is_cluster BOOLEAN; BEGIN is_cluster := dbe_utility.IS_CLUSTER_DATABASE; dbe_output.put_line('CLUSTER DATABASE: ' || CASE WHEN is_cluster THEN 'TRUE' ELSE 'FALSE' END); END; / -- 预期结果为: CLUSTER DATABASE: TRUE ANONYMOUS BLOCK EXECUTE -- 获取当前用户环境下的数据库模式名称 DECLARE schm varchar2(100); BEGIN schm := dbe_utility.old_current_schema; dbe_output.put_line('current schema: ' || schm); END; / -- 预期结果为(结果为当前数据库的模式名,并非固定): current schema: public ANONYMOUS BLOCK EXECUTE -- 获取当前用户名称 select dbe_utility.old_current_user from sys_dummy; -- 预期结果为(结果为当前数据库的用户名,并非固定): old_current_user ------------------ test (1 row)
共100000条
提示

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