华为云用户手册

  • 步骤二:安装OpsAgent 在“未纳管主机”页面,单击“部署OpsAgent”。 安装方式选择“远程安装”或“手动安装”。 手动安装:首次安装OpsAgent时,必须使用手动安装方式。 填写基本信息,OpsAgent基本信息参数说明如表1所示。 表1 OpsAgent基本信息参数说明 参数名称 参数说明 租户账号 选择租户账号,为租户VPC下的主机安装OpsAgent。 归属Region 选择租户VPC所属的Region。 OpsAgent版本 选择需要安装的OpsAgent的版本号。 VPC 选择虚拟私有云VPC,为该VPC下的主机安装OpsAgent。 说明: 可选VPC为已纳管VPC,如无可选VPC,请完成VPC纳管。 接入方式 当前支持“直接接入(内网)”的接入方式,为华为云主机接入安装OpsAgent。 单击LINUX命令后的,复制安装命令。 使用root账号远程登录主机后,执行安装命令安装OpsAgent。 安装完成后,未纳管主机列表中,该主机的OpsAgent状态为“在线”。 远程安装:选择虚拟私有云下已经安装了OpsAgent的主机作为安装机,安装机将作为中间桥梁安装OpsAgent到同虚拟私有云下的其他主机。 填写基本信息,OpsAgent基本信息参数说明如表1所示。 选择安装机,选择一台已安装OpsAgent的主机作为安装机。 添加主机,选择需要安装OpsAgent的主机所在行“操作”列的“编辑”,输入主机root密码后单击“确定”,然后在列表中勾选该主机。 单击“确定”,安装机将作为执行机为主机安装OpsAgent。
  • 更多操作 创建微服务信息完成后,您还可以执行如下表1的操作。 表1 更多操作 操作 步骤 查看微服务信息 单击微服务列表中的服务中文名称,可查看微服务详情。 编辑微服务信息 说明: 仅可编辑“状态”为“草稿”的微服务的信息。 单击微服务列表“操作”列的“编辑”。 在“编辑微服务”页面编辑微服务中文名(不可编辑微服务所属服务和微服务英文名)。 单击“确认”。 删除微服务信息 说明: 仅可删除“状态”为“草稿”的微服务的信息。 单击微服务列表中“状态”为“草稿”的微服务“操作”列的“删除”。 单击“确定”。 发布微服务信息 说明: 仅可发布“状态”为“草稿”或“已下线”的微服务信息。 单击微服务列表“操作”列的“发布”(发布后服务无法删除,请谨慎操作)。 单击“确定”,该微服务信息将发布到已购买的AppStage相关中心。 同步微服务信息 说明: 发布服务信息后,如果在AppStage相关中心未同步到该微服务信息,可使用此“同步”功能重新同步微服务信息。 仅可同步非“草稿”状态的微服务信息。 单击微服务列表“操作”列的“同步”。 单击“确定”,该微服务信息将同步到已购买的AppStage相关中心。 下线微服务信息 说明: 下线微服务后AppStage的开发中心、运维中心等中心无法使用该微服务,请谨慎操作;下线后可以在“操作”列再次单击“发布”重新上线该微服务信息。 单击微服务所在行“操作列”列“下线”。 在“下线微服务”对话框输入“确定下线”,并单击“确定”。
  • 永久删除账号 永久删除是指从WiseDBA中彻底删除账号同时在业务数据库中进行删除,删除后无法恢复。 数据库账号关系到业务是否能正常访问数据库,请仔细辨别需要删除的账号具体信息:包括用户名和白名单主机。 高危操作,谨慎处理,一经删除,难以在短时间内恢复。 选择“回收站”页签,选择待销毁账号操作列的“永久删除”。 在“选择电子流”窗口中,选择以下任一方式: 运维操作记录选择“关联电子流”,并选择要关联的电子流,单击“提交”。 运维操作记录选择“紧急问题处理”,并填写紧急原因,单击“提交”。 输入账号名称和个人账号,单击“永久删除”。 将鼠标悬停在运维中心工作台右上角的账号,选择“我的信息”,查看个人账号。
  • 软件仓库概述 AppStage运维中心支持对软件包、部署包、镜像包、SQL包等进行集中管理,用于升级变更服务的虚拟机。软件仓库不同软件包的说明如表1所示。 同时支持将镜像仓SWR(SoftWare Repository for Container)进行统一管理,可以绑定使用镜像仓中的镜像用于服务的容器升级变更,具体操作请参见管理SWR。 如果使用houp的操作系统镜像发布文件,具体的发布信息可以在“发布管理”页面查看。 表1 包类型说明 包类型 说明 传包方式 使用方式 打包规范 软件包 应用软件包,可使用虚拟机部署和容器部署,一般用于虚拟机部署,包括软件包(虚拟机部署使用)、测试用例包、函数包(函数部署使用)。 使用开发中心推包/上传软件包 在IaC代码中定义需要使用的软件包,通过IaC变更完成应用部署。 软件包 部署包 用户部署虚拟机时使用的脚本包(playbook文件)。 运维中心发布/使用开发中心推包/上传部署包 使用部署包创建模板,根据模板创建虚拟机部署的变更任务,实现使用部署脚本完成软件的自动化部署。 部署包 镜像包 用户容器部署时使用的Docker的容器镜像包。 使用开发中心推包 在IaC代码中定义需要使用的镜像包,通过IaC变更完成容器化部署。 镜像包 SQL包 执行SQL变更的DDL、DML数据库脚本。 使用开发中心推包/上传SQL包 在WiseDBA中使用SQL包进行SQL变更,对数据库或数据库数据进行增删改查的操作。 SQL包 IaC 3.0包 描述IaC 3.0变更的执行过程及资源配置信息。 使用开发中心推包/上传IaC 3.0包 在变更环境时选择IaC包,完成资源配置及环境变更。 IaC 3.0包 Terraform包 描述Terraform引擎变更的执行过程及资源配置信息。 使用开发中心推包 在Terraform引擎的实例列表中使用代码包创建变更计划,完成资源配置及环境变更。 Terraform包 OS镜像包 操作系统镜像发布,普通用户一般不需要使用。 - - - 父主题: 软件仓库
  • 更多操作 创建产品信息完成后,您还可以执行如表1所示的操作。 表1 更多操作 操作 步骤 查看产品信息 单击产品列表中产品中文名,可查看产品详情。 编辑产品信息 说明: 仅可编辑“状态”为“草稿”的产品信息。 单击产品列表“操作”列的“编辑”。 在“编辑产品”页面编辑产品中文名(不可以编辑产品归属部门和产品英文名)。 删除产品信息 说明: 仅可删除“状态”为“草稿”的产品信息。 单击产品列表中“状态”为“草稿”的产品“操作”列的“删除”。 单击“确定”。 发布产品信息 说明: 仅可发布“状态”为“草稿”或“已下线”的产品信息。 单击产品列表“操作”列的“发布”(发布后产品无法删除,请谨慎操作)。 单击“确定”,该产品信息将发布到已购买的AppStage相关中心。 同步产品信息 说明: 发布产品信息后,如果在AppStage相关中心未同步到该产品信息,可使用此“同步”功能重新同步产品信息。 仅可同步非“草稿”状态的产品信息。 单击产品列表“操作”列的“同步”。 单击“确定”,该产品信息将同步到已购买的AppStage相关中心。 下线产品信息 说明: 下线产品需确保该产品下的服务及微服务已下线,下线后AppStage的开发中心、运维中心等中心无法使用该产品,请谨慎操作;下线后可以在“操作”列再次单击“发布”重新上线该产品信息。 单击产品列表“操作”列的“下线”。 在“下线产品”对话框输入“确定下线”,并单击“确定”。
  • 更多操作 创建服务信息完成后,您还可以执行如下表1的操作。 表1 更多操作 操作 步骤 查看服务详情 单击服务列表中服务中文名,可查看服务详情。 编辑服务信息 说明: 仅可编辑“状态”为“草稿”的服务信息。 单击服务列表“操作”列的“编辑”。 在“编辑服务”页面编辑服务中文名(不可编辑服务所属产品和服务英文名),然后单击“确定”。 删除服务信息 说明: 仅可删除“状态”为“草稿”的服务信息。 单击服务列表中“状态”为“草稿”的服务“操作”列的“删除”。 单击“确定”。 发布服务信息 说明: 仅可发布“状态”为“草稿”或“已下线”的服务信息。 单击服务列表“操作”列的“发布”(发布后服务无法删除,请谨慎操作)。 单击“确定”,该服务信息将发布到已购买的AppStage相关中心。 同步服务信息 说明: 发布服务信息后,如果在AppStage相关中心未同步到该服务信息,可使用此“同步”功能重新同步服务信息。 仅可同步非“草稿”状态的服务信息。 单击服务列表“操作”列的“同步”。 单击“确定”,该服务信息将同步到已购买的AppStage相关中心。 下线服务信息 说明: 下线服务需确保该服务下的微服务已下线,下线后AppStage的开发中心、运维中心等中心无法使用该服务,请谨慎操作;下线后可以在“操作”列再次单击“发布”重新上线该服务信息。 单击服务列表“操作”列的“下线”。 在“下线服务”对话框输入“确定下线”,并单击“确定”。
  • 操作须知 将主机纳管至VMS,需要完成如下操作: 步骤一:刷新未纳管主机:首先需要刷新未纳管主机,将华为云其他主机同步至未纳管主机列表中。 步骤二:安装OpsAgent:纳管前需要为主机安装OpsAgent。 步骤三:分配主机:纳管主机需要将主机分配到对应的服务及环境下,完成主机纳管。 主机分配当天密码管理定时任务会自动修改主机账号的密码,密码有效期为90天,到期自动修改。如果不想密码被修改,需要在纳管主机前配置密码白名单规则。如果没有配置密码白名单规则,密码管理任务会检查密码有效期,并在密码过期前20天修改密码。 绑定已规划的业务账号(可选):主机纳管后需要为主机绑定已规划的业务账号,如果纳管前主机上已有业务账号,分配主机时会自动绑定该业务账号,不需要再单独绑定。 重置密码(可选):可以选择手动重置主机的root账号和所有业务账号的密码,将密码托管给AppStage平台。
  • 步骤二:安装OpsAgent 在“未纳管主机”页面,单击“部署OpsAgent”。 安装方式选择“远程安装”或“手动安装”。 手动安装:首次安装OpsAgent时,必须使用手动安装方式。 填写基本信息,OpsAgent基本信息参数说明如表1所示。 表1 OpsAgent基本信息参数说明 参数名称 参数说明 租户账号 选择租户账号,为租户VPC下的主机安装OpsAgent。 归属Region 选择租户VPC所属的Region。 OpsAgent版本 选择需要安装的OpsAgent的版本号。 VPC 选择虚拟私有云VPC,为该VPC下的主机安装OpsAgent。 说明: 可选VPC为已纳管VPC,如无可选VPC,请完成VPC纳管。 接入方式 当前支持“直接接入(内网)”的接入方式,为华为云主机接入安装OpsAgent。 单击LINUX命令后的,复制安装命令。 使用root账号远程登录主机后,执行安装命令安装OpsAgent。 安装完成后,未纳管主机列表中,该主机的OpsAgent状态为“在线”。 远程安装:选择虚拟私有云下已经安装了OpsAgent的主机作为安装机,安装机将作为中间桥梁安装OpsAgent到同虚拟私有云下的其他主机。 填写基本信息,OpsAgent基本信息参数说明如表1所示。 选择安装机,选择一台已安装OpsAgent的主机作为安装机。 添加主机,选择需要安装OpsAgent的主机所在行“操作”列的“编辑”,输入主机root密码后单击“确定”,然后在列表中勾选该主机。 单击“确定”,安装机将作为执行机为主机安装OpsAgent。
  • SQL函数解码性能 在Benchmarksql-5.0的100warehouse场景下,采用pg_logical_slot_get_changes时: 单次解码数据量4K行(对应约5MB~10MB日志),解码性能0.3MB/s~0.5MB/s。 单次解码数据量32K行(对应约40MB~80MB日志),解码性能3MB/s~5MB/s。 单次解码数据量256K行(对应约320MB~640MB日志),解码性能3MB/s~5MB/s。 单次解码数据量再增大,解码性能无明显提升。 如果采用pg_logical_slot_peek_changes + pg_replication_slot_advance方式,解码性能相比采用pg_logical_slot_get_changes时要下降30%~50%。
  • 新增分区 用户可以在已建立的分区表中新增分区,来维护新业务的进行。当前各种分区表支持的分区上限为1048575,如果达到了上限则不能继续添加分区。同时需要考虑分区占用内存的开销,分区表使用内存大致为(分区数 * 3 / 1024)MB,分区占用内存不允许大于local_syscache_threshold的值,同时还需要预留部分空间以供其他功能使用。 新增分区不能作用于HASH分区上。 新增分区不继承表上的分类索引属性。 向范围分区表新增分区 向间隔分区表新增分区 向列表分区表新增分区 向二级分区表新增一级分区 向二级分区表新增二级分区 父主题: 分区表运维管理
  • 数据分区查找优化 分区表对数据查找方面的帮助主要体现在对分区键进行谓词查询场景,例如一张以月份Month作为分区键的表,如图1所示。如果以普通表的方式设计表结构则需要访问表全量的数据(Full Table Scan),如果以日期为分区键重新设计该表,那么原有的全表扫描会被优化成为分区扫描。当表内的数据量很大同时具有很长的历史周期时,由于扫描数据缩减所带来的性能提升会有明显的效果,如图2所示。 图1 分区表示例图 图2 分区表剪枝示例图 父主题: 大容量数据库
  • 分区表对导入操作的性能影响 在GaussDB内核实现中,分区表数据插入的处理过程相比非分区表增加分区路由部分的开销,因从整体上分区表场景的数据插入开销主要看成:(1)heap-insert基表插入;(2)partition-routing分区路由两个部分,如图1所示。其中heap基表插入解决tuple入库对应heap表的问题并且该部分普通表和分区表共用,而分区路由部分解决分区路由即tuple元组插入到对应partRel的问题,并且分区路由算法本身作为一级、二级分区共用,不同之处在于二级分区相比一级分区多一层路由操作,对路由算法为两次调用。 图1 普通表&分区表数据插入 因此对数据插入优化的侧重点如下: 分区表基表Heap表插入: 算子底噪优化 heap数据插入 索引插入build优化(带索引) 分区表分区路由: 路由查找算法逻辑优化 路由底噪优化,包括分区表partRel句柄开启、新增的函数调用逻辑开销 分区路由的性能主要通过大数据量的单条INSERT语句体现,UPDATE场景内部包含了查找对应要更新的元组进行DELETE操作然后再进行INSERT,因此不如单条INSERT语句场景直接。 不同分区类型的路由算法逻辑如表1所示: 表1 路由算法逻辑 分区方式 路由算法复杂度 实现概述说明 范围分区(Range Partition) O(logN) 基于二分binary-search实现 间隔分区(Interval Partition) O(logN) 基于二分binary-search实现 哈希分区(Hash-Partition) O(1) 基于key-partOid哈希表实现 列表分区(List-Partition) O(1) 基于key-partOid哈希表实现 二级分区(List/List) O(1) + O(1) 哈希+哈希 二级分区(List/Range) O(1) + O(1) = O(1) 哈希+二分查找 二级分区(List/Hash) O(1) + O(1) = O(1) 哈希+哈希 二级分区(Range/List) O(1) + O(1) = O(1) 二分查找+哈希 二级分区(Range/Range) O(1) + O(1) = O(1) 二分查找+二分查找 二级分区(Range/Hash) O(1) + O(1) = O(1) 二分查找+哈希 二级分区(Hash/List) O(1) + O(1) = O(1) 哈希+哈希 二级分区(Hash/Range) O(1) + O(1) = O(1) 哈希+二分查找 二级分区(Hash/Hash) O(1) + O(1) = O(1) 哈希+哈希 分区路由的主要处理逻辑根据导入数据元组的分区键计算其所在分区的过程,相比非分区表这部分为额外增加的开销,这部分开销在最终数据导入上的具体性能损失和服务器CPU处理能力、表宽度、磁盘/内存的实际容量相关,通常可以粗略认为: x86服务器场景下一级分区表相比普通表的导入性能会略低10%以内,二级分区表比普通表略低20%以内。 ARM服务器场景下为20%、30%,造成x86和ARM指向性能略微差异的主要原因是分区路由为in-memory计算强化场景,主流x86体系CPU在单核指令处理能力上略优于ARM。 父主题: 分区策略
  • Enhanced Toast使用 新增的GUC参数enable_enhance_toast_table用于控制线外存储结构。“enable_enhance_toast_table=on”表示使用Enhanced Toast线外存储表,“enable_enhance_toast_table=off”表示使用Toast线外存储表。 gs_guc reload -D datadir -c "enable_enhance_toast_table=on" 父主题: Enhanced Toast存储结构
  • 分区剪枝 分区剪枝是GaussDB提供的一种分区表查询优化技术,数据库SQL引擎会根据查询条件,只扫描特定的部分分区。分区剪枝是自动触发的,当分区表查询条件符合剪枝场景时,会自动触发分区剪枝。根据剪枝阶段的不同,分区剪枝分为静态剪枝和动态剪枝,静态剪枝在优化器阶段进行,在生成计划之前,数据库已经知道需要访问的分区信息;动态剪枝在执行器阶段进行(执行开始/执行过程中),在生成计划时,数据库并不知道需要访问的分区信息,只是判断“可以进行分区剪枝”,具体的剪枝信息由执行器决定。 只有分区表页面扫描和Local索引扫描才会触发分区剪枝,Global索引没有分区的概念,不需要进行剪枝。 分区表静态剪枝 分区表动态剪枝 父主题: 分区表查询优化
  • 对间隔分区表分割分区 对间隔分区表分割分区的命令与范围分区表相同。 对间隔分区表的间隔分区完成分割分区操作之后,源分区之前的间隔分区会变成范围分区。 例如,创建如下间隔分区表,并插入数据新增三个分区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')。 父主题: 分割分区
  • 指定单分区统计信息收集 当前分区表支持指定单分区统计信息收集,已收集统计信息的分区会在再次收集时自动更新维护。该功能适用于列表分区、哈希分区和范围分区。 gaussdb=# CREATE TABLE only_first_part(id int,name varchar)PARTITION BY RANGE (id) (PARTITION id11 VALUES LESS THAN (1000000), PARTITION id22 VALUES LESS THAN (2000000), PARTITION max_id1 VALUES LESS THAN (MAXVALUE)); gaussdb=# INSERT INTO only_first_part SELECT generate_series(1,5000),'test'; gaussdb=# ANALYZE only_first_part PARTITION (id11); gaussdb=# ANALYZE only_first_part PARTITION (id22); gaussdb=# ANALYZE only_first_part PARTITION (max_id1); gaussdb=# SELECT relname, relpages, reltuples FROM pg_partition WHERE relname IN ('id11', 'id22', 'max_id1'); relname | relpages | reltuples ---------+----------+----------- id11 | 20 | 5000 id22 | 0 | 0 max_id1 | 0 | 0 (3 rows) gaussdb=# \x gaussdb=# SELECT * FROM pg_stats WHERE tablename ='only_first_part' AND partitionname ='id11'; -[ RECORD 1 ]----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- schemaname | public tablename | only_first_part attname | name inherited | f null_frac | 0 avg_width | 5 n_distinct | 1 n_dndistinct | 0 most_common_vals | {test} most_common_freqs | {1} histogram_bounds | correlation | 1 most_common_elems | most_common_elem_freqs | elem_count_histogram | partitionname | id11 subpartitionname | -[ RECORD 2 ]----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- schemaname | public tablename | only_first_part attname | id inherited | f null_frac | 0 avg_width | 4 n_distinct | -1 n_dndistinct | 0 most_common_vals | most_common_freqs | histogram_bounds | {1,50,100,150,200,250,300,350,400,450,500,550,600,650,700,750,800,850,900,950,1000,1050,1100,1150,1200,1250,1300,1350,1400,1450,1500,1550,1600,1650,1700,1750,1800,1850,1900,1950,2000,2050,2100,2150,2200,2250,2300,2350,2400,2450,2500,2550,2600,2650,2700,2750,2800,2850,2900,2950,3000,3050,3100,3150,3200,3250,3300,3350,3400,3450,3500,3550,3600,3650,3700,3750,3800,3850,3900,3950,4000,4050,4100,4150,4200,4250,4300,4350,4400,4450,4500,4550,4600,4650,4700,4750,4800,4850,4900,4950,5000} correlation | 1 most_common_elems | most_common_elem_freqs | elem_count_histogram | partitionname | id11 subpartitionname | gaussdb=# \x -- 删除分区表 gaussdb=# DROP TABLE only_first_part;
  • 分区表索引重建/不可用 用户可以通过命令使得一个分区表索引或者一个索引分区不可用,此时该索引/索引分区不再维护。使用重建索引命令可以重建分区表索引,恢复索引的正常功能。 此外,部分分区级DDL操作也会使得Global索引失效,包括删除drop、交换exchange、清空truncate、分割split、合并merge。如果在DDL操作中带UPDATE GLOBAL INDEX子句,则会同步更新Global索引,否则需要用户自行重建索引。 索引重建/不可用 Local索引分区重建/不可用 父主题: 分区表运维管理
  • 使用Ustore进行测试 创建Ustore表 使用CREATE TABLE语句创建Ustore表。 gaussdb=# CREATE TABLE ustore_table(a INT PRIMARY KEY, b CHAR (20)) WITH (STORAGE_TYPE=USTORE); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "ustore_table_pkey" for table "ustore_table" CREATE TABLE gaussdb=# \d+ ustore_table Table "public.ustore_table" Column | Type | Modifiers | Storage | Stats target | Description --------+---------------+-----------+----------+--------------+------------- a | integer | not null | plain | | b | character(20) | | extended | | Indexes: "ustore_table_pkey" PRIMARY KEY, ubtree (a) WITH (storage_type=USTORE) TABLESPACE pg_default Has OIDs: no Options: orientation=row, storage_type=ustore, compression=no, segment=off 删除Ustore表 gaussdb=# DROP TABLE ustore_table; DROP TABLE 为Ustore表创建索引 Ustore当前仅支持BTree类型的多版本索引。在一些场景中,为了区别于Astore的BTree索引,也会将Ustore表的多版本BTee索引称为UBTree(Ustore BTree,UBTree介绍详见UBTree章节)。用户可以参照以下方式使用CREATE INDEX语句为Ustore表的“a”属性创建一个UBTree索引。 Ustore表不指定创建索引类型,默认创建的是UBTree索引。 UBTree索引分为RCR版本和PCR版本,默认创建RCR版本的UBTree。若在创建索引时,with选项指定(index_txntype=pcr)或者指定GUC的index_txntype=pcr,则创建的是PCR版本的UBTree。 gaussdb=# CREATE TABLE test(a int); CREATE TABLE gaussdb=# CREATE INDEX UB_tree_index ON test(a); CREATE INDEX gaussdb=# \d+ test Table "public.test" Column | Type | Modifiers | Storage | Stats target | Description --------+---------+-----------+---------+--------------+------------- a | integer | | plain | | Indexes: "ub_tree_index" ubtree (a) WITH (storage_type=USTORE) TABLESPACE pg_default Has OIDs: no Options: orientation=row, compression=no, storage_type=USTORE, segment=off --删除Ustore表索引。 gaussdb=# DROP TABLE test; DROP TABLE 父主题: Ustore简介
  • 开启/关闭分区自动扩展 用户可以通过ALTER命令来对已创建的分区表开启/关闭分区自动扩展功能。这一操作会对分区表持有SHARE_UPDATE_EXCLUSIVE级别的表锁,与常规DQL/DML业务互不影响,但与DDL业务相互排斥。若DML业务触发自动扩展分区,也会与之互斥。不同级别锁的行为控制请参见常规锁设计。 开启/关闭范围分区自动扩展 开启/关闭一级列表分区自动扩展 开启/关闭二级列表分区自动扩展 父主题: 分区自动扩展
  • 哈希分区 哈希分区(Hash Partition)基于对分区键使用哈希算法将数据映射到分区。使用的哈希算法为GaussDB内置哈希算法,在分区键取值范围不倾斜(no data skew)的场景下,哈希算法在分区之间均匀分布行,使分区大小大致相同。因此哈希分区是实现分区间均匀分布数据的理想方法。哈希分区也是范围分区的一种易于使用的替代方法,尤其是当要分区的数据不是历史数据或没有明显的分区键时,示例如下: CREATE TABLE bmsql_order_line ( ol_w_id INTEGER NOT NULL, ol_d_id INTEGER NOT NULL, ol_o_id INTEGER NOT NULL, ol_number INTEGER NOT NULL, ol_i_id INTEGER NOT NULL, ol_delivery_d TIMESTAMP, ol_amount DECIMAL(6,2), ol_supply_w_id INTEGER, ol_quantity INTEGER, ol_dist_info CHAR(24) ) --预先定义100个分区 PARTITION BY HASH(ol_d_id) ( PARTITION p0, PARTITION p1, PARTITION p2, … PARTITION p99 ); 上述例子中,bmsql_order_line表的ol_d_id进行了分区,ol_d_id列是一个identifier性质的属性列,本身并不带有时间或者某一个特定维度上的区分。使用哈希分区策略来对其进行分表处理则是一个较为理想的选择。相比其他分区类型,除了预先确保分区键没有过多数据倾斜(某一、某几个值重复度高),只需要指定分区键和分区数即可创建分区,同时还能够确保每个分区的数据均匀,提升了分区表的易用性。 父主题: 分区策略
  • 对二级分区表清空二级分区 使用ALTER TABLE TRUNCATE SUBPARTITION可以清空二级分区表的一个二级分区。 例如,通过指定分区名清空二级分区表range_list_sales的二级分区date_202005_channel1,并更新Global索引。 ALTER TABLE range_list_sales TRUNCATE SUBPARTITION date_202005_channel1 UPDATE GLOBAL INDEX; 或者,通过指定分区值来清空二级分区表range_list_sales中('2020-05-08', '0')所对应的二级分区。由于不带UPDATE GLOBAL INDEX子句,执行该命令后Global索引会失效。 ALTER TABLE range_list_sales TRUNCATE SUBPARTITION FOR ('2020-05-08', '0'); 父主题: 清空分区
  • 事务回滚 回滚是在事务运行的过程中发生了故障等异常情形下,事务不能继续执行,系统需要将事务中已完成的修改操作进行撤销。Astore、Ubtree没有回滚段,自然没有这个专门的回滚动作。Ustore为了性能考虑,它的回滚流程结合了同步、异步和页面级回滚等3种形式。 同步回滚 有三种情况会触发事务的同步回滚: 事务块中的ROLLBACK关键字会触发同步回滚。 事务运行过程中如果发生ERROR级别报错,此时的COMMIT关键字与ROLLBACK功能相同,也会触发同步回滚。 事务运行过程中如果发生FATAL/PANIC级别报错,在线程退出前会尝试将该线程绑定的事务进行一次同步回滚。 异步回滚 同步回滚失败或者在系统宕机后再次重启时,会由Undo回收线程为未回滚完成的事务发起异步回滚任务,立即对外提供服务。由异步回滚任务发起线程undo launch负责拉起异步回滚工作线程undo worker,再由异步回滚工作线程实际执行回滚任务。undo launch线程最多可以同时拉起5个undo worker线程。 页面级回滚 当事务需要回滚但还未回滚到本页面时,如果其他事务需要复用该事务所占用的TD,就会在复用前对该事务在本页面的所有修改执行页面级回滚。页面级回滚只负责回滚事务在本页面的修改,不涉及其他页面。 Ustore子事务的回滚由ROLLBACK TO SAVEPOINT语句控制,子事务回滚后父事务可以继续运行,子事务的回滚不影响父事务的事务状态。如果一个事务在回滚时还存在未释放的子事务,该事务回滚前会先执行子事务的回滚,所有子事务回滚完毕后才会进行父事务的回滚。 父主题: Ustore事务模型
  • 调用isValid方法刷新缓存示例 // 创建连接conn1 Connection conn1 = DriverManager.getConnection("url","user","password"); // 在另外一个连接conn2中创建客户端主密钥 ... // conn1通过调用isValid刷新缓存,刷新conn1密钥缓存 try { if (!conn1.isValid(60)) { System.out.println("isValid Failed for connection 1"); } } catch (SQLException e) { e.printStackTrace(); return null; }
  • 执行密态等值密文解密 数据库连接接口PgConnection类型新增解密接口,可以对全密态数据库的密态等值密文进行解密。解密后返回其明文值,通过schema.table.column找到密文对应的加密列并返回其原始数据类型。 表1 新增com.huawei.gaussdb.jdbc.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 新增com.huawei.gaussdb.jdbc.jdbc.clientlogic.ClientLogicDecryptResult函数接口 方法名 返回值类型 描述 支持JDBC4 isFailed() Boolean 解密是否失败,若失败返回True,否则返回False。 Yes getErrMsg() String 获取错误信息。 Yes getPlaintext() String 获取解密后的明文。 Yes getPlaintextSize() Integer 获取解密后的明文长度。 Yes getOriginalType() String 获取加密列的原始数据类型。 Yes // 通过非密态连接、逻辑解码等其他方式获得密文后,可使用该接口对密文进行解密 import com.huawei.gaussdb.jdbc.jdbc.PgConnection; import com.huawei.gaussdb.jdbc.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())); }
  • 执行加密表的预编译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();
  • 对二级分区表合并二级分区 使用ALTER TABLE MERGE SUBPARTITIONS可以将多个二级分区合并为一个分区。 例如,将二级分区表hash_list_sales的分区product1_channel1、product1_channel2、product1_channel3合并为一个新的分区,并更新Global索引。 ALTER TABLE hash_list_sales MERGE SUBPARTITIONS product1_channel1, product1_channel2, product1_channel3 INTO SUBPARTITION product1_channel1 UPDATE GLOBAL INDEX; 父主题: 合并分区
  • 间隔分区 间隔分区(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分区的上边界,会自动创建一个分区。 间隔分区仅支持数值类型和日期/时间类型,不支持字符类型和其他类型。支持类型白名单如下: INT1/UINT1、INT2/UINT2、INT4/UINT4、INT8/UINT8、FLOAT4、FLOAT8、NUMERIC、DATE、TIMESTAMP、TIMESTAMP WITH TIME ZONE。 父主题: 分区策略
  • 分区表行迁移 用户可以使用ALTER TABLE ENABLE/DISABLE ROW MOVEMENT来开启/关闭分区表行迁移。 开启行迁移时,允许通过更新操作将一个分区中的数据迁移到另一个分区中;关闭行迁移时,如果出现这种更新行为,则业务报错。 如果业务明确不允许对分区键所在列进行更新操作,建议关闭分区表行迁移。 例如,创建列表分区表,并开启分区表行迁移,此时可以跨分区更新分区键所在列;关闭分区表行迁移后,对分区键所在列进行跨分区更新会业务报错。 CREATE TABLE list_sales ( product_id INT4 NOT NULL, customer_id INT4 PRIMARY KEY, time_id DATE, channel_id CHAR(1), type_id INT4, quantity_sold NUMERIC(3), amount_sold NUMERIC(10,2) ) PARTITION BY LIST (channel_id) ( PARTITION channel1 VALUES ('0', '1', '2'), PARTITION channel2 VALUES ('3', '4', '5'), PARTITION channel3 VALUES ('6', '7'), PARTITION channel4 VALUES ('8', '9') ) ENABLE ROW MOVEMENT; INSERT INTO list_sales VALUES (153241,65143129,'2021-05-07','0',864134,89,34); --跨分区更新成功,数据从分区channel1迁移到分区channel2 UPDATE list_sales SET channel_id = '3' WHERE channel_id = '0'; --关闭分区表行迁移 ALTER TABLE list_sales DISABLE ROW MOVEMENT; --跨分区更新失败,报错fail to update partitioned table "list_sales" UPDATE list_sales SET channel_id = '0' WHERE channel_id = '3'; --分区内更新依然成功 UPDATE list_sales SET channel_id = '4' WHERE channel_id = '3'; 父主题: 分区表运维管理
  • RCR Uheap空闲空间管理 Ustore使用Free Space Map(FSM)文件记录了每个数据页的潜在空闲空间,并且以树的结构组织起来。每当用户想要对某个表执行插入操作或者是非原位更新操作时,就会从该表对应的FSM中进行快速查找,查看当前FSM上记录的最大空闲空间是否可以满足插入所需的空间要求。如果满足则返回对应的blocknum用于执行插入操作,否则执行拓展页面逻辑。 每一个表或者分区对应的FSM结构存放在一个独立的FSM文件中,该FSM文件与表数据放在相同的目录下。例如,假设表t1对应的数据文件为32181,则其对应的FSM文件为32181_fsm。FSM内部同样是以数据块的格式存储,这里称为FSM block,FSM block之间的逻辑结构组成了一棵有三层节点的树,树的节点在逻辑上是大顶堆关系。每次在FSM上查找时从根节点进行,一直查找到叶子节点,然后在叶子节点内搜索到一个可用的页面并返回给业务用于执行后续操作。 该结构不保证和数据页实际可用空间保持实时一致,会在DML的执行过程中进行维护。Ustore会在Auto Vacuum的过程中概率性对该FSM进行修复重建。当用户执行插入类型的DML语句,类似Insert/Non-Inplace Update(新页面)/Multi Insert时,会查询FSM结构,寻找到一个可以插入当前记录的空间。用户执行完DML操作后会根据当前页面的潜在空闲空间与实际空闲空间的差值来决定是否将该页面的空闲空间刷新到FSM上。该差值越大,即潜在空间大于实际空间越多,则该页面被更新至FSM的几率越大。FSM上会记录数据页的潜在空闲空间 ,在用户执行插入操作找到一个页面时,如果该页面上的空闲空间较大则直接插入,否则如果潜在空间较大则对页面执行清理后插入,最后如果空间不够则重新搜索FSM结构或者拓展总页面数量。更新FSM结构主要有以下几个位置,DML、页面清理、vacuum、拓展页面、分区合并、页面扫描等。 父主题: RCR Uheap
  • 对二级分区表移动二级分区 使用ALTER TABLE MOVE SUBPARTITION可以对二级分区表移动二级分区。 例如,通过指定分区名将二级分区表range_list_sales的分区date_202001_channel1移动到表空间tb1中。 ALTER TABLE range_list_sales MOVE SUBPARTITION date_202001_channel1 TABLESPACE tb1; 或者,通过指定分区值将二级分区表range_list_sales中('2020-01-08', '0')所对应的分区移动到表空间tb1中。 ALTER TABLE range_list_sales MOVE SUBPARTITION FOR ('2020-01-08', '0') TABLESPACE tb1; 父主题: 移动分区
共100000条