华为云用户手册

  • 使用控制台安装插件 在CCE服务控制台,单击集群名称进入对应集群,单击左侧导航栏的“插件中心”,在右侧找到dew-provider插件,单击“安装”。 在安装插件页面,在参数配置栏进行参数配置。参数配置说明如表 参数配置表所示。 表2 参数配置表 参数 参数说明 rotation_poll_interval 轮转时间间隔。单位:分钟,即m(注意不是min)。 轮转时间间隔表示向云凭据管理服务发起请求并获取最新的凭据的周期,合理的时间间隔范围为[1m, 1440m],默认值为2m。 单击“安装”。待插件安装完成后,选择对应的集群,然后单击左侧导航栏的“插件中心”,可在“已安装插件”页签中查看相应的插件。 插件成功使用需使用已在数据加密服务中创建好的凭据,否则挂载失败会导致Pod无法运行。具体创建凭据操作请参见创建通用凭据。 插件安装完成后即可进行使用,具体操作步骤参见CCE密钥管理插件使用说明。
  • 组件说明 表1 dew-provider组件 容器组件 说明 资源类型 dew-provider dew-provider负责与凭据管理服务交互,从凭据管理服务中获取指定的凭据,并挂载到业务Pod内。 DaemonSet secrets-store-csi-driver secrets-store-csi-driver负责维护两个CRD资源,即SecretProviderClass(以下简称为SPC)和SecretProviderClassPodStatus(以下简称为spcPodStatus),其中SPC用于描述用户感兴趣的凭据信息(比如指定凭据的版本、凭据的名称等),由用户创建,并在业务Pod中进行引用;spcPodStatus用于跟踪Pod与凭据的绑定关系,由csi-driver自动创建,用户无需关心。一个Pod对应一个spcPodStatus,当Pod正常启动后,会生成一个与之对应的spcPodStatus;当Pod生命周期结束时,相应的spcPodStatus也会被删除。 DaemonSet
  • 简介 单用户凭据轮换是指一个凭据中更新一个用户所保存的信息。 这是最基础的凭据轮换策略,适用于大多数日常使用场景。 例如: 访问数据库。凭据轮换时不会删除数据库连接,轮换后的新连接使用新凭据。 访问允许用户创建一个用户帐户的服务,例如以电子邮件地址作为用户名。服务通常允许用户根据需要经常更改密码,但用户无法创建其他用户或更改用户名。 根据需要创建的用户,称为临时用户。 以交互方式输入密码的用户,而不是让应用程序以编程方式从凭据管理服务中检索密码。这种类型的用户不需要更改他们的用户名和密码。
  • 列存表支持的数据类型 列存表支持的数据类型如表1所示。 表1 列存表支持的数据类型 类别 数据类型 长度 是否支持 Numeric Types smallint 2 支持 integer 4 支持 bigint 8 支持 decimal -1 支持 numeric -1 支持 real 4 支持 double precision 8 支持 smallserial 2 支持 serial 4 支持 bigserial 8 支持 Monetary Types money 8 支持 Character Types character varying(n), varchar(n) -1 支持 character(n), char(n) n 支持 character、char 1 支持 text -1 支持 nvarchar2 -1 支持 name 64 不支持 Date/Time Types timestamp with time zone 8 支持 timestamp without time zone 8 支持 date 4 支持 time without time zone 8 支持 time with time zone 12 支持 interval 16 支持 big object clob -1 支持 blob -1 不支持 other types … … 不支持 父主题: 数据类型
  • 注意事项 目前仅支持ALTER PACKAGE OWNER功能,系统管理员默认拥有该权限,有以下权限约束: 当前用户必须是该PACKAGE的所有者或者系统管理员,且该用户是新所有者角色的成员。 重编译包需要设置plpgsql_dependency参数。 当打开三权分立时,即使是系统管理员,也必须拥有用户组权限才能修改PACKAGE的owner。 只有初始化用户才能修改package的owner为初始化用户。 三权分立模式下,DEFINER类型package不允许修改属主。非三权分立模式下,仅系统管理员以上权限可以修改package属主。 不允许系统管理员将DEFINER类型的package的属主改为初始用户或运维管理员。
  • 示例 请参见CREATE PACKAGE中示例。 重编译示例: -- 开启依赖功能 SET behavior_compat_options ='plpgsql_dependency'; -- 创建函数 CREATE OR REPLACE PACKAGE TEST_PKG AS pkg_var int := 1; PROCEDURE test_pkg_proc(var int); END TEST_PKG; / CREATE OR REPLACE PACKAGE BODY TEST_PKG AS PROCEDURE test_pkg_proc(var int) IS BEGIN pkg_var := 1; END; END TEST_PKG; / -- 重编译包 ALTER PACKAGE TEST_PKG COMPILE; -- 删除包 DROP PACKAGE TEST_PKG; -- 关闭依赖功能 SET behavior_compat_options = '';
  • 参数说明 client_master_key_name 该参数作为密钥对象名,在同一命名空间下,需满足命名唯一性约束。 取值范围:字符串,需符合标识符命名规范。 KEY_STORE 外部密钥管理者。取值见表1。 KEY_PATH 由外部密钥管理者管理某个的密钥,不同密钥管理者格式不同。取值为字符串,详见表1。字符串由单引号或双引号包含,如果字符串长度超过64,则只能使用单引号包含。 ALGORITHM 密钥用于何种加密算法。取值见表1。 表1 针对不同密钥管理者的参数值 KEY_STORE KEY_PATH ALGORITHM huawei_kms 格式:‘{KmsApiUrl}/{密钥ID}' 参考:'https://kms.{项目}.myhuaweicloud.com/v1.0/{项目ID}/kms/{密钥ID}' 示例:'https://kms.cn-north-4.myhuaweicloud.com/v1.0/00000000000000000000000000000000/kms/00000000-0000-0000-0000-000000000000' AES_256 gs_ktool 格式:"gs_ktool/{密钥ID}" 示例:"gs_ktool/1" AES_256_CBC AES_256_GCM SM4
  • 示例(在使用gsql连接数据库服务器的场景下) # 1 解压GaussDB-Kernel_数据库版本号_操作系统版本号_64bit_Gsql.tar.gz安装包,找到脚本gsql_env.sh # 2 通过脚本,自动配置环境变量GS_KTOOL_FILE_PATH source gsql_env.sh # 3 创建密钥,返回密钥ID,密钥ID为1 gs_ktool -g # 4 连接数据库,使用特权账号,创建新用户 alice gsql -p 端口号 -d postgres -r gaussdb=# CREATE USER alice PASSWORD '*******'; gaussdb=# \q # 5 连接数据库,务必使用 -C 参数 gsql -p 端口号 -d postgres -U alice -r -C gaussdb=# -- 6 创建主密钥 gaussdb=# CREATE CLIENT MASTER KEY alice_cmk WITH ( KEY_STORE = gs_ktool , KEY_PATH = "gs_ktool/1" , ALGORITHM = AES_256_CBC);
  • 数据损坏检测修复函数 修复主机备机文件页面的约束概述: 文件类型 文件页面级别 主备机 检测修复 普通行存表(astore)、段页式表(不包括hashbucket表),不包括索引 文件&页面 主机 手动检测手动修复。 unlogged表的init fork文件 文件 主机 手动检测手动修复。 普通行存表(astore)、索引(btree) 页面 备机 回放过程中自动检测自动修复。 备机修复支持备集群的首备和级联备。 gs_verify_data_file(verify_segment bool) 描述:校验当前实例当前库是否存在文件丢失的情况。校验只包括数据表主文件是否有中间段丢失的情况。默认参数是false,表示不校验段页式表数据文件。参数设置为true时仅校验段页式表文件。默认只有初始用户、具有sysadmin属性的用户以及在运维模式下具有运维管理员属性的用户可以查看,其余用户需要赋权后才可以使用。 返回的结果: 非段页式表:rel_oid和rel_name是对应文件的表oid和表名,miss_file_path表示丢失文件的相对路径。 段页式表:因所有表存放在相同文件中,所以rel_oid和rel_name无法显示具体表的信息。对于段页式表,如果第一个文件损坏,不会检查出后面的.1 .2等文件。例如3、3.1、3.2损坏,只能检查出3损坏。当段页式文件不足5个时,使用函数检测时,未生成的文件也会校验出来,例如只有1和2文件,校验段页式时,也会检测出3,4,5文件。以下示例,第一个是校验非段页式表的示例,第二是校验段页式表的示例。 参数说明: verify_segment 指定文件校验的范围。false校验非段页式表;true校验段页式表。 取值范围:true和false,默认是false。 返回值类型:record 示例: 校验非段页式表 gaussdb=# select * from gs_verify_data_file(); node_name | rel_oid | rel_name | miss_file_path ------------------+---------+--------------+------------------ dn_6001_6002_6003 | 16554 | test | base/16552/24745 校验段页式表 gaussdb=# select * from gs_verify_data_file(true); node_name | rel_oid | rel_name | miss_file_path -------------------+---------+----------+---------------- dn_6001_6002_6003 | 0 | none | base/16573/2 gs_repair_file(tableoid Oid,path text, timeout int) 描述:根据传入的参数修复文件,仅支持有正常主备连接的主DN使用。参数依据gs_verify_data_file函数返回的oid和路径填写。段页式表tableoid赋值为0到4,294,967,295的任意值(内部校验根据文件路径判断是否是段页式表文件,段页式表文件则不使用tableoid)。修复成功返回值为true,修复失败会显示具体失败原因。默认只有在主DN节点上,使用初始用户、具有sysadmin属性的用户以及在运维模式下具有运维管理员属性的用户可以查看,其余用户需要赋权后才可以使用。 当DN实例上存在文件损坏时,进行升主会校验出错,报PANIC退出无法升主,为正常现象。 当文件存在但是大小为0时,此时不会去修复该文件,若想要修复该文件,需要将为0的文件删除后再修复。 删除文件需要等文件句柄(fd,file descriptor)自动关闭后再修复,人工操作可以执行重启进程,主备切换等命令。 参数说明: tableoid 要修复的文件对应的表oid,依据gs_verify_data_file函数返回的列表中rel_oid一列填写。 取值范围: Oid,0 - 4294967295。注意:输入负值等数值都会被强制转成非负整数类型。 path 需要修复的文件路径,依据gs_verify_data_file函数返回的列表中miss_file_path一列填写。 取值范围:字符串。 timeout 等待备DN回放的时长,修复文件需要等待备DN回放到当前主DN对应的位置,根据备DN回放所需时长设定。 取值范围:60s - 3600s。 返回值类型:bool 示例: gaussdb=# select * from gs_repair_file(16554,'base/16552/24745',360); gs_repair_file ---------------- t local_bad_block_info() 描述:显示本实例页面损坏的情况。从磁盘读取页面,发现页面CRC校验失败时进行记录。默认只有初始用户、具有sysadmin属性的用户、具有监控管理员属性的用户以及在运维模式下具有运维管理员属性的用户、以及监控用户可以查看,其余用户需要赋权后才可以使用。file_path是损坏文件的相对路径,如果是段页式表,则显示的是逻辑信息,不是实际的物理文件信息。block_num是该文件损坏的具体页面号,页面号从0开始。check_time表示发现页面损坏的时间。repair_time表示修复页面的时间。 返回值类型:record 示例: gaussdb=# select * from local_bad_block_info(); node_name | spc_node | db_node | rel_node| bucket_node | fork_num | block_num | file_path | check_time | repair_time -----------------+-------+--------+--------+--------------+----------+-----------+-----------------+--------------------------+------------------------------- dn_6001_6002_6003| 1663 | 16552 | 24745 | -1 | 0 | 0 | base/16552/24745 | 2022-01-13 20:19:08.385004+08 | 2022-01-13 20:19:08.407314+08 remote_bad_block_info() 描述:CN上查询时,查询除本实例以外其他实例页面损坏的情况,记录数据和在其他实例上执行local_bad_block_info函数一致。DN上执行结果为空。默认只有初始用户、具有sysadmin属性的用户、具有监控管理员属性的用户以及在运维模式下具有运维管理员属性的用户、以及监控用户可以查看,其余用户需要赋权后才可以使用。 返回值类型:record local_clear_bad_block_info() 描述:清理local_bad_block_info中已修复页面的数据,也就是repair_time不为空的信息。默认只有初始用户、具有sysadmin属性的用户以及在运维模式下具有运维管理员属性的用户、以及监控用户可以查看,其余用户需要赋权后才可以使用。 返回值类型:bool 示例: gaussdb=# select * from local_clear_bad_block_info(); result -------- t remote_clear_bad_block_info() 描述:CN上执行时,清理除本实例以外其他实例已修复页面的数据,也就是repair_time不为空的信息。DN上执行结果为空。默认只有初始用户、具有sysadmin属性的用户以及在运维模式下具有运维管理员属性的用户、以及监控用户可以查看,其余用户需要赋权后才可以使用。 返回值类型:record gs_verify_and_tryrepair_page (path text, blocknum Oid, verify_mem bool, is_segment bool) 描述:校验本实例指定页面的情况。默认只有在主DN节点上,使用初始用户、具有sysadmin属性的用户以及在运维模式下具有运维管理员属性的用户可以查看,其余用户需要赋权后才可以使用。返回的结果信息,disk_page_res表示磁盘上页面的校验结果,mem_page_res表示内存中页面的校验结果,is_repair表示在校验的过程中是否触发修复功能,t表示已修复,f表示未修复。 注意: 当DN实例上存在页面损坏时,进行升主会校验出错,报PANIC退出无法升主,为正常现象。不支持hashbucket表页面损坏的修复。 此函数触发的修复仅支持修复内存中的页面,需要在内存页面落盘后物理页面修复才能正式生效。 参数说明: path 损坏文件的路径,依据local_bad_block_info中file_path一列填写。 取值范围:字符串。 blocknum 损坏文件的页号,依据local_bad_block_info中block_num一列填写。 取值范围:Oid,0 - 4294967295。注意:输入负值等都会被强制转成非负整数类型。 verify_mem 指定是否校验内存中的指定页面。设定为false时,只校验磁盘上的页面。设置为true时,校验内存中的页面和磁盘上的页面。如果发现磁盘上页面损坏,会将内存中的页面做一个基本信息校验刷盘,修复磁盘上页面。如果校验内存页面时发现页面不在内存中,会经内存接口读取磁盘上的页面。此过程中如果磁盘页面有问题,则会触发远程读自动修复功能。 取值范围:bool,true和false。 is_segment 是否是段页式表。根据local_bad_block_info中的bucket_node列值决定。如果bucket_node为-1时,表示不是段页式表,将is_segment设置为false;非-1的情况将is_segment设置为true。 取值范围:bool,true和false。 返回值类型:record 示例: gaussdb=# select * from gs_verify_and_tryrepair_page('base/16552/24745',0,false,false); node_name | path | blocknum | disk_page_res | mem_page_res | is_repair ------------------+------------------+------------+-----------------------------+---------------+---------- dn_6001_6002_6003 | base/16552/24745 | 0 | page verification succeeded.| | f gs_repair_page(path text, blocknum Oid is_segment bool, timeout int) 描述:修复本实例指定页面,仅支持有正常主备连接的主DN使用。默认只有在主DN节点上,使用初始用户、具有sysadmin属性的用户以及在运维模式下具有运维管理员属性的用户可以查看,其余用户需要赋权后才可以使用。页面修复成功返回true,修复过程中出错会有报错信息提示。 注意:当DN实例上存在页面损坏时,进行升主会校验出错,报PANIC退出无法升主,为正常现象。不支持hashbucket表页面损坏的修复。 参数说明 path 损坏页面的路径。根据local_bad_block_info中file_path一列设置,或者是gs_verify_and_tryrepair_page函数中path一列设置。 取值范围:字符串。 blocknum 损坏页面的页面号。根据local_bad_block_info中block_num一列设置,或者是gs_verify_and_tryrepair_page函数中blocknum一列设置。 取值范围:Oid,0 - 4294967295。注意:输入负值等数值都会被强制转成非负整数类型。 is_segment 是否是段页式表。根据local_bad_block_info中的bucket_node列值决定,如果bucket_node为-1时,表示不是段页式表,将is_segment设置为false,非-1的情况将is_segment设置为true。 取值范围:bool,true或者false。 timeout 等待备DN回放的时长。修复页面需要等待备DN回放到当前主DN对应的位置,根据备DN回放所需时长设定。 取值范围:60s - 3600s。 返回值类型:bool 示例: gaussdb=# select * from gs_repair_page('base/16552/24745',0,false,60); result -------- t gs_verify_urq(index_oid oid, partindex_oid oid, blocknum bigint, queue_type text) 描述:校验索引回收队列(潜在队列/可用队列/单页面)的正确性。 参数说明:详见表1。 返回值类型:record 表1 gs_verify_urq参数说明 参数类型 参数名 类型 描述 输入参数 index_oid oid UBTree索引oid: 普通索引:索引oid。 全局索引:GPI oid。 local索引:主索引oid。 输入参数 partindex_oid oid UBTree分区索引oid: 普通索引:0。 全局索引:0。 local索引:分区索引oid(一级/二级)。 输入参数 blocknum bigint 页面号: 队列类型为single page时,校验单个页面blocknum的所有元组正确性。取值范围为[0, 队列文件大小/8192)。 队列类型为empty queue或free queue时,blocknum是一个无效值。 输入参数 queue_type text 队列类型: empty queue:潜在队列。 free queue:可用队列。 single page:队列单页面。 输出参数 error_code text 错误码。 输出参数 detail text 具体报错及其他关键信息。 示例1: gaussdb=# select * from gs_verify_urq(16387, 0, 1, 'free queue'); error_code | detail ------------+-------- (0 rows) 示例2: gaussdb=# select * from gs_verify_urq(16387, 0, 1, 'empty queue'); error_code | detail -----------------------+--------------------------------------------------------------------------------------------------------------- VERIFY_URQ_PAGE_ERROR | invalid urq meta: oid 16387, blkno 1, head_blkno = 1, tail_blkno = 3, nblocks_upper = 4294967295, nblocks_lower = 1; urq_blocks = 6, index_blocks = 12 (1 row) 该接口当前仅支持USTORE索引表。如果索引回收队列校验正常,则该视图不输出错误码和报错详细信息,否则输出错误码和报错详细信息,错误码包含"VERIFY_URQ_PAGE_ERROR"、"VERIFY_URQ_LINK_ERROR"、"VERIFY_URQ_HEAD_MISSED_ERROR"和"VERIFY_URQ_TAIL_MISSED_ERROR",如出现以上错误码,请联系华为工程师辅助定位。 gs_urq_dump_stat(index_oid oid, partindex_oid oid) 描述:查询指定索引回收队列相关信息。 显示信息:recentGlobalDataXmin和globalFrozenXid是回收队列判断索引页面是否可以被回收时使用的两个oldestxmin,next_xid为下一个最新的事务xid,urq_blocks为回收队列总页面数以及free queue(可用队列)、empty queue(潜在队列)有效页面里的相关信息。 参数说明:详见表2。 表2 gs_urq_dump_stat参数说明 参数类型 参数名 类型 描述 输入参数 index_oid oid UBTree索引oid: 普通索引:索引oid。 全局索引:GPI oid。 local索引:主索引oid。 输入参数 partindex_oid oid UBTree分区索引oid: 普通索引:0。 全局索引:0。 local索引:分区索引oid(一级/二级)。 输出参数 result text 索引回收队列的详细统计信息。 示例: gaussdb=# select * from gs_urq_dump_stat(16387, 0); result --------------------------------------------------------------------------------------------------------------------------------- urq stat info: recentGlobalDataXmin = 213156, globalFrozenXid = 213156, next_xid = 214157, urq_blocks = 6, + free queue: head page blkno = 0 min_xid = 211187 max_xid = 214157, tail page blkno = 0 min_xid = 211187 max_xid = 214157,+ middle page min_xid = 1152921504606846975 max_xid = 0, valid_pages = 1, valid_items = 6, can_use_item = 3 + empty queue: head page blkno = 1 min_xid = 212160 max_xid = 213160, tail page blkno = 3 min_xid = 213162 max_xid = 214156,+ middle page min_xid = 1152921504606846975 max_xid = 0, valid_pages = 2, valid_items = 999, can_use_item = 498 + (1 row) 该接口当前仅支持USTORE索引表。 gs_repair_urq(index_oid oid, partindex_oid oid) 描述:重建(有损)索引回收队列(潜在队列和可用队列)。删除当前索引的回收队列文件,重新创建一个空的回收队列文件。重建成功显示reinitial the recycle queue of index relation sucessfully。 参数说明:详见表3。 备注:当前函数仅支持在主节点进行调用。 表3 gs_repair_urq参数说明 参数类型 参数名 类型 描述 输入参数 index_oid oid UBTree索引oid: 普通索引:索引oid。 全局索引:GPI oid。 local索引:主索引oid。 输入参数 partindex_oid oid UBTree分区索引oid: 普通索引:0。 全局索引:0。 local索引:分区索引oid(一级/二级)。 输出参数 result text 重建成功显示reinitial the recycle queue of index relation sucessfully。 示例: gaussdb=# select * from gs_repair_urq(16387, 0); result ------------------------------------------------------------ reinitial the recycle queue of index relation sucessfully. (1 row) 该接口当前仅支持USTORE索引表。 gs_get_standby_bad_block_info() 描述:显示备机上已经检测到但是还未修复的页面。默认只有在备DN节点上,使用初始用户、具有sysadmin权限的用户以及在运维模式下具有运维管理员权限的用户、以及监控用户可以查看,其余用户需要赋权后才可以使用。返回值invalid_type列共有4种类型:NOT_PRESENT(页面不存在)、 NOT_INITIALIZED(页面初始化失败)、 LSN_CHECK_ERROR(LSN校验失败)、CRC_CHECK_ERROR(CRC校验失败)。 返回值类型:record 示例: gaussdb=# select * from gs_get_standby_bad_block_info(); spc_node | db_node | rel_node | bucket_node | fork_num | block_num | invalid_type | master_page_lsn ----------+---------+----------+-------------+----------+-----------+-----------------+----------------- 1663 | 16552 | 24745 | -1 | 0 | 0 | CRC_CHECK_ERROR | 0/B2009E8 (1 rows) 父主题: 函数和操作符
  • FunctionGraph函数支持哪些编程语言? FunctionGraph目前支持的编程语言,如表1所示。 表1 支持的编程语言和版本 语言 支持版本 Python 2.7、3.6、3.9、3.10 Node.js 6.10、8.10、10.16、12.13、14.18、16.17、18.15 Java 8、11 Go 1.x、1.8 C#.NET Core 2.0、2.1、3.1 PHP 7.3 父主题: 通用问题
  • 为Python函数制作依赖包 打包环境中的Python版本要和对应函数的运行时版本相同,如Python2.7建议使用2.7.12及以上版本,Python3.6建议使用3.6.3以上版本。 为Python 2.7安装PyMySQL依赖包,并指定此依赖包的安装路径为本地的/tmp/pymysql下,可以执行如下命令。 pip install PyMySQL --root /tmp/pymysql 执行成功后,执行以下命令。 cd /tmp/pymysql/ 进入子目录直到site-packages路径下(一般路径为usr/lib64/python2.7/site-packages/),接下来执行以下命令。 zip -rq pymysql.zip * 所生成的包即为最终需要的依赖包。 如果需要安装存放在的本地wheel安装包,直接输入: pip install piexif-1.1.0b0-py2.py3-none-any.whl --root /tmp/piexif //安装包名称以piexif-1.1.0b0-py2.py3-none-any.whl为例,请以实际安装包名称为准
  • 搭建EulerOS环境 EulerOS是基于开源技术的企业级Linux操作系统软件,具备高安全性、高可扩展性、高性能等技术特性,能够满足客户IT基础设施和云计算服务等多业务场景需求。此处推荐Huawei Cloud EulerOS。 在华为云购买一台EulerOS的ECS弹性云服务器,请参见购买并登录Linux弹性云服务器。在基础配置环节选择公共镜像时,选择Huawei Cloud EulerOS操作系统和具体的镜像版本。 下载EulerOS镜像,在本地使用虚拟化软件搭建EulerOS系统的虚拟机。
  • 为Nodejs函数制作依赖包 需要先保证环境中已经安装了对应版本的Nodejs。 为Nodejs 8.10安装MySQL依赖包,可以执行如下命令。 npm install mysql --save 可以看到当前目录下会生成一个node_modules文件夹。 Linux系统 Linux系统下可以使用以下命令生成zip包。 zip -rq mysql-node8.10.zip node_modules 即可生成最终需要的依赖包。 windows系统 用压缩软件将node_modules目录压缩成zip文件即可。 如果需要安装多个依赖包,也可以先新建一个package.json文件,例如在package.json中填入如下内容后,执行如下命令。 { "name": "test", "version": "1.0.0", "dependencies": { "redis": "~2.8.0", "mysql": "~2.17.1" } } npm install --save 不要使用CNPM命令制作nodejs依赖包。 然后将node_modules打包成zip即可生成一个既包含MySQL也包含redis的依赖包。 Nodejs其他版本制作依赖包过程与上述相同。
  • 为PHP函数制作依赖包 制作函数依赖包推荐在EulerOS2.9.6环境中进行。 为php7.3通过composer安装protobuf3.19依赖包,默认环境中已经安装了composer和对应版本的php。 新建一个composer.json文件,在composer.json中填入以下内容。 { "require": { "google/protobuf": "^3.19" } } 执行如下命令。 Composer install 可以看到当前目录底下生成一个vendor文件夹,文件夹中有autoload.php、composer 和google三个文件夹。 Linux系统 Linux系统下可以使用以下命令生成zip包。 zip –rq vendor.zip vendor windows系统 用压缩软件将vendor目录压缩成zip文件即可。 如果要安装多个依赖包,在composer.json文件中指定需要的依赖,把生成的vendor文件整体打包成zip上传。 php工程代码中使用通过composer下载的第三方依赖时,需要通过require "./vendor/autoload.php" 加载,平台默认把上传的zip包解压后的内容置于项目代码的同级目录下。
  • 步骤三:调试API 在完成API创建后,可以先对API进行调试,确保API的功能正常。 在“API运行”页面中,在左侧选择步骤二:创建API创建的API,然后单击右上角的“调试”。 因为该API未定义请求参数,在调试API页面中直接单击API URL右侧的“调试”,进行API调用测试。 在页面下方可查看调用API发送的请求消息及响应消息。 若调用成功,则会返回成功响应消息体。此处的成功响应消息应为“ROMA TEST!”。 图6 API调试 调试完成后,单击“调试”按钮右侧的“”,返回API的详情信息页面。
  • 概述 ROMA Connect支持将API、数据源和自定义函数封装成标准的RESTful API,并对外开放。ROMA Connect为API提供了完整的生命周期管理和多层的安全防护管理。 本章节通过完成一个使用ROMA Connect开放API的配置样例,帮助您快速熟悉使用ROMA Connect集成服务的过程。 使用ROMA Connect集成服务的步骤如下所示: 步骤一:创建API分组 步骤二:创建API 步骤三:调试API 步骤四:发布API 步骤五:调用API
  • 入门实践 当您创建了ROMA Connect实例之后,可以根据自身的业务需求使用ROMA Connect提供的常用实践。 表1 常用实践 实践 说明 传统停车场管理系统数字化改造 介绍如何通过ROMA Connect对传统停车场的管理系统进行数字化改造,实现停车场车辆进出、计费、停车位状态的智能化管理。 企业数据以API形式开放共享 介绍如何通过ROMA Connect的服务集成,快速把数据库开放为RESTful API,不同业务系统间的数据以API方式互相开放访问,同时在开放API时可选择多种安全认证方式,实现跨网络跨地域应用系统数据间的安全访问。 跨系统业务数据集成与转换 介绍如何通过ROMA Connect的数据集成,把业务系统A中的数据进行格式转换后,集成到业务系统B的数据库中使用。后续根据制定的同步计划,定时把业务系统A中新增的数据同步到业务系统B中,保证了两个系统间的数据同步。
  • Plan Hint实际调优案例 本节以TPC-DS标准测试的Q24的部分语句为例,在1000X,24DN环境上,说明使用plan hint进行实际调优的过程。示例如下: 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 select avg(netpaid) from (select c_last_name ,c_first_name ,s_store_name ,ca_state ,s_state ,i_color ,i_current_price ,i_manager_id ,i_units ,i_size ,sum(ss_sales_price) netpaid from store_sales ,store_returns ,store ,item ,customer ,customer_address where ss_ticket_number = sr_ticket_number and ss_item_sk = sr_item_sk and ss_customer_sk = c_customer_sk and ss_item_sk = i_item_sk and ss_store_sk = s_store_sk and c_birth_country = upper(ca_country) and s_zip = ca_zip and s_market_id=7 group by c_last_name ,c_first_name ,s_store_name ,ca_state ,s_state ,i_color ,i_current_price ,i_manager_id ,i_units ,i_size); 该语句的初始计划如下,运行时间110s: 该计划中,第10层算子使用broadcast性能较差,由于第11层算子估算行数为2140,比实际行数严重低估。错误行数估算主要来源于第13层算子的行数低估,根因是第13层hashjoin中,使用store_sales的(ss_ticket_number, ss_item_sk)列和store_returns的(sr_ticket_number, sr_item_sk)列进行关联,由于缺少多列相关性的估算导致行数严重低估。 2. 使用如下的rows hint进行调优后,计划如下,运行时间318s: 1 2 select avg(netpaid) from (select /*+rows(store_sales store_returns * 11270)*/ c_last_name ... 时间反而劣化了,原因是第8层hashjoin过慢引起第9层redistribute时间过慢导致,其中第9层redistribute并没有数据倾斜,hashjoin慢的原因是由于第18层redistribute后数据倾斜导致。 3. 经过实际数据查证,customer_address的两个join列的不同值数目较少,使用其进行join容易出现数据倾斜,故把customer_address放到最后进行join。使用如下的hint进行调优后,计划如下,运行时间116s: 1 2 3 4 select avg(netpaid) from (select /*+rows(store_sales store_returns *11270) leading((store_sales store_returns store item customer) customer_address)*/ c_last_name ... 发现时间基本花在了第6层redistribute算子上,需要进一步优化。 4. 由于最后一层redistribute包含倾斜,所以时间较长。为了避免倾斜,需要将item表放在最后join,由于item表的join并不能使行数减少。修改hint如下并执行,计划如下,运行时间120s: 1 2 3 4 select avg(netpaid) from (select /*+rows(store_sales store_returns *11270) leading((customer_address (store_sales store_returns store customer) item)) c_last_name ... 该计划中的redistribute问题并没有解决,因为第22层item表做了broadcast,导致与customer_address表join后的倾斜并没有被消除掉。 5. 增加如下禁止item表做broadcast的hint,使与customer_address join的表做redistribute(也可以进行join表redistribute的hint),计划如下,运行时间105s: 1 2 3 4 5 select avg(netpaid) from (select /*+rows(store_sales store_returns *11270) leading((customer_address (store_sales store_returns store customer) item)) no broadcast(item)*/ c_last_name ... 6. 发现最后一层使用单层Agg,但行数缩减较多。使用相同的hint,同时结合参数best_agg_plan=3进行双层Agg调优,最终计划如下图所示,运行时间94s,完成调优。 如果有统计信息变更引起的查询劣化,可以考虑用plan hint来调整到之前的查询计划。这里以TPCH-Q17为例,在收集default_statistics_target设置为–2的统计信息之后,计划相比于默认统计信息发生劣化。 1. 默认统计信息(default_statistics_target设置为100)的计划如下: 2. 统计信息变更(default_statistics_target设置为–2)的计划如下: 3. 经过对比,劣化的原因主要为lineitem和part表join时stream类型由BroadCast变更为Redistribute导致。可以对语句进行stream方式的hint来调整到之前的计划,例如: 父主题: 使用Plan Hint进行调优
  • 参数说明 name 一个需要修改的现有的类型的名称(可以有模式修饰) 。 new_name 该类型的新名称。 new_owner 新所有者的用户名 。 new_schema 该类型的新模式 。 attribute_name 拟增加、更改或删除的属性的名称。 new_attribute_name 拟改名的属性的新名称。 data_type 拟新增属性的数据类型,或是拟更改的属性的新类型名。 new_enum_value 枚举类型新增加的标签值,是一个非空的长度不超过64个字节的字符串。 neighbor_enum_value 一个已有枚举标签值,新值应该被增加在紧接着该枚举值之前或者之后的位置上。 existing_enum_value 现有的要重命名的枚举值,是一个非空的长度不超过64个字节的字符串 CASCADE 自动级联更新需更新类型以及相关联的记录和继承它们的子表。 RESTRICT 如果需联动更新类型是已更新类型的关联记录,则拒绝更新。这是缺省选项。 ADD ATTRIBUTE、DROP ATTRIBUTE和ALTER ATTRIBUTE选项可以组合成一个列表同时处理。 例如,在一条命令中同时增加几个属性或是更改几个属性的类型是可以实现的。 要修改一个类型的模式,必须在新模式上拥有CREATE权限。要修改所有者,必须是新的所有角色的直接或间接成员,并且该成员必须在此类型的模式上有CREATE权限(这些限制强制了修改所有者不会做任何通过删除和重建类型不能做的事情。不过,系统管理员可以以任何方式修改任意类型的所有权)。要增加一个属性或是修改一个属性的类型,也必须有该类型的USAGE权限。
  • 语法格式 修改类型 1 2 3 4 5 6 7 8 9 10 11 12 ALTER TYPE name action [, ... ] ALTER TYPE name OWNER TO { new_owner | CURRENT_USER | SESSION_USER } ALTER TYPE name RENAME ATTRIBUTE attribute_name TO new_attribute_name [ CASCADE | RESTRICT ] ALTER TYPE name RENAME TO new_name ALTER TYPE name SET SCHEMA new_schema ALTER TYPE name ADD VALUE [ IF NOT EXISTS ] new_enum_value [ { BEFORE | AFTER } neighbor_enum_value ] ALTER TYPE name RENAME VALUE existing_enum_value TO new_enum_value where action is one of: ADD ATTRIBUTE attribute_name data_type [ COLLATE collation ] [ CASCADE | RESTRICT ] DROP ATTRIBUTE [ IF EXISTS ] attribute_name [ CASCADE | RESTRICT ] ALTER ATTRIBUTE attribute_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ CASCADE | RESTRICT ] 给复合类型增加新的属性。 1 ALTER TYPE name ADD ATTRIBUTE attribute_name data_type [ COLLATE collation ] [ CASCADE | RESTRICT ]
  • 参数说明 function_name 要创建的函数名称(可以用模式修饰)。 取值范围:字符串,要符合标识符的命名规范。 argname 函数参数的名称。 取值范围:字符串,要符合标识符的命名规范。 argmode 函数参数的模式。 取值范围:IN,OUT,INOUT或VARIADIC。缺省值是IN。只有OUT模式的参数后面能跟VARIADIC。并且OUT和INOUT模式的参数不能用在RETURNS TABLE的函数定义中。 VARIADIC用于声明数组类型的参数。 argtype 函数参数的类型。可以使用%ROWTYPE间接引用表的类型,或者使用%TYPE间接引用表或复合类型中某一列的类型。 expression 参数的默认表达式。 rettype 函数返回值的数据类型。与argtype相同,可以使用%ROWTYPE或者%TYPE间接引用类型。 如果存在OUT或IN OUT参数,可以省略RETURNS子句。如果存在,该子句必须和输出参数所表示的结果类型一致:如果有多个输出参数,则为RECORD,否则与单个输出参数的类型相同。 SETOF修饰词表示该函数将返回一个集合,而不是单独一项。 column_name 字段名称。 column_type 字段类型。 definition 一个定义函数的字符串常量,含义取决于语言。它可以是一个内部函数名称、一个指向某个目标文件的路径、一个SQL查询、一个过程语言文本。 LANGUAGE lang_name 用以实现函数的语言的名称。可以是SQL,C,internal,或者是用户定义的过程语言名称。为了保证向下兼容,该名称可以用单引号(包围)。若采用单引号,则引号内必须为大写。 由于兼容性问题,O风格的语法无论指定任何语言,最终创建的语言都为plpgsql。 WINDOW 表示该函数是窗口函数,通常只用于C语言编写的函数。替换函数定义时不能改变WINDOW属性。 自定义窗口函数只支持LANGUAGE是internal,并且引用的内部函数必须是窗口函数。 IMMUTABLE 表示该函数在给出同样的参数值时总是返回同样的结果。 STABLE 表示该函数不能修改数据库,对相同参数值,在同一次表扫描里,该函数的返回值不变,但是返回值可能在不同SQL语句之间变化。 VOLATILE 表示该函数值可以在一次表扫描内改变,因此不会做任何优化。 SHIPPABLE NOT SHIPPABLE 表示该函数是否可以下推到DN上执行。 对于IMMUTABLE类型的函数,函数始终可以下推到DN上执行。 对于STABLE/VOLATILE类型的函数,仅当函数的属性是SHIPPABLE的时候,函数可以下推到DN执行。 对于指定了SHIPPABLE/IMMUABLE的函数或者存储过程,其不能包含EXCEPTION或调用含有EXCEPTION的函数或者存储过程。 PACKAGE 表示该函数是否支持重载。 不允许package函数和非package函数重载或者替换。 package函数不支持VARIADIC类型的参数。 不允许修改函数的package属性。 LEAKPROOF 指出该函数的参数只包括返回值。LEAKPROOF只能由系统管理员设置。 CALLED ON NULL INPUT 表明该函数的某些参数是NULL的时候可以按照正常的方式调用。该参数可以省略。 RETURNS NULL ON NULL INPUT STRICT STRICT用于指定如果函数的某个参数是NULL,此函数总是返回NULL。如果声明了这个参数,当有NULL值参数时该函数不会被执行;而只是自动返回一个NULL结果。 RETURNS NULL ON NULL INPUT和STRICT的功能相同。 EXTERNAL 目的是和SQL兼容,是可选的,这个特性适合于所有函数,而不仅是外部函数。 SECURITY INVOKER AUTHID CURRENT_USER 表明该函数将带着调用它的用户的权限执行。该参数可以省略。 SECURITY INVOKER和AUTHID CURRENT_USER的功能相同。 SECURITY DEFINER AUTHID DEFINER 声明该函数将以创建它的用户的权限执行。 AUTHID DEFINER和SECURITY DEFINER的功能相同。 FENCED NOT FENCED 该参数用于声明函数是在保护模式还是非保护模式下执行。如果函数声明为NOT FENCED模式,则函数的执行在CN或者DN进程中进行。如果函数声明为FENCED模式,则函数在新fork的进程执行,这样函数的异常不会影响CN或者DN进程。 FENCED/NOT FENCED模式的选择: 正在开发或者调试的Function使用FENCED模式。开发测试完成,使用NOT FENCED模式执行,减少fork进程以及通信的开销。 复杂的操作系统操作,例:打开文件,信号处理,线程处理等操作,使用FENCED模式。否则可能影响GaussDB数据库的执行。 用户自定义C函数(当前特性是实验室特性,使用时请联系华为工程师提供技术支持),如果不指定该参数,默认为FENCED。 用户自定义PL/Java函数(当前特性是实验室特性,使用时请联系华为工程师提供技术支持),如果不指定该参数,默认为FENCED, 且不支持指定为NOT FENCED执行模式。 用户自定义PL/pgSQL函数,如果不指定该参数,默认为NOT FENCED,且不支持指定为FENCED执行模式。 COST execution_cost 用来估计函数的执行成本。 execution_cost以cpu_operator_cost为单位。 取值范围:正数 ROWS result_rows 估计函数返回的行数。用于函数返回的是一个集合。 取值范围:正数,默认值是1000行。 configuration_parameter value 把指定的数据库会话参数值设置为给定的值。如果value是DEFAULT或者RESET,则在新的会话中使用系统的缺省设置。OFF关闭设置。 取值范围:字符串 DEFAULT OFF RESET 指定默认值。 from current 取当前会话中的值设置为configuration_parameter的值。 obj_file, link_symbol 适用于C语言函数(当前特性是实验室特性,使用时请联系华为工程师提供技术支持),字符串obj_file指定了动态库的绝对路径;link_symbol指定了该函数的链接符号,也就是该函数在C代码中的函数名称。 plsql_body PL/SQL存储过程体。 当在函数体中创建用户时,日志中会记录密码的明文。因此不建议用户在函数体中创建用户。
  • 示例 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 --定义函数为SQL查询。 openGauss=# CREATE FUNCTION func_add_sql(integer, integer) RETURNS integer AS 'select $1 + $2;' LANGUAGE SQL IMMUTABLE RETURNS NULL ON NULL INPUT; --利用参数名用 PL/pgSQL 自增一个整数。 openGauss=# CREATE OR REPLACE FUNCTION func_increment_plsql(i integer) RETURNS integer AS $$ BEGIN RETURN i + 1; END; $$ LANGUAGE plpgsql; --返回RECORD类型 CREATE OR REPLACE FUNCTION compute(i int, out result_1 bigint, out result_2 bigint) returns SETOF RECORD as $$ begin result_1 = i + 1; result_2 = i * 10; return next; end; $$language plpgsql; --返回一个包含多个输出参数的记录。 openGauss=# CREATE FUNCTION func_dup_sql(in int, out f1 int, out f2 text) AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$ LANGUAGE SQL; openGauss=# SELECT * FROM func_dup_sql(42); --计算两个整数的和,并返回结果。若果输入为null,则返回null。 openGauss=# CREATE FUNCTION func_add_sql2(num1 integer, num2 integer) RETURN integer AS BEGIN RETURN num1 + num2; END; / --创建package属性的重载函数 openGauss=# create or replace function package_func_overload(col int, col2 int) return integer package as declare col_type text; begin col := 122; dbe_output.print_line('two int parameters ' || col2); return 0; end; / openGauss=# create or replace function package_func_overload(col int, col2 smallint) return integer package as declare col_type text; begin col := 122; dbe_output.print_line('two smallint parameters ' || col2); return 0; end; / --修改函数add的执行规则为IMMUTABLE,即参数不变时返回相同结果。 openGauss=# ALTER FUNCTION func_add_sql2(INTEGER, INTEGER) IMMUTABLE; --将函数add的名称修改为add_two_number。 openGauss=# ALTER FUNCTION func_add_sql2(INTEGER, INTEGER) RENAME TO add_two_number; --将函数add的属者改为omm。 openGauss=# ALTER FUNCTION add_two_number(INTEGER, INTEGER) OWNER TO omm; --删除函数。 openGauss=# DROP FUNCTION add_two_number; openGauss=# DROP FUNCTION func_increment_sql; openGauss=# DROP FUNCTION func_dup_sql; openGauss=# DROP FUNCTION func_increment_plsql; openGauss=# DROP FUNCTION func_add_sql;
  • 语法格式 兼容PostgreSQL风格的创建自定义函数语法。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 CREATE [ OR REPLACE ] FUNCTION function_name ( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ]} [, ...] ] ) [ RETURNS rettype [ DETERMINISTIC ] | RETURNS TABLE ( { column_name column_type } [, ...] )] LANGUAGE lang_name [ {IMMUTABLE | STABLE | VOLATILE } | {SHIPPABLE | NOT SHIPPABLE} | WINDOW | [ NOT ] LEAKPROOF | {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT } | {[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | AUTHID DEFINER | AUTHID CURRENT_USER} | {fenced | not fenced} | {PACKAGE} | COST execution_cost | ROWS result_rows | SET configuration_parameter { {TO | =} value | FROM CURRENT }} ][...] { AS 'definition' | AS 'obj_file', 'link_symbol' } 兼容Oracle风格的创建自定义函数的语法。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 CREATE [ OR REPLACE ] FUNCTION function_name ( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ] } [, ...] ] ) RETURN rettype [ DETERMINISTIC ] [ {IMMUTABLE | STABLE | VOLATILE } | {SHIPPABLE | NOT SHIPPABLE} | {PACKAGE} | {FENCED | NOT FENCED} | [ NOT ] LEAKPROOF | {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT } | {[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | AUTHID DEFINER | AUTHID CURRENT_USER } | COST execution_cost | ROWS result_rows | SET configuration_parameter { {TO | =} value | FROM CURRENT | LANGUAGE lang_name ][...] { IS | AS } plsql_body /
  • 示例:通过本地文件导入导出数据 在使用JAVA语言基于GaussDB进行二次开发时,可以使用CopyManager接口,通过流方式,将数据库中的数据导出到本地文件或者将本地文件导入数据库中,文件格式支持CSV、TEXT等格式。 样例程序如下,执行示例前,需要加载驱动,驱动的获取和加载方法请参考JDBC包、驱动类和环境类。。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 //以下用例以gsjdbc4.jar为例。 import java.sql.Connection; import java.sql.DriverManager; import java.io.IOException; import java.io.FileInputStream; import java.io.FileOutputStream; import java.sql.SQLException; import org.postgresql.copy.CopyManager; import org.postgresql.core.BaseConnection; public class Copy{ public static void main(String[] args) { String urls = new String("jdbc:postgresql://10.180.155.74:8000/postgres"); //数据库URL String username = new String("jack"); //用户名 String password = new String("xxxxxxxxx"); //密码 String tablename = new String("migration_table"); //定义表信息 String tablename1 = new String("migration_table_1"); //定义表信息 String driver = "org.postgresql.Driver"; Connection conn = null; try { Class.forName(driver); conn = DriverManager.getConnection(urls, username, password); } catch (ClassNotFoundException e) { e.printStackTrace(System.out); } catch (SQLException e) { e.printStackTrace(System.out); } // 将SELECT * FROM migration_table查询结果导出到本地文件d:/data.txt try { copyToFile(conn, "d:/data.txt", "(SELECT * FROM migration_table)"); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //将d:/data.txt中的数据导入到migration_table_1中。 try { copyFromFile(conn, "d:/data.txt", tablename1); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // 将migration_table_1中的数据导出到本地文件d:/data1.txt try { copyToFile(conn, "d:/data1.txt", tablename1); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } // 使用copyIn把数据从文件中导入数据库, public static void copyFromFile(Connection connection, String filePath, String tableName) throws SQLException, IOException { FileInputStream fileInputStream = null; try { CopyManager copyManager = new CopyManager((BaseConnection)connection); fileInputStream = new FileInputStream(filePath); copyManager.copyIn("COPY " + tableName + " FROM STDIN", fileInputStream); } finally { if (fileInputStream != null) { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } // 使用copyOut把数据从数据库中导出到文件中 public static void copyToFile(Connection connection, String filePath, String tableOrQuery) throws SQLException, IOException { FileOutputStream fileOutputStream = null; try { CopyManager copyManager = new CopyManager((BaseConnection)connection); fileOutputStream = new FileOutputStream(filePath); copyManager.copyOut("COPY " + tableOrQuery + " TO STDOUT", fileOutputStream); } finally { if (fileOutputStream != null) { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } } 父主题: 基于JDBC开发
  • 查看数据库用户 通过PG_USER可以查看数据库中所有用户的列表,还可以查看用户ID(USESYSID)和用户权限。 1 SELECT * FROM pg_user; 1 2 3 4 5 6 usename | usesysid | usecreatedb | usesuper | usecatupd | userepl | passwd | valbegin | valuntil | respool | parent | spacelimit | useconfig | nodegroup | tempspacelimit | spillspacelimit ---------+----------+-------------+----------+-----------+---------+----------+----------+----------+--------------+------ -------+------------+-----------+-----------+----------------+----------------- roach | 10 | t | t | t | t | ******** | | | default_pool | 0 | | | | | (1 row)
  • 查看和停止正在运行的查询语句 通过视图PG_STAT_ACTIVITY可以查看正在运行的查询语句。方法如下: 设置参数track_activities为on。 1 SET track_activities = on; 当此参数为on时,数据库系统才会收集当前活动查询的运行信息。 查看正在运行的查询语句。以查看正在运行的查询语句所连接的数据库名、执行查询的用户、查询状态及查询对应的PID为例: 1 SELECT datname, usename, state,pid FROM pg_stat_activity; 1 2 3 4 5 6 7 8 datname | usename | state | pid ----------+---------+--------+----------------- postgres | Ruby | active | 140298793514752 postgres | Ruby | active | 140298718004992 postgres | Ruby | idle | 140298650908416 postgres | Ruby | idle | 140298625742592 postgres | omm | active | 140298575406848 (5 rows) 如果state字段显示为idle,则表明此连接处于空闲,等待用户输入命令。 如果仅需要查看非空闲的查询语句,则使用如下命令查看: 1 SELECT datname, usename, state pid FROM pg_stat_activity WHERE state != 'idle'; 若需要取消运行时间过长的查询,通过PG_TERMINATE_BACKEND函数,根据线程ID(即2中查询结果的pid字段)结束会话。 1 SELECT PG_TERMINATE_BACKEND(140298793514752); 显示类似如下信息,表示结束会话成功。 1 2 3 4 PG_TERMINATE_BACKEND ---------------------- t (1 row) 显示类似如下信息,表示用户执行了结束当前会话的操作。 1 2 FATAL: terminating connection due to administrator command FATAL: terminating connection due to administrator command 1. gsql客户端使用PG_TERMINATE_BACKEND函数结束当前正在执行会话的后台线程时,如果当前的用户是初始用户,客户端不会退出而是自动重连,即还会返回“The connection to the server was lost. Attempting reset: Succeeded.”;否则客户端会重连失败,即返回“The connection to the server was lost. Attempting reset: Failed.”。这是因为只有初始用户可以免密登录,普遍用户不能免密登录,从而重连失败。 2. 对于使用PG_TERMINATE_BACKEND函数结束非活跃的后台线程时。如果打开了线程池,此时空闲的会话没有线程ID,无法结束会话。非线程池模式下,结束的会话不会自动重连。
  • 查看数据库中包含的表 例如,在PG_TABLES系统表中查看public schema中包含的所有表。 1 SELECT distinct(tablename) FROM pg_tables WHERE SCHEMANAME = 'public'; 结果类似如下这样: 1 2 3 4 5 6 7 8 9 tablename ------------------- err_hr_staffs test err_hr_staffs_ft3 web_returns_p1 mig_seq_table films4 (6 rows)
  • 操作步骤 假设存在表customer_t,表结构如下: 1 2 3 4 5 6 openGauss=# CREATE TABLE customer_t ( c_customer_sk integer, c_customer_id char(5), c_first_name char(6), c_last_name char(8) ) ; 可以使用如下DML命令对表进行数据更新。 使用INSERT向表中插入数据。 向表customer_t中插入一行。 1 openGauss=# INSERT INTO customer_t (c_customer_sk, c_customer_id, c_first_name,c_last_name) VALUES (3769, 5, 'Grace','White'); 向表customer_t中插入多行数据。 1 2 3 4 5 openGauss=# INSERT INTO customer_t (c_customer_sk, c_customer_id, c_first_name,c_last_name) VALUES (6885, 1, 'Joes', 'Hunter'), (4321, 2, 'Lily','Carter'), (9527, 3, 'James', 'Cook'), (9500, 4, 'Lucy', 'Baker'); 更多关于INSERT的使用方法,请参见向表中插入数据。 使用UPDATE更新表中数据。修改字段c_customer_id值为0。 1 openGauss=# UPDATE customer_t SET c_customer_id = 0; 更多关于UPDATE的使用方法,请参见UPDATE。 使用DELETE删除表中的行。 可以使用WHERE子句指定需要删除的行,若不指定即删除表中所有的行,只保留数据结构。 1 openGauss=# DELETE FROM customer_t WHERE c_last_name = 'Baker'; 更多关于DELETE的使用方法,请参见DELETE。 使用TRUNCATE命令快速从表中删除所有的行。 1 openGauss=# TRUNCATE TABLE customer_t; 更多关于TRUNCATE的使用方法,请参见TRUNCATE。 删除表时,DELETE语句每次删除一行数据而TRUNCATE语句是通过释放表存储的数据页来删除数据,使用TRUNCATE语句比使用DELETE语句更加快速。 使用DELETE语句删除表时,仅删除数据,不释放存储空间。使用TRUNCATE语句删除表时,删除数据且释放存储空间。
  • OPEN FOR 动态查询语句还可以使用OPEN FOR打开动态游标来执行。 语法参见图3。 图3 open_for::= 参数说明: cursor_name:要打开的游标名。 dynamic_string:动态查询语句。 USING value:在dynamic_string中存在占位符时使用。 游标的使用请参考游标。 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 openGauss=# DECLARE name VARCHAR2(20); phone_number VARCHAR2(20); salary NUMBER(8,2); sqlstr VARCHAR2(1024); TYPE app_ref_cur_type IS REF CURSOR; --定义游标类型 my_cur app_ref_cur_type; --定义游标变量 BEGIN sqlstr := 'select first_name,phone_number,salary from hr.staffs where section_id = :1'; OPEN my_cur FOR sqlstr USING '30'; --打开游标, using是可选的 FETCH my_cur INTO name, phone_number, salary; --获取数据 WHILE my_cur%FOUND LOOP dbe_output.print_line(name||'#'||phone_number||'#'||salary); FETCH my_cur INTO name, phone_number, salary; END LOOP; CLOSE my_cur; --关闭游标 END; /
  • EXECUTE IMMEDIATE 语法图请参见图1。 图1 EXECUTE IMMEDIATE dynamic_select_clause::= using_clause子句的语法图参见图2。 图2 using_clause::= 对以上语法格式的解释如下: define_variable,用于指定存放单行查询结果的变量。 USING IN bind_argument,用于指定存放传递给动态SQL值的变量,即在dynamic_select_string中存在占位符时使用。 USING OUT bind_argument,用于指定存放动态SQL返回值的变量。 查询语句中,into和out不能同时存在; 占位符命名以“:”开始,后面可跟数字、字符或字符串,与USING子句的bind_argument一一对应; bind_argument只能是值、变量或表达式,不能是表名、列名、数据类型等数据库对象,即不支持使用bind_argument为动态SQL语句传递模式对象。如果存储过程需要通过声明参数传递数据库对象来构造动态SQL语句(常见于执行DDL语句时),建议采用连接运算符“||”拼接dynamic_select_clause; 动态PL/SQL块允许出现重复的占位符,即相同占位符只能与USING子句的一个bind_argument按位置对应。 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 --从动态语句检索值(INTO 子句): openGauss=# DECLARE staff_count VARCHAR2(20); BEGIN EXECUTE IMMEDIATE 'select count(*) from hr.staffs' INTO staff_count; dbe_output.print_line(staff_count); END; / --传递并检索值(INTO子句用在USING子句前): openGauss=# CREATE OR REPLACE PROCEDURE dynamic_proc AS staff_id NUMBER(6) := 200; first_name VARCHAR2(20); salary NUMBER(8,2); BEGIN EXECUTE IMMEDIATE 'select first_name, salary from hr.staffs where staff_id = :1' INTO first_name, salary USING IN staff_id; dbe_output.print_line(first_name || ' ' || salary); END; / --调用存储过程 openGauss=# CALL dynamic_proc(); --删除存储过程 openGauss=# DROP PROCEDURE dynamic_proc;
共100000条