华为云用户手册

  • GAUSS-04391 -- GAUSS-04400 GAUSS-04391: "Failed to initialize NativeTargetAsmPrinter for LLVM." SQLSTATE: XX000 错误原因:启动数据库时初始化LLVM本地对象ASM打印器失败。 解决办法:重新启动数据库。 GAUSS-04392: "Failed to initialize NativeTargetAsmParser for LLVM." SQLSTATE: XX000 错误原因:启动数据库时初始化LLVM本地对象ASM解析器失败。 解决办法:重新启动数据库。 GAUSS-04393: "Invalid type %d" SQLSTATE: XX000 错误原因:无效的数据类型。 解决办法:使用set enable_codegen = off关闭LLVM优化。 GAUSS-04400: "Include identical distribution column '%s'" SQLSTATE: 42P16 错误原因:建表时指定了两个相同的分布列。 解决办法:修改建表语句。 父主题: GAUSS-04301 -- GAUSS-04400
  • GAUSS-01281 -- GAUSS-01290 GAUSS-01281: "access method '%s' does not support unique indexes" SQLSTATE: 0A000 错误原因:该索引方式不支持唯一索引。 解决办法:请勿使用报错提示的索引类建立唯一索引。 GAUSS-01282: "access method '%s' does not support multicolumn indexes" SQLSTATE: 0A000 错误原因:该索引方式不支持组合索引。 解决办法:请勿使用报错提示的索引类建立唯一索引。 GAUSS-01283: "access method '%s' does not support exclusion constraints" SQLSTATE: 0A000 错误原因:该索引方式不支持排他约束。 解决办法:请勿使用报错提示的索引类附加排他约束。 GAUSS-01284: "PrimaryKey/UniqueIndex of distribute table must contain hash distribution column" SQLSTATE: 0A000 错误原因:GaussDB(DWS)主键约束通过unique btree索引实现。主键约束没有包含分布列时,无法成功创建索引。 解决办法:请检查主键约束中是否包含分布列。 GAUSS-01285: "unknown constraint type" SQLSTATE: XX000 错误原因:创建索引时定义的约束类型错误。 解决办法:创建索引的约束类型关键字只能为PRIMARY KEY、UNIQUE、EXCLUDE,请使用有效的约束关键字重新创建索引。 GAUSS-01286: "fail to get index info when create index partition" SQLSTATE: 42P17 错误原因:创建分区索引时,获取索引信息失败。 解决办法:请重新创建分区索引,如仍然提示失败,请联系技术支持工程师提供技术支持。 GAUSS-01287: "index partition with name '%s' already exists" SQLSTATE: 42704 错误原因:分区索引名已存在。 解决办法:修改分区索引名请勿重复。 GAUSS-01289: "collation '%s' does not exist" SQLSTATE: 42P17 错误原因:索引的排序模式不存在。 解决办法:检查索引的排序模式是否正确。 示例: 1 2 3 4 5 6 7 8 9 10 11 postgres=# create table t7(c1 int,c2 text) postgres-# partition by range (c2)( postgres(# partition p0 values less than ('a'), postgres(# partition p1 values less than ('b'), postgres(# partition p2 values less than (maxvalue)); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using round-robin as the distribution mode by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE postgres=# create unique index t7_idx on t7 (c2 COLLATE "xxxx") local( postgres(# partition p0,partition p1,partition p2); ERROR: collation "xxxx" does not exist GAUSS-01290: "cannot use subquery in index predicate" SQLSTATE: 0A000 错误原因:表达式索引中不能使用子查询。 解决办法:请勿在表达式索引中使用子查询。 父主题: GAUSS-01201 -- GAUSS-01300
  • GAUSS-02261 -- GAUSS-02270 GAUSS-02261: "Fail to generate stream element due to out of memory" SQLSTATE: 53200 错误原因:无法创建分布式内部对象。 解决办法:内存不够用,检查内存使用情况,清理缓存。 GAUSS-02262: "Distribute query fail due to duplicate plan id" SQLSTATE: XX000 错误原因:产生了重复的plan node id。 解决办法:可重启数据库解决。 GAUSS-02263: "Distribute query initializing network connection timeout. un-connected nodes: %s" SQLSTATE: XX000 错误原因:连接超时。 解决办法:请检查网络情况。; GAUSS-02264: "unrecognized result from subplan" SQLSTATE: XX004 错误原因:系统内部错误,下层算子返回的结果不是bitmap。 解决办法:请联系技术支持工程师提供技术支持。 GAUSS-02265: "BitmapOr doesn't support zero inputs" SQLSTATE: XX000 错误原因:系统内部错误,BitmapOr算子的输入为空。 解决办法:请联系技术支持工程师提供技术支持。 GAUSS-02266: "could not identify CTID variable" SQLSTATE: 42809 错误原因: 获取到的变量不是ctid变量。 解决办法:查看执行计划,检查表达式返回的类型是否是ctid类型,若否,请联系技术支持工程师提供技术支持。 GAUSS-02267: "could not identify CTID expression" SQLSTATE: 22000 错误原因:获取到的表达式不是ctid相关的表达式。 解决办法:查看执行计划,检查表达式返回的类型是否是ctid类型,若否,请联系技术支持工程师提供技术支持。 GAUSS-02268: "invalid operation on partition, allowed are UPDATE/DELETE/SELECT" SQLSTATE: XX000 错误原因:对分区表的扫描操作,暂时只支持删查改。 解决办法:请检查当前针对分区表的操作是否正确。 GAUSS-02269: "cannot initialize bitmap index scans using unusable index '%s'" SQLSTATE: XX000 错误原因:索引不可用导致初始化bitmap index scan失败。 解决办法:检查系统表查看索引是否可用。 GAUSS-02270: "cannot initialize bitmap index scans using unusable local index '%s'" SQLSTATE: XX000 错误原因:索引不可用导致初始化bitmap index scan失败。 解决办法:检查系统表查看索引是否可用。 父主题: GAUSS-02201 -- GAUSS-02300
  • GAUSS-01051 -- GAUSS-01060 GAUSS-01051: "failed to change schema dependency for type %s" SQLSTATE: XX000 错误原因:更改类型的模式依赖未成功。 解决办法:系统表异常,请联系技术支持工程师提供技术支持。 GAUSS-01052: "channel name cannot be empty" SQLSTATE: 22023 错误原因:管道名为空。 解决办法:检查sql语句,给定管道名。 GAUSS-01053: "channel name too long" SQLSTATE: 22023 错误原因:管道名超出长度限制。 解决办法:检查sql语句,确保管道名长度符合要求。 GAUSS-01054: "payload string too long" SQLSTATE: 22023 错误原因:payload字符串超出长度限制。 解决办法:检查sql语句,确保payload字符串长度符合要求。 GAUSS-01055: "cannot PREPARE a transaction that has executed LISTEN, UNLISTEN, or NOTIFY" SQLSTATE: 0A000 错误原因:不允许Prepare一个执行过LISTEN,UNLISTEN或NOTIFY操作的事务。 解决办法:检查sql语句,确保要prepare的事务没有执行过LISTEN,UNLISTEN或NOTIFY操作。 GAUSS-01056: "too many notifications in the NOTIFY queue" SQLSTATE: 54000 错误原因:通知队列里的通知太多。 解决办法:重试失败的语句。 GAUSS-01057: "unexpected rewrite result for CREATE TABLE AS SELECT" SQLSTATE: XX000 错误原因:CREATE TABLE AS SELECT重写结果错误。 解决办法:重写结果应该只有一个语句,请尝试简化CREATE TABLE AS后的SELECT语句。 GAUSS-01058: "no collation was derived for column '%s' with collatable type %s" SQLSTATE: 42P22 错误原因:属性列支持attcollation但是对应的attcollation无效,导致无法正常创建heap表格。 解决办法:检查创建表格时属性列关于collation定义的有效性。 示例: 1 2 3 postgres=# create table t5 as select a from t1 union all select a from t2; ERROR: no collation was derived for column "a" with collatable type text HINT: Use the COLLATE clause to set the collation explicitly. GAUSS-01059: "CREATE TABLE AS specifies too many column names" SQLSTATE: 42601 错误原因:CREATE TABLE AS指定的列太多。 解决办法:检查sql语句,确保指定的列数相匹配。 GAUSS-01060: "option '%s' not found" SQLSTATE: 42704 错误原因:选项未找到。 解决办法:检查sql语句,确保指定了相应选项。 父主题: GAUSS-01001 -- GAUSS-01100
  • 扩展 除上述场景会出现存在多个collation造成冲突,以下两种场景也会出现多个collation,报错不同但解决方法相同。 场景一 SELECT语句中比较表达式a=b存在多个collation造成冲突,执行报错could not determine which collation to use for string comparison。 1 2 3 SELECT a=b FROM t; ERROR: dn_6001_6002: could not determine which collation to use for string comparison HINT: Use the COLLATE clause to set the collation explicitly. 执行SELECT时,指定表达式a=b的排序规则为case_insensitive。 1 2 3 4 5 SELECT a=b COLLATE case_insensitive FROM t; ?column? ---------- f (1 row) 场景二 SELECT语句中表达式instr(a,b)存在多个collation造成冲突,执行报错could not determine which collation to use for string searching。 1 2 3 SELECT instr(a,b) FROM t; ERROR: dn_6005_6006: could not determine which collation to use for string searching HINT: Use the COLLATE clause to set the collation explicitly. 执行SELECT时,指定字段a的排序规则为case_insensitive或者指定字段b的排序规则为C来保证字段排序规则的统一。 1 2 3 4 5 6 7 8 9 10 11 SELECT instr(a collate case_insensitive,b) FROM t; instr ------- 0 (1 row) SELECT instr(a,b collate "C") FROM t; instr ------- 0 (1 row)
  • 处理方法 当字符串表达式中collation有多个时,可手动指定COLLATE collation_name。 执行SELECT时,指定表达式ifnull(a,b)的排序规则为C或者case_insensitive。 1 2 3 4 5 6 7 8 9 10 11 SELECT hashtext(ifnull(a,b) collate "C") FROM t; hashtext ----------- 820977155 (1 row) SELECT hashtext(ifnull(a,b) collate case_insensitive) FROM t; hashtext ----------- 238052143 (1 row)
  • 问题现象 执行SELECT查询时报错could not determine which collation to use for string hashing。 1 2 3 4 5 6 CREATE TABLE t(a text collate "C", b text collate case_insensitive); INSERT INTO t VALUES('Hello','world'); ——计算ifnull(a,b)的值的哈希值 SELECT hashtext(ifnull(a,b)) FROM t; ERROR: dn_6005_6006: could not determine which collation to use for string hashing. HINT: Use the COLLATE clause to set the collation explicitly. hashtext函数用于计算适当数据类型的值的哈希值。此处仅用作示例说明出现collate冲突时应该如何解决。
  • 处理方法 建议开启列存表的delta表功能。 1 ALTER TABLE table_name SET (ENABLE_DELTA = ON); 开启列存表的delta表功能,在导入单条或者小规模数据进入表中时,能够防止小CU的产生,所以开启delta表能够带来显著的性能提升,例如在3CN、6DN的集群上操作,每次导入100条数据,导入时间能减少25%,存储空间减少97%,所以在需要多次插入小批量数据前应该先开启delta表,等到确定接下来没有小批量数据导入了再关闭。 delta表就是列存表附带的行存表,那么将数据插入delta表后将失去列存表的高压缩比等优势,正常情况下使用列存表的场景都是大批量数据导入,所以默认关闭delta表,如果开启delta表做大批量数据导入,反而会额外消耗更多时间和空间,同样在3CN、6DN的集群上操作,每次导入10000条数据时,开启delta表会比不开启时慢4倍,额外消耗10倍以上的空间。所以开启delta表需谨慎,根据实际业务需要来选择开启和关闭。
  • 解决办法 系统连接超过最大连接数量。 用户可在GaussDB(DWS) 控制台设置最大连接数max_connections。 max_connections设置方法如下: 登录GaussDB(DWS) 管理控制台。 在左侧导航栏中,单击“集群管理”。 在集群列表中找到所需要的集群,单击集群名称,进入集群“基本信息”页面。 单击“参数修改”页签,修改参数“max_connections”的值,然后单击“保存”。 在“修改预览”窗口,确认修改无误后,单击“保存”。 关于查看用户会话连接数的方法如表1。 表1 查看会话连接数 描述 命令 查看指定用户的会话连接数上限。 执行如下命令查看连接到指定用户user1的会话连接数上限。其中,-1表示没有对用户user1设置连接数的限制。 1 2 3 4 5 SELECT ROLNAME,ROLCONNLIMIT FROM PG_ROLES WHERE ROLNAME='user1'; rolname | rolconnlimit ---------+-------------- user1 | -1 (1 row) 查看指定用户已使用的会话连接数。 执行如下命令查看指定用户user1已使用的会话连接数。其中,1表示user1已使用的会话连接数。 1 2 3 4 5 6 SELECT COUNT(*) FROM V$SESSION WHERE USERNAME='user1'; count ------- 1 (1 row) 查看指定数据库的会话连接数上限。 执行如下命令查看连接到指定数据库db_demo的会话连接数上限。其中,-1表示没有对数据库db_demo设置连接数的限制。 1 2 3 4 5 6 SELECT DATNAME,DATCONNLIMIT FROM PG_DATABASE WHERE DATNAME='db_demo'; datname | datconnlimit ----------+-------------- db_demo | -1 (1 row) 查看指定数据库已使用的会话连接数。 执行如下命令查看指定数据库db_demo上已使用的会话连接数。其中,1表示数据库db_demo上已使用的会话连接数。 1 2 3 4 5 SELECT COUNT(*) FROM PG_STAT_ACTIVITY WHERE DATNAME='db_demo'; count ------- 1 (1 row) 查看所有用户已使用会话连接数。 执行如下命令查看所有用户已使用的会话连接数。 1 2 3 4 5 SELECT COUNT(*) FROM PG_STAT_ACTIVITY; count ------- 10 (1 row) 用户不具备访问该数据库的权限。 使用管理员用户dbadmin连接数据库。 1 gsql -d human_resource -h 10.168.0.74 -U dbadmin -p 8000 -W password -r 赋予user1用户访问数据库的权限。 1 GRANT CONNECT ON DATABASE human_resource TO user1; 实际上,常见的许多错误操作也可能产生用户无法连接上数据库的现象。例如,用户连接的数据库不存在,用户名或密码输入错误等。这些错误操作在客户端工具会有相应的提示信息。 1 2 3 4 5 gsql -d human_resource -p 8000 gsql: FATAL: database "human_resource" does not exist gsql -d human_resource -U user1 -W password -p 8000 gsql: FATAL: Invalid username/password,login denied. 网络连接故障。 请检查客户端与数据库服务器间的网络连接。如果发现从客户端无法PING到数据库服务器端,则说明网络连接出现故障。请联系技术支持工程师提供技术支持。 1 2 3 4 5 6 7 8 ping -c 4 10.10.10.1 PING 10.10.10.1 (10.10.10.1) 56(84) bytes of data. From 10.10.10.1: icmp_seq=2 Destination Host Unreachable From 10.10.10.1 icmp_seq=2 Destination Host Unreachable From 10.10.10.1 icmp_seq=3 Destination Host Unreachable From 10.10.10.1 icmp_seq=4 Destination Host Unreachable --- 10.10.10.1 ping statistics --- 4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 2999ms
  • 原因分析 系统连接数量超过了最大连接数量,会显示如下错误信息。 1 2 gsql -d human_resource -h 10.168.0.74 -U user1 -p 8000 -W password -r gsql: FATAL: sorry, too many clients already 用户不具备访问该数据库的权限,会显示如下错误信息。 1 2 3 gsql -d human_resource -h 10.168.0.74 -U user1 -p 8000 -W password -r gsql: FATAL: permission denied for database "human_resource" DETAIL: User does not have CONNECT privilege. 网络连接故障。
  • 处理方法 使用GRANT语法对表/schema进行赋权,示例: 假设当前有两个用户tom和jerry,如果想要用户jerry能够对当前tom创建的所有表以及将来创建的表都有查询权限,如何处理: 将用户tom下的同名schema权限赋给jerry。 1 GRANT USAGE ON SCHEMA tom TO jerry; 将用户tom已经创建的表的select权限赋给jerry。 1 GRANT SELECT ON ALL TABLES IN SCHEMA tom TO jerry; 将用户tom未来在同名schema下创建的表的select权限赋给jerry。 1 ALTER DEFAULT PRIVILEGES FOR USER tom IN SCHEMA tom GRANT SELECT ON TABLES TO jerry;
  • 处理方法 场景一:语句估算内存过大,造成排队。 查询pg_session_wlmstat视图,查看状态为running的语句是否个数很少,而且statement_mem字段数值是否较大(单位为MB,一般认为大于max_dynamic_memory 1/3即为大内存语句)。如果都符合就可以判断是此类语句占据内存导致整体运行缓慢。 1 SELECT usename,substr(query,0,20),threadid,status,statement_mem FROM pg_session_wlmstat where usename not in ('omm','Ruby') order by statement_mem,status desc; 如上图所示,只有最后一个语句是running状态,其余语句都是pending状态。根据statement_mem可以看到该语句占据2576MB内存。此时根据语句的threadid,执行以下命令终止对应的查询语句,终止后即可释放资源,其余语句正常运行。 1 SELECT pg_terminate_backend(threadid); 场景二:所有语句状态都是pending状态,没有运行的语句。此时应是管控机制出现异常,直接终止所有线程,即可恢复正常。 1 SELECT pg_terminate_backend(pid) FROM pg_stat_activity where usename not in ('dbadmin','Ruby');
  • 问题现象 创建分区表索引HR_staffS_p1_index1,不指定索引分区的名字。 1 CREATE INDEX HR_staffS_p1_index1 ON HR.staffS_p1 (staff_ID) LOCAL; 创建分区索引HR_staffS_p1_index2,并指定索引分区的名字。 1 2 3 4 5 6 CREATE INDEX HR_staffS_p1_index2 ON HR.staffS_p1 (staff_ID) LOCAL ( PARTITION staff_ID1_index, PARTITION staff_ID2_index TABLESPACE example3, PARTITION staff_ID3_index TABLESPACE example4 ) TABLESPACE example; 修改索引分区staff_ID1_index的表空间为example1: 调用“ALTER INDEX HR_staffS_p1_index2 MOVE PARTITION staff_ID2_index TABLESPACE example1;”提示索引不存在。
  • 原因分析 重新创建索引CREATE INDEX HR_staffS_p1_index2 MOVE PARTITION staff_ID2_index TABLESPACE example1,提示索引已存在,然后执行以下SQL命令或者gsql客户端元命令\d+ HR.staffS_p1 查询索引时发现索引已存在。 1 SELECT * FROM DBA_INDEXES WHERE index_name = HR.staffS_p1 ; 推测是当前模式是public模式,而不是hr模式,导致检索不到该索引。 使用“ALTER INDEX hr.HR_staffS_p1_index2 MOVE PARTITION staff_ID2_index TABLESPACE example1;”验证推测,发现调用成功。 接着调用ALTER SESSION SET CURRENT_SCHEMA TO hr;再次调用“ALTER INDEX HR_staffS_p1_index2 MOVE PARTITION staff_ID2_index TABLESPACE example1;”发现设置成功。
  • 处理方法 以上述问题现象中的“字符串类型varchar直接转换为整数型integer”报错为例,可以先将字段类型修改为decimal(任意精度型)再进行转换来处理。 具体的操作步骤如下: 假设报错表名为product,表定义如下: 1 SELECT * FROM PG_GET_TABLEDEF('product'); 将查询结果转换为整数型。 1 SELECT CAST(price AS integer) FROM product; 出现如下报错: 修改表字段的数据类型为decimal。 1 ALTER TABLE product ALTER COLUMN price TYPE decimal(10,1); 成功转换字段为整数型。 1 SELECT CAST(price AS integer) FROM product;
  • 处理方法 登录GaussDB(DWS) 管理控制台。 在集群列表中单击指定集群名称。 进入“集群详情”页面,切换至“智能运维”页签。 在运维详情部分切换至运维计划模块。单击“添加运维任务”按钮。 弹出添加运维任务边栏, 运维任务选择“Vacuum”。 调度模式选择“自动”,DWS将自动扫描Vacuum目标。 Vacuum目标选择系统表或用户表: 如果用户业务UPDATE、DELETE较多,选择用户表。 如果创建表、删除表较多,选择系统表。 单击“下一步:定时配置”,配置Vacuum类型,推荐选择“周期型任务”,GaussDB(DWS)将自动在自定义时间窗内执行Vacuum。 对于自动Vacuum运维任务,系统对于用户表的处理方法实际采用的是VACUUM FULL操作。VACUUM FULL执行过程中,本身持有8级锁,会阻塞其他业务,导致锁冲突产生,业务本身会陷入锁等待,20分钟后超时报错。因此,在用户配置时间窗内,应尽量避开执行所有处理表的相关业务。 确认无误后,单击“下一步:配置确认”,完成配置。
  • 处理方法 8.1.x及以上集群版本,通过pgxc_lock_conflicts视图查看锁冲突情况。 1 SELECT * FROM pgxc_lock_conflicts; 8.0.x及之前集群版本,执行以下SQL查询查看是否有阻塞的SQL语句。 1 2 3 4 5 6 7 8 9 10 11 SELECT w.query as waiting_query, w.pid as w_pid, w.usename as w_user, l.query as locking_query, l.pid as l_pid, l.usename as l_user, n.nspname || '.' || c.relname as tablename from pg_stat_activity w join pg_locks l1 on w.pid = l1.pid and not l1.granted join pg_locks l2 on l1.relation = l2.relation and l2.granted join pg_stat_activity l on l2.pid = l.pid join pg_class c on c.oid = l1.relation join pg_namespace n on n.oid=c.relnamespace where w.waiting; 查询到阻塞的表及模式信息后,请根据会话ID结束会话: 1 SELECT PG_TERMINATE_BACKEND(PID); 这种情况一般是因为业务调度不太合理,建议合理安排各个业务的调度时间。 还可以通过设置GUC参数lockwait_timeout,控制单个锁的最长等待时间,即单个锁的等待超时时间。 lockwait_timeout单位为毫秒(ms),默认值为20分钟。 lockwait_timeout参数属于SUSET类型参数,请参考设置GUC参数中对应的设置方法进行设置。
  • 原因分析 以UTF-8编码为例,一个中文占3~4个字节,即8个中文占24~32字节,超出VARCHAR(18)的最大18字节限制。 当表中某一字段包含有中文字符时,可使用char_length或length函数来查询字段字符长度,使用lengthb函数来查询字段字节长度。 1 2 3 4 5 SELECT length('数据库database'); length -------- 11 (1 row) 1 2 3 4 5 SELECT lengthb('数据库database'); length -------- 17 (1 row)
  • 原因分析 业务数据文件从Oracle导入,文件编码为utf-8。该报错还会提示行数,由于文件特别大,vim命令打不开文件,于是用sed命令把报错行数提出来,再用vim命令打开,发现并没有什么异常。用split命令按行数切割后,部分文件也可以导入。 经分析GaussDB(DWS)的varchar型的字段或变量不允许含有'\0'(也即数值0x00、UTF编码'\u0000')的字符串 ,需在导入前去掉字符串中的'\0'。
  • 在modifyJdbcCall和createParameterizedQuery阶段耗时 问题分析:如果主要耗时在modifyJdbcCall阶段(校验传入的SQL是否符合规范)和createParameterizedQuery阶段(将传入的SQL解析为preparedQuery,以获取由simplequery组成的subqueries),则需要确认是否传入的SQL过长导致。 处理方法:JDBC本身没办法优化这部分耗时,可在应用端查看是否可优化传入的SQL语句,详情可参见SQL语句改写规则。
  • 磁盘空间告警订阅 为了减轻客户自行的运维压力,DWS提供了告警订阅的功能:即当集群的磁盘使用率大于设置的阈值时,系统会以短信、邮件形式通知到用户。 设置告警阈值: 登录DWS控制台,左侧选择“告警管理”,单击“告警规则管理”。 在告警规则列表中,单击“节点数据盘使用率超阈值”右侧的“修改”。 在集群列表中单击指定集群,进入集群详情页面。告警策略设置如下: 规则绑定集群:所有集群 告警策略:将数据盘的重要告警配置为70%,持续10分钟,紧急告警配置为75%,持续10分钟。如下设置: 在消息通知服务(SMN)创建主题。 切换到消息通知服务控制台,单击“创建主题”。如下设置“主题名称”和“企业项目”。 主题创建成功后,单击右侧的“添加订阅”。根据需要选择“短信”、“邮件”方式,订阅终端输入对应的手机号或邮箱地址。 输入的手机号或邮箱地址会受到确认短信或邮件,单击确认,即可完成订阅。 添加告警订阅。 回到DWS控制台,左侧选择“告警管理”,切换到“订阅”,单击“创建订阅”。 订阅名称输入“dms_alarm”,告警级别选择“紧急”、“重要”,消息通知主题名称选择上一步创建的主题“dms_alarm”。 单击“确认”。整个告警订阅成功,后续磁盘使用率大于70%和75%则发出通知。
  • 单语句空间管控 GaussDB(DWS)支持语句磁盘空间管控相关的参数sql_use_spacelimit和temp_file_limit,用于业务运行时,避免由于不合理的数据量,引发磁盘空间暴增,触发告警/只读,主动识别不合理的大批量倒数业务或者高数据量入库业务。 登录DWS控制台,左侧单击“集群管理”,在集群列表中单击指定集群,进入集群详情页面。 单击“参数修改”,搜索栏中搜索sql_use_spacelimit和temp_file_limit(参见磁盘空间),根据业务进行调整。 建议设置sql_use_spacelimit为实例所在磁盘空间总容量的10%(例如购买时空间为100G/每节点,则配置该参数为10G)。 上述配置生效后,如果单语句运行过程中超过该配置参数,则SQL语句会被主动中止。如需临时放开,可以在session会话中执行以下语句进行临时关闭。 1 SET sql_use_spacelimit=0;
  • 处理方法 应根据数据实际情况规划分区,以保证插入的数据都在规划好的分区中。 如果已规划的分区无法满足实际应用条件,可以增加分区后再插入数据。针对上述案例,可以增加分区c2,分区范围介于5000和MAXVALUE之间: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ALTER TABLE startend_pt ADD PARTITION P6 VALUES LESS THAN (MAXVALUE); SELECT partition_name,high_value FROM dba_tab_partitions WHERE table_name='startend_pt'; partition_name | high_value ----------------+------------ p1_0 | 1 p1_1 | 201 p1_2 | 401 p1_3 | 601 p1_4 | 801 p1_5 | 1000 p2 | 2000 p3 | 2500 p4 | 3000 p5_1 | 4000 p5_2 | 5000 p6 | MAXVALUE (12 rows) INSERT INTO startend_pt VALUES (1,5001); SELECT * FROM startend_pt; c1 | c2 ----+------ 1 | 5001 (1 row)
  • 问题现象 给范围分区表插入数据报错:inserted partition key does not map to any table partition。 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 CREATE TABLE startend_pt (c1 INT, c2 INT) DISTRIBUTE BY HASH (c1) PARTITION BY RANGE (c2) ( PARTITION p1 START(1) END(1000) EVERY(200) , PARTITION p2 END(2000), PARTITION p3 START(2000) END(2500) , PARTITION p4 START(2500), PARTITION p5 START(3000) END(5000) EVERY(1000) ); SELECT partition_name,high_value FROM dba_tab_partitions WHERE table_name='startend_pt'; partition_name | high_value ----------------+------------ p1_0 | 1 p1_1 | 201 p1_2 | 401 p1_3 | 601 p1_4 | 801 p1_5 | 1000 p2 | 2000 p3 | 2500 p4 | 3000 p5_1 | 4000 p5_2 | 5000 (11 rows) INSERT INTO startend_pt VALUES (1,5001); ERROR: dn_6003_6004: inserted partition key does not map to any table partition
  • 设置尝试登录失败次数 输错密码的次数上限可以在集群的“参数修改”页面通过参数failed_login_attempts进行设置,当failed_login_attempts配置为0时表示不限制密码输入错误的次数,为保证数据库安全,不推荐设置为0。 您可以通过如下步骤修改参数: 登录GaussDB(DWS) 管理控制台。 在左侧导航树,单击“集群管理”。 在集群列表中找到所需要的集群,然后单击集群名称。 进入集群的“参数修改”页面,找到“failed_login_attempts”参数,修改其参数值,然后单击“保存”,确认无误后再单击“保存”。
  • 设置账户被锁定后自动解锁的时间 账户被锁定后,可通过设置参数password_lock_time指定自动解锁的时间,当锁定时间超过password_lock_time设定的值时,账户将会被自行解锁。参数password_lock_time的整数部分表示天数,小数部分可以换算成时、分、秒。 您可以通过如下步骤修改参数: 登录GaussDB(DWS) 管理控制台。 在左侧导航树,单击“集群管理”。 在集群列表中找到所需要的集群,然后单击集群名称。 进入集群的“参数修改”页面,找到“password_lock_time”参数,修改其参数值,然后单击“保存”,确认无误后再单击“保存”。
  • 处理方法 通过toast的OID(示例中为2619,来源于报错信息的pg_toast_2619)查询出哪张表发生了损坏: 1 2 3 4 5 SELECT 2619::regclass; regclass -------------- pg_statistic (1 row) 对已定位的损坏表(步骤1中查询得到的表pg_statistic),执行REINDEX和VACUUM ANALYZE操作。显示REINDEX/VACUUM,表示修复完成。如果修复过程中出现报错,请继续执行步骤3。 1 2 3 REINDEX table pg_toast.pg_toast_2619; REINDEX table pg_statistic; VACUUM ANALYZE pg_statistic; 执行以下的命令定位该表中损坏的数据行。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 DO $$ declare v_rec record; BEGIN for v_rec in SELECT * FROM pg_statistic loop raise notice 'Parameter is: %', v_rec.ctid; raise notice 'Parameter is: %', v_rec; end loop; END; $$ LANGUAGE plpgsql; NOTICE: 00000: Parameter is: (46,9) ERROR: XX000: missing chunk number 0 for toast value 30982 in pg_toast_2619 CONTEXT: PL/pgSQL function inline_code_block line 7 at RAISE 将步骤3中定位的损坏数据行记录删除。 1 DELETE FROM pg_statistic WHERE ctid ='(46,9)'; 重复执行步骤3、步骤4,直到全部有问题的数据记录被删除。 损坏的数据行被删除后,执行步骤2中的REINDEX和VACUUM ANALYZE操作对该表重新进行修复。
  • 原因分析 表关联的toast表的data发生损坏。 toast是The OverSized Attribute Storage Technique(超尺寸字段存储技术)的缩写,是超长字段在GaussDB(DWS)的一种存储方式。当某表中有超长字段的时候,那么该表会有与之相关联的toast表。根据toast表的命名规则,假设存在表名为test的OID为2619,那么如果存在与之相关联的toast表,则toast表名为pg_toast_2619。此报错中pg_toast_2619非固定表名,可根据实际报错对pg_toast_2619进行替换。
  • 处理方法 可使用ALTER USER或者ALTER ROLE语法指定USEFT参数赋予角色或用户使用外表的权限。 参数USEFT | NOUSEFT决定一个新角色或用户是否能操作外表,包括:新建外表、删除外表、修改外表、读写外表。 指定USEFT表示角色或用户可操作外表。 缺省为NOUSEFT。表示新角色或用户没有操作外表的权限。 请使用数据库管理员用户给普通用户或角色赋予使用外表的权限,示例如下: 1 ALTER USER user_name USEFT; 修改用户或角色权限等信息的详细内容请参见ALTER USER或者ALTER ROLE。 对普通用户或角色赋予使用外表的权限后即可创建外表。
  • 问题现象 创建GDS或OBS外表语句时,管理员用户可以执行成功,但普通用户执行时报错“ERROR: permission denied to create foreign table in security mode.”。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CREATE USER u1 PASSWORD '{password}'; SET current_schema = u; CREATE FOREIGN TABLE customer_ft ( c_customer_sk integer , c_customer_id char(16) , c_current_cdemo_sk integer , c_current_hdemo_sk integer , c_current_addr_sk integer ) SERVER gsmpp_server OPTIONS ( location 'gsfs://192.168.0.90:5000/customer1*.dat', FORMAT 'TEXT' , DELIMITER '|', encoding 'utf8', mode 'Normal') READ ONLY; ERROR: permission denied to create foreign table in security mode
共100000条