
# SQL语句出错自动重试
DWS支持在SQL语句执行出错时自动重试（下文简称CN Retry）。对于来自gsql客户端、JDBC、ODBC驱动的SQL语句，在SQL语句执行失败时，CN端能够自动识别语句执行过程中的报错，并重新下发任务进行自动重试。
#### CN Retry功能的限制和约束
表1CN Retry功能的限制和约束 
| 限制和约束项 | 详细内容                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
|:---|:---|
| 功能范围   | - 仅能提高故障发生时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语句出错时能够被识别和重试的错误，仅限在错误类型列表（请参考[表2]）中定义的错误。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| 语句类型   | 支持单语句CN Retry、存储过程、函数、匿名块。不支持事务块中的语句。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| 存储过程语句 | - 包含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支持的错误类型列表
CN Retry支持的错误类型列表和对应的错误码信息见[表2]， 可以通过GUC参数[retry_ecode_list](https://support.huaweicloud.com/devg-dws/dws_04_0932.html#ZH-CN_TOPIC_0000001811490753__section21795287405)设置CN Retry支持的错误类型列表，但不建议用户直接修改该参数，如有修改需求请联系技术工程师协助处理。
 表2CN 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                                             |
   
#### 开启CN Retry功能
设置以下GUC参数开启CN Retry功能：
- 必选GUC参数（CN和DN都需设置） [max_query_retry_times](https://support.huaweicloud.com/devg-dws/dws_04_0932.html#ZH-CN_TOPIC_0000001811490753__sc9cd4d1562654b6ebb842765d3e398e4)，指定SQL语句出错自动重试功能的最大重跑次数，目前支持重跑的错误类型为"Connection reset by peer"、"Lock wait timeout"和"Connection timed out"等，默认值为6。
  ![](https://support.huaweicloud.com/devg-dws/public_sys-resources/caution_3.0-zh-cn.png)
  CN Retry功能开启时会为临时表数据记录日志，为保证数据一致性，在使用临时表时不能切换CN Retry开关状态，保持使用临时表的会话中CN Retry开关始终处于打开状态或者关闭状态。
  

- 可选的GUC参数（如需修改请联系技术支持）
  1. cn_send_buffer_size，指定CN端数据发送数据缓存区的大小。默认值为8KB。
  
  2. max_cn_temp_file_size，指定SQL语句出错自动重试功能中CN端使用临时文件的最大值。默认值为5GB。
   
 
