GaussDB(DWS)维护宝典:异常数据的快速捕获
【摘要】 现网作业千千万,如何在千军万马中快速定位出害群之马,今天教你一招。
一句话重点
如何利用异常捕获机制定位问题数据
案例背景
某局点DWS使用copy from执行跨库导数作业,从编码为SQL_ASII编码的数据库,导入到编码为UTF8编码的数据库,作业过程报错,导致业务中断,无数据导入。
ERROR: invalid byte sequence for encoding "UTF8": 0x82
构造场景
1,建表,灌数据
2,构造个别数据行执行报错场景,这里为编码转换错误的场景
CREATE TABLE t1(name text,val int);
INSERT INTO t1(name, val) VALUES('id1', 0),('id2', 1),(E'\x7f', 2),(E'\x9f', 3);
select convert_from(name::bytea,'utf8') from t1;
问题数据定位
1,构造存储过程,验证业务逻辑,通过捕获异常区分问题数据
CREATE or replace FUNCTION encoding_check(val text) RETURNS boolean
AS $$
DECLARE
u_val text;
BEGIN
u_val = convert_from(val::bytea,'utf8'); --1,自定义检测的业务逻辑
return true;
EXCEPTION
WHEN character_not_in_repertoire THEN --2,自定义检测的错误类型
RETURN false;
END;$$
LANGUAGE plpgsql;
2,通过诊断函数定位异常问题数据,单点分析处理
select *,encoding_check(name) from t1;
select * from t1 where encoding_check(name) = false;
举一反三
1,构造除数为0错误的场景
select 100/val from t1;
2,构造检测存储过程进行定位
CREATE or replace FUNCTION div_check(val int) RETURNS boolean
AS $$
DECLARE
u_val int;
BEGIN
u_val = 100/val; --1,自定义检测的业务逻辑
return true;
EXCEPTION
WHEN division_by_zero THEN --2,自定义检测的错误类型
RETURN false;
END;$$
LANGUAGE plpgsql;
select *,div_check(div) from t1;
select * from t1 where div_check(div) = false;
知识点
1,数据库编码一旦创建无法修改,文档链接
CREATE DATABASE database_name
[ [ WITH ] { [ OWNER [=] user_name ] |
[ TEMPLATE [=] template ] |
[ ENCODING [=] encoding ] |
[ LC_COLLATE [=] lc_collate ] |
[ LC_CTYPE [=] lc_ctype ] |
[ DBCOMPATIBILITY [=] compatibilty_type ] |
[ CONNECTION LIMIT [=] connlimit ]}[...] ];
2,存储过程异常捕获,指定业务逻辑+错误类型,文档链接
[<<label>>]
[DECLARE
declarations]
BEGIN
statements
EXCEPTION
WHEN condition [OR condition ...] THEN
handler_statements
[WHEN condition [OR condition ...] THEN
handler_statements
...]
END;
3,常见的错误类型列表,文档链接
部分错误类型举例:
错误码SQLSTATE值 | 错误码含义 |
---|---|
22000 | 数据异常(DATA_EXCEPTION) |
2202E | 数组下标错误(ARRAY_SUBSCRIPT_ERROR) |
22021 | 字符不被计算机命令系统识别(CHARACTER_NOT_IN_REPERTOIRE) |
22008 | 日期时间字段溢出(DATETIME_FIELD_OVERFLOW) |
22012 | 被零除(DIVISION_BY_ZERO) |
22005 | 赋值中出错(ERROR_IN_ASSIGNMENT) |
2200B | 转义字符冲突(ESCAPE_CHARACTER_CONFLICT) |
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)