SQL语句出错自动重试
DWS支持在SQL语句执行出错时自动重试(下文简称CN Retry)。对于来自gsql客户端、JDBC、ODBC驱动的SQL语句,在SQL语句执行失败时,CN端能够自动识别语句执行过程中的报错,并重新下发任务进行自动重试。
该功能的限制和约束如下:
- 功能范围限制:
- 仅能提高故障发生时SQL语句执行成功率,不能保证100%的执行成功。
- CN Retry默认开启,开启后temp表会记录日志,关闭CN Retry后,temp表不会记录日志,因此不能在使用temp表时反复打开/关闭CN Retry开关,否则主备切换后再CN Retry会造成数据不一致。
- CN Retry默认开启,开启后新创建的unlogged表会忽视unlogged关键字,建成普通表。关闭CN Retry后,unlogged表不会记录日志,因此不能在使用unlogged表时反复打开/关闭CN Retry开关,否则主备切换后再CN Retry会造成数据不一致。
- 在使用gds进行数据导出时,支持CN Retry。现有机制导出时会对重复文件进行检测并删除相同的文件,因此建议不要对相同的外表重复导出数据,除非确定数据目录中相同文件名的文件需要删除。
- 错误类型约束:
SQL语句出错时能够被识别和重试的错误,仅限在错误类型列表(请参考表1)中定义的错误。
- 语句类型约束:
- 存储过程语句约束:
- 包含EXCEPTION的存储过程,如果在执行过程中(包含语句块执行和EXCEPTION中的语句执行)错误被抛出,可以retry,且系统内部错误发生时,retry会先于EXCEPTION被执行,而如果报错被EXCEPTION捕获则不能retry。
- 不支持使用全局变量的package。
- 不支持DBMS_JOB。
- 不支持UTL_FILE。
- 如果存储过程中有输出打印信息(如dbms_output.put_line或raise info等),则发生retry时会重复输出已打印的消息,并会在重复消息前输出“Notice:Retry triggered, some message may be duplicated.”加以提示。
- 集群状态约束:
- 仅支持DN、GTM实例故障。
- CN Retry有次数限制,如果在CN Retry达到最大尝试次数(最大次数由max_query_retry_times控制)之前,集群状态无法从故障状态恢复到正常状态,那么CN Retry不能保证执行成功。
- 扩容时不支持CN Retry。
- 数据导入约束:
- 不支持COPY FROM STDIN语句。
- 不支持gsql \copy from元命令。
- 不支持JDBC CopyManager copyIn导入数据。
CN Retry支持的错误类型列表和对应的错误码信息见表1, 可以通过GUC参数retry_ecode_list设置CN Retry支持的错误类型列表,但不建议用户直接修改该参数,如有修改需求请联系技术工程师协助处理。
| 错误类型 | 错误码 | 备注 |
|---|---|---|
| 对端连接重置(CONNECTION_RESET_BY_PEER) | YY001 | TCP通信错误:Connection reset by peer(CN和DN间通信) |
| 对端流重置(STREAM_CONNECTION_RESET_BY_PEER) | YY002 | TCP通信错误:Stream connection reset by peer(DN和DN间通信) |
| 锁等待超时(LOCK_WAIT_TIMEOUT) | YY003 | 锁超时,Lock wait timeout |
| 连接超时(CONNECTION_TIMED_OUT) | YY004 | TCP通信错误,Connection timed out |
| 查询设置错误(SET_QUERY_ERROR) | YY005 | SET命令发送失败,Set query |
| 超出逻辑内存(OUT_OF_LOGICAL_MEMORY) | YY006 | 内存申请失败,Out of logical memory |
| 通信库内存分配(SCTP_MEMORY_ALLOC) | YY007 | SCTP通信错误,Memory allocate error |
| 无通信库缓存数据(SCTP_NO_DATA_IN_BUFFER) | YY008 | SCTP通信错误,SCTP no data in buffer |
| 通信库释放内存关闭(SCTP_RELEASE_MEMORY_CLOSE) | YY009 | SCTP通信错误,Release memory close |
| SCTP、TCP断开(SCTP_TCP_DISCONNECT) | YY010 | SCTP通信错误,TCP disconnect |
| 通信库断开(SCTP_DISCONNECT) | YY011 | SCTP通信错误,SCTP disconnect |
| 通信库远程关闭(SCTP_REMOTE_CLOSE) | YY012 | SCTP通信错误,Stream closed by remote |
| 等待未知通信库通信(SCTP_WAIT_POLL_UNKNOWN) | YY013 | 等待未知通信库通信,SCTP wait poll unknown |
| 无效快照(SNAPSHOT_INVALID) | YY014 | 快照非法,Snapshot invalid |
| 通讯接收信息错误(ERRCODE_CONNECTION_RECEIVE_WRONG) | YY015 | 连接获取错误,Connection receive wrong |
| 内存耗尽(OUT_OF_MEMORY) | 53200 | 内存耗尽,Out of memory |
| 连接失败(CONNECTION_FAILURE) | 08006 | GTM出错,Connection failure |
| 连接异常(CONNECTION_EXCEPTION) | 08000 | 连接出现错误,和DN的通讯失败,Connection exception |
| 管理员关闭系统(ADMIN_SHUTDOWN) | 57P01 | 管理员关闭系统,Admin shutdown |
| 关闭远程流接口(STREAM_REMOTE_CLOSE_SOCKET) | XX003 | 关闭远程套接字,Stream remote close socket |
| 重复查询编号(ERRCODE_STREAM_DUPLICATE_QUERY_ID) | XX009 | 重复查询,Duplicate query id |
| stream查询并发更新同一行(ERRCODE_STREAM_CONCURRENT_UPDATE) | YY016 | stream查询并发更新同一行,Stream concurrent update |
| LLVM内存分配错误(ERRCODE_LLVM_BAD_ALLOC_ERROR ) | CG003 | 内存分配错误, Allocate error |
| LLVM致命错误(ERRCODE_LLVM_FATAL_ERROR) | CG004 | 致命错误,Fatal error |
| HashJoin临时文件读取错误(ERRCODE_HASHJOIN_TEMP_FILE_ERROR) | F0011 | 临时文件读取错误,File error |
| Buffer文件读取错误(ERRCODE_BUFFER_FILE_ERROR) | F0012 | 文件读取错误,File error |
| 分区个数发生变化(ERRCODE_PARTITION_NUM_CHANGED) | 45003 | 在扫描LIST分区表时,发现此时的分区个数和优化阶段的分区个数不一致,一般出现在查询和ADD/DROP分区并发时。(此错误类型仅8.1.3及以上集群版本支持) |
| 节点间对象SCHEMA名称不一致(ERRCODE_UNMATCH_OBJECT_SCHEMA) | 42P30 | 对象SCHEMA名称不一致,Unmatched schema name |