华为云用户手册

  • 对一级分区表清空分区 使用ALTER TABLE TRUNCATE PARTITION可以清空指定分区表的任何一个分区。 例如,通过指定分区名清空范围分区表range_sales的分区date_202005,并更新Global索引。 ALTER TABLE range_sales TRUNCATE PARTITION date_202005 UPDATE GLOBAL INDEX; 或者,通过指定分区值来清空范围分区表range_sales中'2020-05-08'所对应的分区。由于不带UPDATE GLOBAL INDEX子句,执行该命令后Global索引会失效。 ALTER TABLE range_sales TRUNCATE PARTITION FOR ('2020-05-08'); 父主题: 清空分区
  • 逻辑解码选项 通用选项: include-xids: 解码出的data列是否包含xid信息。 取值范围:0或1,默认值为1。 0:设为0时,解码出的data列不包含xid信息。 1:设为1时,解码出的data列包含xid信息。 skip-empty-xacts: 解码时是否忽略空事务信息。 取值范围:0或1,默认值为0。 0:设为0时,解码时不忽略空事务信息。 1:设为1时,解码时会忽略空事务信息。 include-timestamp: 解码信息是否包含commit时间戳。 取值范围:0或1,默认值为0。 0:设为0时,解码信息不包含commit时间戳。 1:设为1时,解码信息包含commit时间戳。 only-local: 是否仅解码本地日志。 取值范围:0或1,默认值为1。 0:设为0时,解码非本地日志和本地日志。 1:设为1时,仅解码本地日志。 force-binary: 是否以二进制格式输出解码结果。 取值范围:0,默认值为0。 0:设为0时,以文本格式输出解码结果。 white-table-list: 白名单参数,包含需要进行解码的schema和表名。 取值范围:包含白名单中表名的字符串,不同的表以','为分隔符进行隔离;使用'*'来模糊匹配所有情况;schema名和表名间以'.'分割,不允许存在任意空白符。例如: select * from pg_logical_slot_peek_changes('slot1', NULL, 4096, 'white-table-list', 'public.t1,public.t2,*.t3,my_schema.*'); max-txn-in-memory: 内存管控参数,单位为MB,单个事务占用内存大于该值即进行落盘。 取值范围:0~100的整型,默认值为0,即不开启此种管控。 max-reorderbuffer-in-memory 内存管控参数,单位为GB,拼接-发送线程中正在拼接的事务总内存(包含缓存)大于该值则对当前解码事务进行落盘。 取值范围:0~100的整型,默认值为0,即不开启此种管控。 include-user: 事务的BEGIN逻辑日志是否输出事务的用户名。事务的用户名特指授权用户——执行事务对应会话的登录用户,它在事务的整个执行过程中不会发生变化。 取值范围:0或1,默认值为0。 0:设为0时,事物的BEGIN逻辑日志不输出事务的用户名。 1:设为1时,事物的BEGIN逻辑日志输出事务的用户名。 exclude-userids: 黑名单用户的OID参数。 取值范围:字符串类型,指定黑名单用户的OID,多个OID通过','分隔,不校验用户OID是否存在。 exclude-users: 黑名单用户的名称列表。 取值范围:字符串类型,指定黑名单用户名,通过','分隔,不校验用户名是否存在。 dynamic-resolution: 是否动态解析黑名单用户名。 取值范围:0或1,默认值为1。 0:设为0时,当解码观测到黑名单exclude-users中用户不存在时将会报错并退出逻辑解码。 1:设为1时,当解码观测到黑名单exclude-users中用户不存在时继续解码。 standby-connection: 仅流式解码设置,是否仅限制备机解码。 取值范围:bool型,默认值为false。 true:设为true时,仅允许连接备机解码,连接主机解码时会报错退出。 false:设为false时,不做限制,允许连接主机或备机解码。 sender-timeout: 仅流式解码设置,内核与客户端的心跳超时阈值。当该时间段内没有收到客户端任何消息,逻辑解码将主动停止,并断开和客户端的连接。单位为毫秒(ms)。 取值范围:0~2147483647的int型,默认值取决于GUC参数logical_sender_timeout的配置值。 change-log-max-len: 逻辑日志长度上限参数。 取值范围:1~65535, 默认值为4096。 超过上限会销毁重新分配内存保存。过长会增加内存占用,过短会频繁触发内存申请和释放的操作。 max-decode-to-sender-cache-num: 发送解码日志的缓存阈值大小。 取值范围:1~65535,默认值为4096。 不超过这个阈值时暂时不发送,超过时才发送。减少频繁发送的负担。 enable-heartbeat: 仅流式解码设置,是否输出心跳日志。 取值范围:bool型,默认值为false。 true:设为true时,输出心跳日志。 false:设为false时,不输出心跳日志。 若开启心跳日志选项,此处说明心跳日志如何解析:二进制格式首先是字符'h'表示是消息是心跳日志,之后是心跳日志内容内容,分别是8字节uint64代表LSN,表示发送心跳逻辑日志时读取的WAL日志结束位置;8字节uint64代表LSN,表示发送心跳逻辑日志时刻已经落盘的WAL日志的位置;8字节int64代表时间戳(从1970年1月1日开始),表示最新解码到的事务日志或检查点日志的产生时间戳。关于消息结束符:如果是二进制格式则为字符'F',如果格式为text或者json且为批量发送则结束符为0,否则没有结束符。具体解析见下图: parallel-decode-num: 仅流式解码设置有效,并行解码的Decoder线程数量;系统函数调用场景下此选项无效,仅校验取值范围。 取值范围:取1表示按照原有的串行逻辑进行解码,取其余值即为开启并行解码,默认值为1。 当parallel-decode-num不配置(即为默认值1)或显式配置为1时,下述“并行解码”中的选项不可配置。 output-order: 仅流式解码设置有效,是否使用CSN顺序输出解码结果;系统函数调用场景下此选项无效,仅校验取值范围。 取值范围:0或1的int型,默认值为0。 0:设为0时,解码结果按照事务的COMMIT LSN排序,当且仅当解码复制槽的confirmed_csn列值为0(即不显示)时可使用该方式,否则报错。 1:设为1时,解码结果按照事务的CSN排序, 当且仅当解码复制槽的confirmed_csn列值为非零值时可使用该方式,否则报错。 auto-advance: 仅流式解码设置有效,是否允许自主推进逻辑复制槽。 取值范围:boolean型,默认值为false。 true:设为true时,在已发送日志都被确认推进且没有待发送事务时,推进逻辑复制槽到当前解码位置。 false:设为false时,完全交由复制业务调用日志确认接口推进逻辑复制槽。 skip-generated-columns: 逻辑解码控制参数,用于跳过生成列的输出。对UPDATE和DELETE的旧元组无效,相应元组始终会输出生成列。 取值范围:boolean型,默认值为false。 true:值为true时,不输出生成列的解码结果。 false:设为false时,输出生成列的解码结果。 并行解码: 以下配置选项仅限流式解码设置。 decode-style: 指定解码格式。 取值范围:char型的字符'j'、't'或'b',分别代表json格式,text格式及二进制格式。默认值为'b'即二进制格式解码。 对于json格式和text格式解码,开启批量发送选项时的解码结果中,每条解码语句的前4字节组成的uint32代表该条语句总字节数(不包含该uint32类型占用的4字节,0代表本批次解码结束),8字节uint64代表相应lsn(begin对应first_lsn,commit对应end_lsn,其他场景对应该条语句的lsn)。 二进制格式编码规则如下所示: 前4字节代表接下来到语句级别分隔符字母P(不含)或者该批次结束符F(不含)的解码结果的总字节数,该值如果为0代表本批次解码结束。 接下来8字节uint64代表相应lsn(begin对应first_lsn,commit对应end_lsn,其他场景对应该条语句的lsn)。 接下来1字节的字母有5种B/C/I/U/D,分别代表begin/commit/insert/update/delete。 第3步字母为B时。 接下来的8字节uint64代表CSN。 接下来的8字节uint64代表first_lsn。 【该部分为可选项】接下来的1字节字母如果为T,则代表后面4字节uint32表示该事务commit时间戳长度,再后面等同于该长度的字符为时间戳字符串。 【该部分为可选项】接下来的1字节字母如果为N,则代表后面4字节uint32表示该事务用户名的长度,再后面等同于该长度的字符为事务的用户名字。 因为之后仍可能有解码语句,接下来会有1字节字母P或F作为语句间的分隔符,P代表本批次仍有解码的语句,F代表本批次完成。 第3步字母为C时: 【该部分为可选项】接下来1字节字母如果为X,则代表后面的8字节uint64表示xid。 【该部分为可选项】接下来的1字节字母如果为T,则代表后面4字节uint32表示时间戳长度,再后面等同于该长度的字符为时间戳字符串。 因为批量发送日志时,一个COMMIT日志解码之后可能仍有其他事务的解码结果,接下来的1字节字母如果为P则表示该批次仍需解码,如果为F则表示该批次解码结束。 第3步字母为I/U/D时: 接下来的2字节uint16代表schema名的长度。 按照上述长度读取schema名。 接下来的2字节uint16代表table名的长度。 按照上述长度读取table名。 【该部分为可选项】接下来1字符字母如果为N代表为新元组,如果为O代表为旧元组,这里先发送新元组。 接下来的2字节uint16代表该元组需要解码的列数,记为attrnum。 以下流程重复attrnum次。 接下来2字节uint16代表列名的长度。 按照上述长度读取列名。 接下来4字节uint32代表当前列类型的Oid。 接下来4字节uint32代表当前列的值(以字符串格式存储)的长度,如果为0xFFFFFFFF则表示NULL,如果为0则表示长度为0的字符串。 按照上述长度读取列值。 因为之后仍可能有解码语句,接下来的1字节字母如果为P则表示该批次仍需解码,如果为F则表示该批次解码结束。 sending-batch: 指定是否批量发送。 取值范围:0或1的int型,默认值为0。 0:设为0时,表示逐条发送解码结果。 1:设为1时,表示解码结果累积到达1MB则批量发送解码结果。 开启批量发送的场景中,当解码格式为'j'或't'时,在原来的每条解码语句之前会附加一个uint32类型,表示本条解码结果长度(长度不包含当前的uint32类型),以及一个uint64类型,表示当前解码结果对应的lsn。 在使用CSN顺序输出解码结果的场景下,批量发送仅限于单个事务内(即如果一个事务有多条较小的语句会采用批量发送),不会使用批量发送功能在同一批次里发送多个事务。 parallel-queue-size: 指定并行逻辑解码线程间进行交互的队列长度。 取值范围:2~1024的int型,且必须为2的整数幂,默认值为128。 队列长度和解码过程的内存使用量正相关。 logical-reader-bind-cpu: reader 线程绑定cpu核号的参数。 取值范围:-1~65535,不使用该参数则为不绑核。 默认-1,为不绑核。-1不可手动设置,核号应确保在机器总逻辑核数以内,不然会返回报错。多个线程绑定同一个核会导致该核负担加重,从而导致性能下降。 logical-decoder-bind-cpu-index: 逻辑解码线程绑定cpu核号的参数。 取值范围: -1~65535,不使用该参数则为不绑核。 默认 -1,不绑核。-1不可手动设置,核号应确保在机器总逻辑核数以内且小于 [cpu核数 - 并行逻辑解码数],不然会返回报错。 从给定的核号参数开始,新拉起的线程会依次递增加一。 多个线程绑定同一个核会导致该核负担加重,从而导致性能下降。 GaussDB在进行逻辑解码和日志回放时,会占用大量的CPU资源,相关线程如Walwriter、WalSender、WALreceiver、pageredo就处于性能瓶颈,如果能将这些线程运行绑定在固定的CPU上运行,可以减少因操作系统调度线程频繁切换CPU,导致缓存未命中带来的性能开销,从而提高流程处理速度,如用户场景有性能需求,可根据以下的绑核样例进行配置优化。 参数样例: walwriter_cpu_bind=1 walwriteraux_bind_cpu=2 wal_receiver_bind_cpu=4 wal_rec_writer_bind_cpu=5 wal_sender_bind_cpu_attr='cpuorderbind:7-14' redo_bind_cpu_attr='cpuorderbind:16-19' logical-reader-bind-cpu=20 logical-decoder-bind-cpu-index=21 样例中1.2.3.4.5.6通过GUC工具设置,使用指令如 gs_guc set -Z datanode -N all -I all -c “walwriter_cpu_bind=1”。 样例中7.8通过JDBC客户端发起解码请求时添加。 样例中如walwriter_cpu_bind=1是限定该线程在1号CPU上运行。 cpuorderbind:7-14意为拉起的每个线程依次绑定7号到14号CPU,如果范围内的CPU用完,则新拉起的线程不参与绑核。 logical-decoder-bind-cpu-index意为拉起的线程从21号CPU依次开始绑定,后续拉起的线程分别绑定21、22、23,依次类推。 绑核的原则是一个线程占用一个CPU,样例中的GUC参数说明可参考管理员指南。 不恰当的绑核,例如将多个线程绑定在一个CPU上很有可能带来性能劣化。 可以通过lscpu指令查看“CPU(s):”得知自己环境的CPU逻辑核心数。 CPU逻辑核心数低于36则不建议使用此套绑核策略,此时建议使用默认配置(不进行参数设置)。 父主题: 逻辑解码
  • 存储规格 数据表最大列数不能超过1600列。 Ustore表(不含toast情况)最大Tuple长度不能超过(8192 - MAXALIGN(56 + init_td * 26 + 4)), 其中MAXALIGN表示8字节对齐。当插入数据长度超过阈值时,用户会收到元组长度过长无法插入的报错。其中init_td对于Tuple长度的影响如下: 表init_td数量为最小值2时,Tuple长度不能超过8192 - MAXALIGN(56+2*26+4) = 8080B。 表init_td数量为默认值4时,Tuple长度不能超过8192 - MAXALIGN(56+4*26+4) = 8024B。 表init_td数量为最大值128时,Tuple长度不能超过8192 - MAXALIGN(56+128*26+4) = 4800B。 init_td取值范围[2, 128],默认值4。单页面支持的最大并发不超过128个。 索引最大列数不能超过32列。全局分区索引最大列数不能超过31列。 索引元组长度不能超过(8192 - MAXALIGN(28 + 3 * 4 + 3 * 10) - MAXALIGN(42))/3, 其中MAXALIGN表示8字节对齐。当插入数据长度超过阈值时,用户会收到索引元组长度过长无法插入的报错,其中索引页头为28B,行指针为4B,元组CTID+INFO标记位为10B,页尾为42B。 回滚段容量最大支持16TB。 父主题: Ustore特性与规格
  • 示例 创建表 gaussdb=# CREATE TABLE web_returns_p2 ( ca_address_sk INTEGER NOT NULL , ca_address_id CHARACTER(16) NOT NULL , ca_street_number CHARACTER(10) , ca_street_name CHARACTER VARYING(60) , ca_street_type CHARACTER(15) , ca_suite_number CHARACTER(10) , ca_city CHARACTER VARYING(60) , ca_county CHARACTER VARYING(30) , ca_state CHARACTER(2) , ca_zip CHARACTER(10) , ca_country CHARACTER VARYING(20) , ca_gmt_offset NUMERIC(5,2) , ca_location_type CHARACTER(20) ) PARTITION BY RANGE (ca_address_sk) ( PARTITION P1 VALUES LESS THAN(5000), PARTITION P2 VALUES LESS THAN(10000), PARTITION P3 VALUES LESS THAN(15000), PARTITION P4 VALUES LESS THAN(20000), PARTITION P5 VALUES LESS THAN(25000), PARTITION P6 VALUES LESS THAN(30000), PARTITION P7 VALUES LESS THAN(40000), PARTITION P8 VALUES LESS THAN(MAXVALUE) ) ENABLE ROW MOVEMENT; 创建索引 创建分区表LOCAL索引tpcds_web_returns_p2_index1,不指定索引分区的名称。 gaussdb=# CREATE INDEX tpcds_web_returns_p2_index1 ON web_returns_p2 (ca_address_id) LOCAL; 当结果显示为如下信息,则表示创建成功。 CREATE INDEX 创建分区表LOCAL索引tpcds_web_returns_p2_index2,并指定索引分区的名称。 gaussdb=# CREATE TABLESPACE example2 LOCATION '/home/omm/example2'; gaussdb=# CREATE TABLESPACE example3 LOCATION '/home/omm/example3'; gaussdb=# CREATE TABLESPACE example4 LOCATION '/home/omm/example4'; gaussdb=# CREATE INDEX tpcds_web_returns_p2_index2 ON web_returns_p2 (ca_address_sk) LOCAL ( PARTITION web_returns_p2_P1_index, PARTITION web_returns_p2_P2_index TABLESPACE example3, PARTITION web_returns_p2_P3_index TABLESPACE example4, PARTITION web_returns_p2_P4_index, PARTITION web_returns_p2_P5_index, PARTITION web_returns_p2_P6_index, PARTITION web_returns_p2_P7_index, PARTITION web_returns_p2_P8_index ) TABLESPACE example2; 当结果显示为如下信息,则表示创建成功。 CREATE INDEX 创建分区表GLOBAL索引tpcds_web_returns_p2_global_index。 gaussdb=# CREATE INDEX tpcds_web_returns_p2_global_index ON web_returns_p2 (ca_street_number) GLOBAL; 当结果显示为如下信息,则表示创建成功。 CREATE INDEX 修改索引分区的表空间 修改索引分区web_returns_p2_P2_index的表空间为example1。 gaussdb=# ALTER INDEX tpcds_web_returns_p2_index2 MOVE PARTITION web_returns_p2_P2_index TABLESPACE example1; 当结果显示为如下信息,则表示修改成功。 ALTER INDEX –修改索引分区web_returns_p2_P3_index的表空间为example2。 gaussdb=# ALTER INDEX tpcds_web_returns_p2_index2 MOVE PARTITION web_returns_p2_P3_index TABLESPACE example2; 当结果显示为如下信息,则表示修改成功。 ALTER INDEX 重命名索引分区 执行如下命令对索引分区web_returns_p2_P8_index重命名web_returns_p2_P8_index_new。 gaussdb=# ALTER INDEX tpcds_web_returns_p2_index2 RENAME PARTITION web_returns_p2_P8_index TO web_returns_p2_P8_index_new; 当结果显示为如下信息,则表示重命名成功。 ALTER INDEX 查询索引 执行如下命令查询系统和用户定义的所有索引。 gaussdb=# SELECT RELNAME FROM PG_CLASS WHERE RELKIND='i' or RELKIND='I'; 执行如下命令查询指定索引的信息。 gaussdb=# \di+ tpcds_web_returns_p2_index2 删除索引 gaussdb=# DROP INDEX tpcds_web_returns_p2_index1; 当结果显示为如下信息,则表示删除成功。 DROP INDEX 清理以上示例 --清理示例 gaussdb=# DROP TABLE web_returns_p2;
  • 间隔分区 间隔分区(Interval Partition)可以看成是范围分区的一种增强和扩展方式,相比之下间隔分区定义分区时无需为新增的每个分区指定上限和下限值,只需要确定每个分区的长度,实际插入的过程中会自动进行分区的创建和扩展。间隔分区在创建初始时必须至少指定一个范围分区,范围分区键值确定范围分区的高值称为转换点,数据库为值超出该转换点的数据自动创建间隔分区。每个区间分区的下边界是先前范围或区间分区的非包容性上边界。示例如下: gaussdb=# CREATE TABLE interval_sales ( prod_id NUMBER(6), cust_id NUMBER, time_id DATE, channel_id CHAR(1), promo_id NUMBER(6), quantity_sold NUMBER(3), amount_sold NUMBER(10, 2) ) PARTITION BY RANGE (time_id) INTERVAL ('1 month') ( PARTITION date_2015 VALUES LESS THAN ('2016-01-01'), PARTITION date_2016 VALUES LESS THAN ('2017-01-01'), PARTITION date_2017 VALUES LESS THAN ('2018-01-01'), PARTITION date_2018 VALUES LESS THAN ('2019-01-01'), PARTITION date_2019 VALUES LESS THAN ('2020-01-01') ); --清理示例 gaussdb=# DROP TABLE interval_sales; 上述例子中,初始创建分区以2015年到2019年以年为单位创建分区,当数据插入到2020-01-01以后的数据时,由于超过的预先定义Range分区的上边界,会自动创建一个分区。 间隔分区仅支持日期和时间类型,如Date、Time、Timestamp。 父主题: 分区策略
  • Ustore事务模型 GaussDB Kernel事务基础: 事务启动时不会自动分配XID,该事务中的第一条DML/DDL语句运行时才会真正为该事务分配XID。 事务结束时,会产生代表事务提交状态的CLOG(Commit Log),CLOG共有四种状态:事务运行中、事务提交、事务同步回滚、子事务提交。每个事务的 CLOG状态位为2 bits,CLOG页面上每个字节可以表示四个事务的提交状态。 事务结束时,还会产生代表事务提交顺序的CSN(Commit sequence number),CSN为实例级变量,每个XID都有自己对应的唯一CSN。CSN可以标记事务的以下状态:事务运行中、事务提交、事务同步回滚、事务正在提交、本事务为子事务、事务已冻结。 事务提交 事务回滚 父主题: Ustore存储引擎
  • 分区(分区子表、子分区) 分区表中实际保存数据的表,对应的entry通常保存在pg_partition中,各个子分区的parentid作为外键关联其分区母表在pg_class表中的oid列。 示例1:t1_hash为一个一级分区表: gaussdb=# CREATE TABLE t1_hash (c1 INT, c2 INT, c3 INT) PARTITION BY HASH(c1) ( PARTITION p0, PARTITION p1, PARTITION p2, PARTITION p3, PARTITION p4, PARTITION p5, PARTITION p6, PARTITION p7, PARTITION p8, PARTITION p9 ); --查询t1_hash分区类型 gaussdb=# SELECT oid, relname, parttype FROM pg_class WHERE relname = 't1_hash'; oid | relname | parttype -------+---------+---------- 16685 | t1_hash | p (1 row) --查询t1_hash的分区信息 gaussdb=# SELECT oid, relname, parttype, parentid FROM pg_partition WHERE parentid = 16685; oid | relname | parttype | parentid -------+---------+----------+---------- 16688 | t1_hash | r | 16685 16689 | p0 | p | 16685 16690 | p1 | p | 16685 16691 | p2 | p | 16685 16692 | p3 | p | 16685 16693 | p4 | p | 16685 16694 | p5 | p | 16685 16695 | p6 | p | 16685 16696 | p7 | p | 16685 16697 | p8 | p | 16685 16698 | p9 | p | 16685 (11 rows) --删除t1_hash,清理示例 gaussdb=# DROP TABLE t1_hash; 父主题: 基本概念
  • 执行加密表的预编译SQL语句 // 调用Connection的prepareStatement方法创建预编译语句对象。 PreparedStatement pstmt = con.prepareStatement("INSERT INTO creditcard_info VALUES (?, ?, ?);"); // 调用PreparedStatement的setShort设置参数。 pstmt.setInt(1, 2); pstmt.setString(2, "joy"); pstmt.setString(3, "6219985678349800033"); // 调用PreparedStatement的executeUpdate方法执行预编译SQL语句。 int rowcount = pstmt.executeUpdate(); // 调用PreparedStatement的close方法关闭预编译语句对象。 pstmt.close();
  • 执行密态等值密文解密 数据库连接接口PgConnection类型新增解密接口,可以对全密态数据库的密态等值密文进行解密。解密后返回其明文值,通过schema.table.column找到密文对应的加密列并返回其原始数据类型。 表1 新增org.postgresql.jdbc.PgConnection函数接口 方法名 返回值类型 支持JDBC 4 decryptData(String ciphertext, Integer len, String schema, String table, String column) ClientLogicDecryptResult Yes 参数说明: ciphertext 需要解密的密文。 len 密文长度。当取值小于实际密文长度时,解密失败。 schema 加密列所属schema名称。 table 加密列所属table名称。 column 加密列所属column名称。 下列场景可以解密成功,但不推荐: 密文长度入参比实际密文长。 schema.table.column指向其他加密列。此时将返回被指向的加密列的原始数据类型。 表2 新增org.postgresql.jdbc.clientlogic.ClientLogicDecryptResult函数接口 方法名 返回值类型 描述 支持JDBC4 isFailed() Boolean 解密是否失败,若失败返回True,否则返回False。 Yes getErrMsg() String 获取错误信息。 Yes getPlaintext() String 获取解密后的明文。 Yes getPlaintextSize() Integer 获取解密后的明文长度。 Yes getOriginalType() String 获取加密列的原始数据类型。 Yes // 通过非密态连接、逻辑解码等其他方式获得密文后,可使用该接口对密文进行解密 import org.postgresql.jdbc.PgConnection; import org.postgresql.jdbc.clientlogic.ClientLogicDecryptResult; // conn为密态连接 // 调用密态PgConnection的decryptData方法对密文进行解密,通过列名称定位到该密文的所属加密列,并返回其原始数据类型 ClientLogicDecryptResult decrypt_res = null; decrypt_res = ((PgConnection)conn).decryptData(ciphertext, ciphertext.length(), schemaname_str, tablename_str, colname_str); // 检查返回结果类解密成功与否,失败可获取报错信息,成功可获得明文及长度和原始数据类型 if (decrypt_res.isFailed()) { System.out.println(String.format("%s\n", decrypt_res.getErrMsg())); } else { System.out.println(String.format("decrypted plaintext: %s size: %d type: %s\n", decrypt_res.getPlaintext(), decrypt_res.getPlaintextSize(), decrypt_res.getOriginalType())); }
  • 调用isValid方法刷新缓存示例 // 创建连接conn1 Connection conn1 = DriverManager.getConnection("url","user","password"); // 在另外一个连接conn2中创建客户端主密钥 ... // conn1通过调用isValid刷新缓存 try { if (!conn1.isValid(60)) { System.out.println("isValid Failed for connection 1"); } } catch (SQLException e) { e.printStackTrace(); return null; }
  • 清空分区 用户可以使用清空分区的命令来快速清空分区的数据。与删除分区功能类似,区别在于清空分区只会删除分区中的数据,分区的定义和物理文件都会保留。清空分区可以通过指定分区名或者分区值来进行。 执行清空分区命令会使得Global索引失效,可以通过UPDATE GLOBAL INDEX子句来同步更新Global索引,或者用户自行重建Global索引。 对一级分区表清空分区 对二级分区表清空一级分区 对二级分区表清空二级分区 父主题: 分区表运维管理
  • 示例 --准备数据。 gaussdb=# CREATE TABLE t1(c1 int, c2 int); gaussdb=# INSERT INTO t1 VALUES(1, 1); gaussdb=# INSERT INTO t1 VALUES(2, 2); --创建全量物化视图。 gaussdb=# CREATE MATERIALIZED VIEW mv AS select count(*) from t1; CREATE MATERIALIZED VIEW --查询物化视图结果。 gaussdb=# SELECT * FROM mv; count ------- 2 (1 row) --向物化视图中基表插入数据。 gaussdb=# INSERT INTO t1 VALUES(3, 3); INSERT 0 1 --对全量物化视图做全量刷新。 gaussdb=# REFRESH MATERIALIZED VIEW mv; REFRESH MATERIALIZED VIEW --查询物化视图结果。 gaussdb=# SELECT * FROM mv; count ------- 3 (1 row) --删除物化视图。 gaussdb=# DROP MATERIALIZED VIEW mv; DROP MATERIALIZED VIEW
  • 语法格式 创建全量物化视图 CREATE MATERIALIZED VIEW [ view_name ] AS { query_block }; 刷新全量物化视图 REFRESH MATERIALIZED VIEW [ view_name ]; 删除物化视图 DROP MATERIALIZED VIEW [ view_name ]; 查询物化视图 SELECT * FROM [ view_name ];
  • 对间隔分区表分割分区 对间隔分区表分割分区的命令与范围分区表相同。 对间隔分区表的间隔分区完成分割分区操作之后,源分区之前的间隔分区会变成范围分区。 例如,创建如下间隔分区表,并插入数据新增三个分区sys_p1、sys_p2、sys_p3。 CREATE TABLE interval_sales ( prod_id NUMBER(6), cust_id NUMBER, time_id DATE, channel_id CHAR(1), promo_id NUMBER(6), quantity_sold NUMBER(3), amount_sold NUMBER(10, 2) ) PARTITION BY RANGE (TIME_ID) INTERVAL ('1 MONTH') ( PARTITION date_2015 VALUES LESS THAN ('2016-01-01'), PARTITION date_2016 VALUES LESS THAN ('2017-01-01'), PARTITION date_2017 VALUES LESS THAN ('2018-01-01'), PARTITION date_2018 VALUES LESS THAN ('2019-01-01'), PARTITION date_2019 VALUES LESS THAN ('2020-01-01') ); INSERT INTO interval_sales VALUES (263722,42819872,'2020-07-09','E',432072,213,17); --新增分区sys_p1 INSERT INTO interval_sales VALUES (345724,72651233,'2021-03-05','A',352451,146,9); --新增分区sys_p2 INSERT INTO interval_sales VALUES (153241,65143129,'2021-05-07','H',864134,89,34); --新增分区sys_p3 如果对分区sys_p2进行分割,则会将分区sys_p1变为范围分区,分区范围下界值从依赖间隔分区值变成依赖前一个分区的上界值,也就是分区范围从['2020-07-01', '2020-08-01')变成['2020-01-01', '2020-08-01');分区sys_p3依然为间隔分区,其分区范围为['2021-05-01', '2021-06-01')。 父主题: 分割分区
  • 统计信息收集 Ustore的无效元组清理依赖于统计信息的准确性,关闭参数track_counts以及track_activities会造成空间膨胀,默认开启,请保持开启。性能场景除外。 打开: gs_guc reload -Z datanode -N all -I all -c "track_counts=on;" gs_guc reload -Z datanode -N all -I all -c "track_activities=on;" 关闭: gs_guc reload -Z datanode -N all -I all -c "track_counts=off;" gs_guc reload -Z datanode -N all -I all -c "track_activities=off;" 父主题: Ustore的最佳实践
  • 分区表索引重建/不可用 用户可以通过命令使得一个分区表索引或者一个索引分区不可用,此时该索引/索引分区不再维护;使用重建索引命令可以重建分区表索引,恢复索引的正常功能。 此外,部分分区级DDL操作也会使得Global索引失效,包括删除drop、交换exchange、清空truncate、分割split、合并merge,如果在DDL操作中带UPDATE GLOBAL INDEX子句,则会同步更新Global索引,否则需要用户自行重建索引。 索引重建/不可用 Local索引分区重建/不可用 父主题: 分区表运维管理
  • 使用示例 gaussdb=# drop TABLE IF EXISTS "public".flashtest; NOTICE: table "flashtest" does not exist, skipping DROP TABLE --创建表flashtest gaussdb=# CREATE TABLE "public".flashtest (col1 INT,col2 TEXT) with(storage_type=ustore); CREATE TABLE --查询csn gaussdb=# select int8in(xidout(next_csn)) from gs_get_next_xid_csn(); int8in ---------- 79352065 (1 rows) --查询当前时间戳 gaussdb=# select now(); now ------------------------------- 2023-09-13 19:46:34.102863+08 (1 row) gaussdb=# SELECT * FROM flashtest; col1 | col2 ------+------ (0 rows) --插入数据 gaussdb=# INSERT INTO flashtest VALUES(1,'INSERT1'),(2,'INSERT2'),(3,'INSERT3'),(4,'INSERT4'),(5,'INSERT5'),(6,'INSERT6'); INSERT 0 6 gaussdb=# SELECT * FROM flashtest; col1 | col2 ------+--------- 3 | INSERT3 6 | INSERT6 1 | INSERT1 2 | INSERT2 4 | INSERT4 5 | INSERT5 (6 rows) --闪回表至特定的时间戳 gaussdb=# TIMECAPSULE TABLE flashtest TO TIMESTAMP to_timestamp ('2023-09-13 19:52:21.551028', 'YYYY-MM-DD HH24:MI:SS.FF'); TimeCapsule Table gaussdb=# SELECT * FROM flashtest; col1 | col2 ------+------ (0 rows) gaussdb=# select now(); now ------------------------------- 2023-09-13 19:54:00.641506+08 (1 row) --插入数据 gaussdb=# INSERT INTO flashtest VALUES(1,'INSERT1'),(2,'INSERT2'),(3,'INSERT3'),(4,'INSERT4'),(5,'INSERT5'),(6,'INSERT6'); INSERT 0 6 gaussdb=# SELECT * FROM flashtest; col1 | col2 ------+--------- 3 | INSERT3 6 | INSERT6 1 | INSERT1 2 | INSERT2 4 | INSERT4 5 | INSERT5 (6 rows) --闪回表至特定的时间戳 gaussdb=# TIMECAPSULE TABLE flashtest TO TIMESTAMP '2023-09-13 19:54:00.641506'; TimeCapsule Table gaussdb=# SELECT * FROM flashtest; col1 | col2 ------+------ (0 rows) gaussdb=# drop TABLE IF EXISTS "public".flashtest; DROP TABLE
  • 事务回滚 回滚是在事务运行的过程中发生了故障等异常情形下,事务不能继续执行,系统需要将事务中已完成的修改操作进行撤销。Astore、UB-tree没有回滚段,自然没有这个专门的回滚动作。Ustore为了性能考虑,它的回滚流程结合了同步、异步与页内即时回滚3种形式。 同步回滚。 有三种情况会触发事务的同步回滚: 事务块中的ROLLBACK关键字会触发同步回滚。 事务运行过程中如果发生ERROR级别报错,此时的COMMIT关键字与ROLLBACK功能相同,也会触发同步回滚。 事务运行过程中如果发生FATAL/PANIC级别报错,在线程退出前会尝试将该线程绑定的事务进行一次同步回滚。 异步回滚。同步回滚失败或者在系统宕机后再次重启时,会由Undo回收线程为未回滚完成的事务发起异步回滚任务,立即对外提供服务。由异步回滚任务发起线程undo launch负责拉起异步回滚工作线程undo worker,再由异步回滚工作线程实际执行回滚任务。undo launch线程最多可以同时拉起5个undo worker线程。 页面级回滚。当事务需要回滚但还未回滚到本页面时,如果其他事务需要复用该事务所占用的TD,就会在复用前对该事务在本页面的所有修改执行页面级回滚。页面级回滚只负责回滚事务在本页面的修改,不涉及其他页面。 Ustore子事务的回滚由ROLLBACK TO SAVEPOINT语句控制,子事务回滚后父事务可以继续运行,子事务的回滚不影响父事务的事务状态。如果一个事务在回滚时还存在未释放的子事务,该事务回滚前会先执行子事务的回滚,所有子事务回滚完毕后才会进行父事务的回滚。 父主题: Ustore事务模型
  • 常规锁设计 分区表通过表锁+分区锁两重设计,在表和分区上分别施加8个不同级别的常规锁,来保证DQL、DML、DDL并发过程中的合理行为控制。下表给出了不同级别锁的互斥行为,标记为√的两种常规锁互不阻塞,可以并行。 表1 常规锁行为 - ACCESS_SHARE ROW_SHARE ROW_EXCLUSIVE SHARE_UPDATE_EXCLUSIVE SHARE SHARE_ROW_EXCLUSIVE EXCLUSIVE ACCESS_EXCLUSIVE ACCESS_SHARE √ √ √ √ √ √ √ × ROW_SHARE √ √ √ √ √ √ × × ROW_EXCLUSIVE √ √ √ √ × × × × SHARE_UPDATE_EXCLUSIVE √ √ √ × × × × × SHARE √ √ × × √ × × × SHARE_ROW_EXCLUSIVE √ √ × × × × × × EXCLUSIVE √ × × × × × × × ACCESS_EXCLUSIVE × × × × × × × × 分区表的不同业务最终都是作用于目标分区上,数据库会给分区表和目标分区施加不同级别的表锁+分区锁,来控制并发行为。下表给出了不同业务的锁粒度控制。其中数字1~8代表上表给出的8种级别常规锁。 表2 分区表业务锁粒度 业务模型 一级分区表锁级别(表锁+分区锁) 二级分区表锁级别(表锁+一级分区锁+二级分区锁) SELECT 1-1 1-1-1 SELECT FOR UPDATE 2-2 2-2-2 DML业务,包括INSERT、UPDATE、DELETE、UPSERT、MERGE INTO、COPY 3-3 3-3-3 分区DDL,包括ADD、DROP、EXCHANGE、TRUNCATE、SPLIT、MERGE、MOVE、RENAME 4-8 4-8-8(作用二级分区表的一级分区) 4-4-8 (作用二级分区表的二级分区) CREATE INDEX、REBUILD INDEX 5-5 5-5-5 REBUILD INDEX PARTITION 1-5 1-1-5 其他分区表DDL 8-8 8-8-8 父主题: 分区并发控制
  • 对*-RANGE二级分区表分割二级分区 使用ALTER TABLE SPLIT SUBPARTITION可以对*-RANGE二级分区表分割二级分区。 例如,假设*-RANGE二级分区表list_range_sales的二级分区channel1_customer4的定义范围为[1000, MAXVALUE)。可以指定分割点1200将二级分区channel1_customer4分割为两个分区,并更新Global索引。 ALTER TABLE list_range_sales SPLIT SUBPARTITION channel1_customer4 AT (1200) INTO ( SUBPARTITION channel1_customer4_p1, --第一个分区上界是1200 SUBPARTITION channel1_customer4_p2 --第二个分区上界是MAXVALUE ) UPDATE GLOBAL INDEX; 或者,不指定分割点,将分区channel1_customer4分割为多个分区,并更新Global索引。 ALTER TABLE list_range_sales SPLIT SUBPARTITION channel1_customer4 INTO ( SUBPARTITION channel1_customer4_p1 VALUES LESS THAN (1200), SUBPARTITION channel1_customer4_p2 VALUES LESS THAN (1400), SUBPARTITION channel1_customer4_p3 --第三个分区上界是MAXVALUE )UPDATE GLOBAL INDEX; 又或者,通过指定分区值而不是指定分区名来分割分区。 ALTER TABLE range_sales SPLIT SUBPARTITION FOR ('1', 1200) AT (1200) INTO ( PARTITION channel1_customer4_p1, PARTITION channel1_customer4_p2 ) UPDATE GLOBAL INDEX; 若对MAXVALUE分区进行分割,前面几个分区不能申明MAXVALUE范围,最后一个分区会继承MAXVALUE分区范围。 父主题: 分割分区
  • 操作步骤 以具有REPLICATION权限的用户登录GaussDB数据库主节点。 使用如下命令通过连接数据库。 gsql -U user1 -d gaussdb -p 16000 -r 其中,user1为用户名,gaussdb为需要连接的数据库名称,16000为数据库端口号,用户可根据实际情况替换。 创建名称为slot1的逻辑复制槽。 1 2 3 4 5 gaussdb=# SELECT * FROM pg_create_logical_replication_slot('slot1', 'mppdb_decoding'); slotname | xlog_position ----------+--------------- slot1 | 0/601C150 (1 row) 在数据库中创建表t,并向表t中插入数据。 1 2 gaussdb=# CREATE TABLE t(a int PRIMARY KEY, b int); gaussdb=# INSERT INTO t VALUES(3,3); 读取复制槽slot1解码结果,解码条数为4096。 逻辑解码选项可参考逻辑解码选项。 1 2 3 4 5 6 7 8 9 10 gaussdb=# SELECT * FROM pg_logical_slot_peek_changes('slot1', NULL, 4096); location | xid | data -----------+-------+------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------- 0/601C188 | 1010023 | BEGIN 1010023 0/601ED60 | 1010023 | COMMIT 1010023 CSN 1010022 0/601ED60 | 1010024 | BEGIN 1010024 0/601ED60 | 1010024 | {"table_name":"public.t","op_type":"INSERT","columns_name":["a","b"],"columns_type":["integer","integer"],"columns_val":["3","3"],"old_keys_name":[],"old_keys_type":[],"old_keys_val":[]} 0/601EED8 | 1010024 | COMMIT 1010024 CSN 1010023 (5 rows) 删除逻辑复制槽slot1。 1 2 3 4 5 gaussdb=# SELECT * FROM pg_drop_replication_slot('slot1'); pg_drop_replication_slot -------------------------- (1 row)
  • 常用视图工具 视图类型 类型 功能描述 使用场景 函数名称 解析 全类型 用于解析指定表页面,并返回存放解析内容的路径。 查看页面信息。 查看元组(非用户数据)信息。 页面或者元组损坏。 元组可见性问题。 校验报错问题。 gs_parse_page_bypath 索引回收队列(URQ) 用于解析UB-tree索引回收队列关键信息。 UB-tree索引空间膨胀。 UB-tree索引空间回收异常。 校验报错问题。 gs_urq_dump_stat 回滚段(Undo) 用于解析指定Undo Record的内容,不包含旧版本元组的数据。 undo空间膨胀。 undo回收异常。 回滚异常。 日常巡检。 校验报错。 可见性判断异常。 修改参数。 gs_undo_dump_record 用于解析指定事务生成的所有Undo Record,不包含旧版本元组的数据。 gs_undo_dump_xid 用于解析指定UndoZone中所有Transaction Slot信息。 gs_undo_translot_dump_slot 用于解析指定事务对应Transaction Slot信息,包括事务XID和该事务生成的Undo Record范围. gs_undo_translot_dump_xid 用于解析指定Undo Zone的元信息,显示Undo Record和Transaction Slot指针使用情况。 gs_undo_meta_dump_zone 用于解析指定Undo Zone对应Undo Space的元信息,显示Undo Record文件使用情况。 gs_undo_meta_dump_spaces 用于解析指定Undo Zone对应Slot Space的元信息,显示Transaction Slot文件使用情况。 gs_undo_meta_dump_slot 用于解析数据页和数据页上数据的所有历史版本,并返回存放解析内容的路径。 gs_undo_dump_parsepage_mv 预写日志 (WAL) 用于解析指定LSN范围之内的XLOG日志,并返回存放解析内容的路径。可以通过pg_current_xlog_location()获取当前XLOG位置。 WAL日志出错。 日志回放出错。 页面损坏。 gs_xlogdump_lsn 用于解析指定XID的XLOG日志,并返回存放解析内容的路径。可以通过txid_current()获取当前事务ID。 gs_xlogdump_xid 用于解析指定表页面对应的日志,并返回存放解析内容的路径。 gs_xlogdump_tablepath 用于解析指定表页面和表页面对应的日志,并返回存放解析内容的路径。可以看做一次执行gs_parse_page_bypath和gs_xlogdump_tablepath。该函数执行的前置条件是表文件存在。如果想查看已删除的表的相关日志,请直接调用gs_xlogdump_tablepath。 gs_xlogdump_parsepage_tablepath 统计 回滚段(Undo) 用于显示Undo模块的统计信息,包括Undo Zone使用情况、Undo链使用情况、Undo模块文件创建删除情况和Undo模块参数设置推荐值。 Undo空间膨胀。 Undo资源监控。 gs_stat_undo 预写日志 (WAL) 用于统计预写日志(WAL)写盘时的内存状态表内容。 WAL写/刷盘监控。 WAL写/刷盘hang住。 gs_stat_wal_entrytable 用于统计预写日志(WAL)刷盘状态、位置统计信息。 gs_walwriter_flush_position 用于统计预写日志(WAL)写刷盘次数频率、数据量以及刷盘文件统计信息。 gs_walwriter_flush_stat 校验 堆表/索引 用于离线校验表或者索引文件磁盘页面数据是否异常。 页面损坏或者元组损坏。 可见性问题。 日志回放出错问题。 ANALYZE VERIFY 用于校验当前实例当前库物理文件是否存在丢失。 文件丢失。 gs_verify_data_file 索引回收队列(URQ) 用于校验UB-tree索引回收队列(潜在队列/可用队列/单页面)数据是否异常。 UB-tree索引空间膨胀。 UB-tree索引空间回收异常。 gs_verify_urq 回滚段(Undo) 用于离线校验Undo Record数据是否存在异常。 Undo Record异常或者损坏。 可见性问题。 回滚出错或者异常。 gs_verify_undo_record 用于离线校验Transaction Slot数据是否存在异常。 Undo Record异常或者损坏。 可见性问题。 回滚出错或者异常。 gs_verify_undo_slot 用于离线校验Undo元信息数据是否存在异常。 因Undo meta引起的节点无法启动问题。 Undo空间回收异常。 Snapshot too old问题。 gs_verify_undo_meta 修复 堆表/索引/Undo文件 用于基于备机修复主机丢失的物理文件。 堆表/索引/Undo文件丢失。 gs_repair_file 堆表/索引/Undo页面 用于校验并基于备机修复主机受损页面。 堆表/索引/Undo页面损坏。 gs_verify_and_tryrepair_page 用于基于备机页面直接修复主机页面。 gs_repair_page 用于基于偏移量对页面的备份进行字节修改。 gs_edit_page_bypath 用于将修改后的页面覆盖写入到目标页面。 gs_repair_page_bypath 回滚段(Undo) 用于重建Undo元信息,如果校验发现Undo元信息没有问题则不重建。 Undo元信息异常或者损坏。 gs_repair_undo_byzone 索引回收队列(URQ) 用于重建UB-tree索引回收队列。 索引回收队列异常或者损坏。 gs_repair_urq 父主题: Ustore存储引擎
  • 索引重建/不可用 使用ALTER INDEX可以设置索引是否可用。 例如,假设分区表range_ sales上存在索引range_sales_idx,可以通过如下命令设置其不可用。 ALTER INDEX range_sales_idx UNUSABLE; 可以使用如下命令重建索引range_sales_idx。 ALTER INDEX range_sales_idx REBUILD; 父主题: 分区表索引重建/不可用
  • 数据分区查找优化 分区表对数据查找方面的帮助主要体现在对分区键进行谓词查询场景,例如一张以月份Month作为分区键的表,如图1所示,如果以普通表的方式则需要访问表全量的数据(Full Table Scan),如果以日期为分区键重新设计该表,那么原有的全表扫描会被优化成为分区扫描,当表内的数据量很大同时具有很长的历史周期时,由于扫描数据缩减所带来的性能提升会有非常明显的效果,如图2所示。 图1 分区表示例图 图2 分区表剪枝示例图 父主题: 大容量数据库
  • Local索引分区重建/不可用 使用ALTER INDEX PARTITION可以设置Local索引分区是否可用。 使用ALTER TABLE MODIFY PARTITION可以设置分区表上指定分区的所有索引分区是否可用。这个语法如果作用于二级分区表的一级分区,数据库会将这个一级分区下的所有二级分区均进行设置。 使用ALTER TABLE MODIFY SUBPARTITION可以设置二级分区表上指定二级分区的所有索引分区是否可用。 例如,假设分区表range_sales上存在两张Local索引range_sales_idx1和range_sales_idx2,假设其在分区date_202001上对应的索引分区名分别为range_sales_idx1_part1和range_sales_idx2_part1。 下面给出了维护分区表分区索引的语法: 可以通过如下命令设置分区date_202001上的所有索引分区均不可用。 ALTER TABLE range_sales MODIFY PARTITION date_202001 UNUSABLE LOCAL INDEXES; 或者通过如下命令单独设置分区date_202001上的索引分区range_sales_idx1_part1不可用。 ALTER INDEX range_sales_idx1 MODIFY PARTITION range_sales_idx1_part1 UNUSABLE; 可以通过如下命令重建分区date_202001上的所有索引分区。 ALTER TABLE range_sales MODIFY PARTITION date_202001 REBUILD UNUSABLE LOCAL INDEXES; 或者通过如下命令单独重建分区date_202001上的索引分区range_sales_idx1_part1。 ALTER INDEX range_sales_idx1 REBUILD PARTITION range_sales_idx1_part1; 假设二级分区表list_range_sales上存在两张Local索引list_range_sales_idx1和list_range_sales_idx2,表下有一级分区channel1,其下属二级分区有channel1_product1、channel1_product2、channel1_product3,二级分区channel1_product1上对应的索引分区名分别为channel1_product1_idx1和channel1_product1_idx2。 下面给出了维护二级分区表一级分区索引的语法: 可以通过如下命令设置分区channel1下属二级分区的所有索引分区均不可用,包括二级分区channel1_product1、channel1_product2、channel1_product3。 ALTER TABLE list_range_sales MODIFY PARTITION channel1 UNUSABLE LOCAL INDEXES; 可以通过如下命令重建分区channel1下属二级分区的所有索引分区。 ALTER TABLE list_range_sales MODIFY PARTITION channel1 REBUILD UNUSABLE LOCAL INDEXES; 下面给出了维护二级分区表二级分区索引的语法: 可以通过如下命令单独设置二级分区channel1_product1上的所有索引分区均不可用。 ALTER TABLE list_range_sales MODIFY SUBPARTITION channel1_product1 UNUSABLE LOCAL INDEXES; 可以通过如下命令重建二级分区channel1_product1上的所有索引分区。 ALTER TABLE list_range_sales MODIFY SUBPARTITION channel1_product1 REBUILD UNUSABLE LOCAL INDEXES; 或者通过如下命令单独设置二级分区channel1_product1上的索引分区channel1_product1_idx1不可用。 ALTER INDEX list_range_sales_idx1 MODIFY PARTITION channel1_product1_idx1 UNUSABLE; 通过如下命令单独重建二级分区channel1_product1上的索引分区channel1_product1_idx1。 ALTER INDEX list_range_sales_idx1 REBUILD PARTITION channel1_product1_idx1; 父主题: 分区表索引重建/不可用
  • 向列表分区表新增分区 使用ALTER TABLE ADD PARTITION可以在列表分区表中新增分区,新增分区的枚举值不能与已有的任一个分区的枚举值重复。 例如,对列表分区表list_sales新增一个分区。 ALTER TABLE list_sales ADD PARTITION channel5 VALUES ('X') TABLESPACE tb1; 当列表分区表有DEFAULT分区时,无法新增分区。可以使用ALTER TABLE SPLIT PARTITION命令分割分区。 父主题: 新增分区
  • 大容量数据库背景介绍 随着处理数据量的日益增长和使用场景的多样化,数据库越来越多地面对容量大、数据多样化的场景。在过去数据库业界发展的20多年时间里,数据量从最初的MB、GB级逐渐发展到现在的TB级,在如此数据大规模、数据多样化的客观背景下,数据库管理系统(DBMS)在数据查询、数据管理方面提出了更高的要求,客观上要求数据库能够支持多种优化查找策略和管理运维方式。 在计算机科学经典的算法中,人们通常使用分治法(Divide and Conquer)解决场景和规模较大的问题。其基本思想就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题直到最后子问题可以简单的直接求解,原问题的解可看成子问题的解的合并。对于大容量数据场景,数据库提供对数据进行“分治处理”的方式即分区,将逻辑数据库或其组成元素划分为不同的独立部分,每一个分区维护逻辑上存在相类似属性的数据,这样就把庞大的数据整体进行了切分,有利于数据的管理、查找和维护。 父主题: 大容量数据库
  • 分区表介绍 分区表(Partitioned Table)指在单节点内对表数据内容按照分区键、以及围绕分区键的分区策略对表进行逻辑切分。从数据分区的角度来看是一种水平分区(horizontal partition)分区策略方式。分区表增强了数据库应用程序的性能、可管理性和可用性,并有助于降低存储大量数据的总体拥有成本。分区允许将表、索引和索引组织的表细分为更小的部分,使这些数据库对象能够在更精细的粒度级别上进行管理和访问。GaussDB Kernel提供了丰富的分区策略和扩展,以满足不同业务场景的需求。由于分区策略的实现完全由数据库内部实现,对用户是完全透明的,因此它几乎可以在实施分区表优化策略以后做平滑迁移,无需潜在耗费人力物力的应用程序更改。本章围绕GaussDB Kernel分区表的基本概念从以下几个方面展开介绍: 分区表基本概念:从表分区的基本概念出发,介绍分区表的catalog存储方式以及内部对应原理。 分区策略:从分区表所支持的基本类型出发,介绍各种分区模式下对应的特性以及能够达到的优化特点和效果。 基本概念 分区策略 分区基本使用 父主题: 分区表
  • 分割分区 用户可以使用分割分区的命令来将一个分区分割为两个或多个新分区。当分区数据太大,或者需要对有MAXVALUE的范围分区/DEFAULT的列表分区新增分区时,可以考虑执行该操作。分割分区可以指定分割点将一个分区分割为两个新分区,也可以不指定分割点将一个分区分割为多个新分区。分割分区可以通过指定分区名或者分区值来进行。 分割分区不能作用于哈希分区上。 不支持对二级分区表的一级分区进行分割。 执行分割分区命令会使得Global索引失效,可以通过UPDATE GLOBAL INDEX子句来同步更新Global索引,或者用户自行重建Global索引。 分割后的新分区,可以与源分区名字相同,比如将分区p1分割为p1,p2。但数据库不会将分割前后相同名的分区视为同一个分区,这会影响分割期间对源分区p1查询,具体参考DQL/DML-DDL并发。 对范围分区表分割分区 对间隔分区表分割分区 对列表分区表分割分区 对*-RANGE二级分区表分割二级分区 对*-LIST二级分区表分割二级分区 父主题: 分区表运维管理
  • 怎么配置回滚段大小 一般情况下回滚段大小的参数使用默认值即可。为了达到最佳性能,部分场景下可调整回滚段大小的相关参数,具体场景与设置方法如下。 保留给定时间内的历史版本数据。 当使用闪回或者支撑问题定位时,通常希望保留更多历史版本数据,此时需要修改undo_retention_time。undo_retention_time默认值是0,取值范围为 0~3天。 调整的推荐值为900s,需要注意的是,undo_retention_time的取值越大,对业务的影响除了Undo空间占用增多,也会造成数据空间膨胀,进一步影响数据扫描更新性能。当不使用闪回或者希望减少历史旧版本的磁盘空间占用时,需要将undo_retention_time调小来达到最佳性能。可以通过如下方法选择更适合自己业务模型的取值。 查询guc参数undo_space_limit_size,查询视图gs_stat_undo,获取近期undo空间平均增长速度avg_space_increse_speed与当前undo占用空间curr_used_undo_size,计算undo_retention_time的建议值new_val = 0.5 * (undo_space_limit_size * 0.8 - curr_used_undo_size) / avg_space_increse_speed。 保留给定空间大小的历史版本数据。 如果业务中存在长事务或大事务可能导致Undo空间膨胀时,需要将undo_space_limit_size调大,undo_space_limit_size默认值为256GB,取值范围为800MB~16TB。 在磁盘空间允许的条件下,推荐undo_space_limit_size设置翻倍。同时undo_space_limit_size的取值越大则占用磁盘空间越大,可能降低性能。如果查询gs_stat_undo()的curr_used_undo_size发现不存在Undo空间膨胀,可以恢复为原值。 调整undo_space_limit_size后可相应提高单事务平均占用undo空间undo_limit_size_per_transaction的取值,undo_limit_size_per_transaction取值范围为2MB~16TB,默认值为32GB。设置时建议undo_limit_size_per_transaction不超过undo_space_limit_size,即单事务Undo分配空间阈值不大于Undo总空间阈值。 为了更准确设置该参数来达到最佳性能,建议采用如下方式进行计算。 undo_space_limit_size:查询视图gs_stat_undo,获取近期undo空间平均增长速度avg_space_increse_speed和curr_used_undo_size,计算undo_space_limit_size的建议值new_val = 86400 * 30 * avg_space_increse_speed + curr_used_undo_size。 undo_limit_size_per_transaction:查询gs_stat_undo(),获取单事务最大占用undo空间max_xact_space(503.2版本中扩展该列),建议该参数调整后不小于new_val = 10 * max_xact_space。 历史版本的保留参数的调整优先级。 在undo_retention_time、undo_space_limit_size、undo_limit_size_per_transaction中,先触发的空间阈值会先进行约束限制。 例如:Undo强制回收阈值参数undo_space_limit_size设置为1GB,Undo旧版本保留时间undo_retention_time为900s,如果900s内产生的历史版本数据不足1GB*0.8,则按照900s进行回收限制;否则按照1GB*0.8进行回收限制。遇到该情况时,如果磁盘空闲空间充足,则上调undo_space_limit_size,如果磁盘空闲空间紧缺,则下调undo_retention_time。 父主题: Ustore的最佳实践
共100000条