本文檔列出了PolarDB-X 1.0返回的常見錯誤碼及解決方案。
TDDL-4006 ERR_TABLE_NOT_EXIST
資料表不存在。
樣本:
ERR-CODE: [TDDL-4006][ERR_TABLE_NOT_EXIST] Table '*****' doesn't exist.
該錯誤表示PolarDB-X 1.0資料表不存在,或者由於未知原因PolarDB-X 1.0無法載入資料表的中繼資料資訊。
TDDL-4007 ERR_CANNOT_FETCH_TABLE_META
PolarDB-X 1.0無法載入資料表的中繼資料資訊。
樣本:
ERR-CODE: [TDDL-4007][ERR_CANNOT_FETCH_TABLE_META] Table '*****' metadata
cannot be fetched because Table '*****.*****' doesn't exist.
該錯誤表示PolarDB-X 1.0嘗試讀取資料表的中繼資料資訊失敗。可能的錯誤原因如下:
- 未建立資料表。
- 分庫上的表名被人為刪除或改名。
- 無法串連RDS MySQL。
出現該錯誤時,首先請檢查表名是否存在,然後確認PolarDB-X 1.0後端所有RDS MySQL狀態是否正常。
如果確定表名被人為刪除或改名,可以通過RDS MySQL的資料恢複功能修複。
TDDL-4100 ERR_ATOM_NOT_AVALILABLE
PolarDB-X 1.0後端RDS MySQL暫時不可用。
樣本:
ERR-CODE: [TDDL-4100][ERR_ATOM_NOT_AVALILABLE] Atom : ***** isNotAvailable
如果PolarDB-X 1.0探測到後端某個RDS MySQL執行個體狀態異常,會臨時阻止訪問該執行個體並提示TDDL-4100錯誤。當遇到該錯誤,請檢查PolarDB-X 1.0後端所有RDS MySQL是否異常,並嘗試進行恢複。
當RDS MySQL執行個體從異常狀態恢複後,PolarDB-X 1.0將自動解除不可用狀態,恢複應用正常訪問。
TDDL-4101 ERR_ATOM_GET_CONNECTION_FAILED_UNKNOWN_REASON
未知原因的PolarDB-X 1.0後端串連擷取失敗。
樣本:
ERR-CODE: [TDDL-4101][ERR_ATOM_GET_CONNECTION_FAILED_UNKNOWN_REASON] Get
connection for db '*****' from pool failed. AppName:*****, Env:*****,
UnitName:null. Message from pool: wait millis 5000, active 0, maxActive 5.
You should look for the following logs which contains the real reason.
PolarDB-X 1.0在處理請求時會向後端RDS MySQL非同步建立串連。如果無法在等待時間內完成RDS MySQL串連建立,而非同步任務又尚未返回錯誤原因,PolarDB-X 1.0會嚮應用返回TDDL-4101錯誤。
該錯誤通常是由後端RDS MySQL異常導致的。
TDDL-4102 ERR_ATOM_GET_CONNECTION_FAILED_KNOWN_REASON
已知原因的PolarDB-X 1.0後端串連擷取失敗。
樣本:
ERR-CODE: [TDDL-4102][ERR_ATOM_GET_CONNECTION_FAILED_KNOWN_REASON] Get
connection for db '*****' failed because wait millis 5000, active 0,
maxActive 5
PolarDB-X 1.0擷取後端RDS MySQL串連時出錯,錯誤原因已經在ERR-CODE
訊息中給出。
常見PolarDB-X 1.0後端串連失敗的原因如下:
- 後端RDS MySQL串連數已滿;
- RDS MySQL連線逾時;
- RDS MySQL拒絕串連。
TDDL-4103 ERR_ATOM_CONNECTION_POOL_FULL
PolarDB-X 1.0後端RDS MySQL串連池已滿。
樣本:
ERR-CODE: [TDDL-4103][ERR_ATOM_CONNECTION_POOL_FULL] Pool of DB '*****' is
full. Message from pool: wait millis 5000, active 5, maxActive 5.
AppName:*****, Env:*****, UnitName:null.
該錯誤表示PolarDB-X 1.0後端串連池已滿。導致TDDL-4103錯誤的常見原因如下:
- 應用SQL語句執行比較慢,佔用單個串連的時間過長,導致串連數不夠。
- 應用端沒有關閉資料庫連接,導致串連泄露。
- 有很多跨庫查詢(例如彙總統計類查詢或未帶分庫條件的查詢)同時執行,佔用大量串連。
解決方案建議如下:
- 盡量使用架構訪問資料庫,如Spring JDBC、MyBatis等。
- 按RDS效能分析報告與DBA建議最佳化業務SQL語句。
- 使用PolarDB-X 1.0讀寫分離將跨庫查詢轉寄至讀庫處理。
- 升級更高規格的RDS執行個體,提升後端處理能力。
TDDL-4104 ERR_ATOM_CREATE_CONNECTION_TOO_SLOW
PolarDB-X 1.0後端RDS MySQL串連建立太慢。
樣本:
ERR-CODE: [TDDL-4104][ERR_ATOM_CREATE_CONNECTION_TOO_SLOW] Get connection
for db '*****' from pool timeout. AppName:*****, Env:*****, UnitName:null.
Message from pool: wait millis 5000, active 3, maxActive 5.
PolarDB-X 1.0向後端RDS MySQL非同步建立串連時,如果短時間內建立大量串連,或者RDS MySQL建立連線速度太慢,會出現等待逾時。
該問題通常是由後端RDS MySQL壓力過大或異常導致的,建議使用PolarDB-X 1.0讀寫分離,或者升級更高規格的RDS執行個體,減輕後端處理壓力。
如果問題是由於短時間內建立大量串連導致,請調整PolarDB-X 1.0最小串連數。
TDDL-4105 ERR_ATOM_ACCESS_DENIED
PolarDB-X 1.0後端RDS MySQL拒絕建立串連。
樣本:
ERR-CODE: [TDDL-4105][ERR_ATOM_ACCESS_DENIED] DB '*****' Access denied for
user '*****'@'*****'. AppName:*****, Env:*****, UnitName:null. Please
contact DBA to check.
該錯誤表明PolarDB-X 1.0通過使用者名稱和密碼串連RDS MySQL時被拒絕訪問。
如果不小心在後端RDS MySQL上修改了由PolarDB-X 1.0自動建立的使用者名稱或密碼,就會導致PolarDB-X 1.0提示TDDL-4105錯誤。修複該問題需要手工訂正PolarDB-X 1.0的使用者名稱或密碼。
此外,後端RDS執行個體欠費或到期後會拒絕所有訪問請求,也會導致PolarDB-X 1.0產生TDDL-4105錯誤。如果遇到這種情況,請及時給RDS執行個體續約。
TDDL-4106 ERR_ATOM_DB_DOWN
PolarDB-X 1.0後端RDS MySQL無法串連。
樣本:
ERR-CODE: [TDDL-4106][ERR_ATOM_DB_DOWN] DB '*****' cannot be connected.
AppName:*****, Env:*****, UnitName:null. It seems a very real possibility
that this DB IS DOWN. Please contact DBA to check.
該錯誤表示PolarDB-X 1.0向後端RDS MySQL建立連線逾時或沒有響應。
TDDL-4108 ERR_VARIABLE_CAN_NOT_SET_TO_NULL_FOR_NOW
變數(variable)不允許被設定為NULL
。
樣本:
ERR-CODE: [TDDL-4108][ERR_VARIABLE_CAN_NOT_SET_TO_NULL_FOR_NOW] System
variable ***** can''t set to null for now;
部分MySQL變數(variable)不允許用SET var = x
語句設定成NULL
值。遇到這種情況,PolarDB-X 1.0會提示TDDL-4108錯誤。
如果遇到該錯誤,請檢查傳遞的變數(variable)值,並參考MySQL官方文檔改正,詳情請參見 MySQL官網。
TDDL-4200 ERR_GROUP_NOT_AVALILABLE
PolarDB-X 1.0分庫暫時不可用。
樣本:
ERR-CODE: [TDDL-4200][ERR_GROUP_NOT_AVALILABLE] The TDDL Group ***** is
running in fail-fast status, caused by this SQL:***** which threw a fatal
exception as *****.
當分庫包含的RDS MySQL執行個體出現訪問異常,並且分庫下沒有其他可用執行個體時,PolarDB-X 1.0會將分庫置於fail-fast
狀態並提示TDDL-4200錯誤。
通常該錯誤是由於RDS MySQL故障導致的。請根據包含的RDS MySQL執行個體異常資訊定位和解決問題。當故障RDS MySQL執行個體恢複後,PolarDB-X 1.0將自動取消fail-fast
狀態。
TDDL-4201 ERR_GROUP_NO_ATOM_AVALILABLE
PolarDB-X 1.0分庫內暫時沒有可用RDS MySQL執行個體。
樣本:
ERR-CODE: [TDDL-4201][ERR_GROUP_NO_ATOM_AVALILABLE] All weights of DBs in
Group '*****' is 0. Weights is: *****.
當分庫包含的RDS MySQL執行個體全都不可用,或者處於fail-fast
狀態時,PolarDB-X 1.0會提示TDDL-4201錯誤。
通常該錯誤是由於RDS MySQL故障導致。請檢查後端RDS MySQL執行個體狀態以定位和解決問題。
TDDL-4202 ERR_SQL_QUERY_TIMEOUT
PolarDB-X 1.0查詢逾時。
樣本:
ERR-CODE: [TDDL-4202][ERR_SQL_QUERY_TIMEOUT] Slow query leads to a timeout
exception, please contact DBA to check slow sql. SocketTimout:*** ms,
Atom:*****, Group:*****, AppName:*****, Env:*****, UnitName:null.
該錯誤表示SQL語句在後端RDS MySQL執行個體上的執行時間超過PolarDB-X 1.0設定的socketTimeout
參數限制。預設的PolarDB-X 1.0逾時(socketTimeout)時間設定是900秒。
建議最佳化SQL語句,以及在後端RDS MySQL上建立適合的索引以提升SQL語句的執行效能。
如果最佳化後的SQL語句仍然執行較慢,可以參考如下PolarDB-X 1.0 Hint文法臨時設定逾時時間:
/*TDDL:SOCKET_TIMEOUT=900000*/ SELECT * FROM dual;
其中SOCKET_TIMEOUT
設定的單位是毫秒。
關於PolarDB-X 1.0 Hint,詳情請參見自訂SQL逾時時間。
TDDL-4203 ERR_SQL_QUERY_MERGE_TIMEOUT
分散式查詢逾時。
樣本:
ERR-CODE: [TDDL-4203][ERR_SQL_QUERY_MERGE_TIMEOUT] Slow sql query leads to
a timeout exception during merging results, please optimize the slow sql.
The the default timeout is *** ms. DB is *****
PolarDB-X 1.0執行分散式查詢逾時,預設的逾時設定是900秒。
產生TDDL-4203錯誤表示SQL語句掃描了多個分庫的資料並且執行時間超過900秒,建議進行如下最佳化:
- 盡量在WHERE條件中添加分庫鍵(Sharding key)條件,將SQL語句最佳化成單庫執行。
- 檢查是否可以在後端RDS MySQL上建立適合的索引,提升掃描各個分庫資料的效能。
- 設法消除分散式查詢中的跨庫JOIN,資料重排序等耗時操作,降低資料合併階段的消耗。
如果最佳化後的SQL語句仍然執行較慢,可以使用下面的Hint文法臨時設定PolarDB-X 1.0的逾時時間:
/*TDDL:SOCKET_TIMEOUT=900000*/ SELECT * FROM dual;
其中SOCKET_TIMEOUT
設定的單位是毫秒。
關於PolarDB-X 1.0 Hint,詳情請參見自訂SQL逾時時間。
TDDL-4400 ERR_SEQUENCE
處理Sequence(全域唯一序列)失敗。
樣本:
ERR-CODE: [TDDL-4400][ERR_SEQUENCE] Sequence : All dataSource faild to get
value!
該錯誤表示處理Sequence出錯,錯誤資訊在Sequence :
中給出。
導致該錯誤的常見原因是RDS MySQL故障,無法訪問Sequence有關的資料表。建議先檢查後端RDS MySQL狀態。
TDDL-4401 ERR_MISS_SEQUENCE
Sequence不存在。
樣本:
ERR-CODE: [TDDL-4401][ERR_MISS_SEQUENCE] Sequence '*****' is not found
命令中使用的Sequence名稱不存在。建議用SHOW SEQUENCES
命令檢查PolarDB-X 1.0中所有已建立的Sequence名稱,並且選擇正確的Sequence名稱。
如果使用的Sequence尚不存在,可以用CREATE SEQUENCE
文法建立:
CREATE SEQUENCE <sequence name> [ START WITH <numeric value> ]
[ INCREMENT BY <numeric value> ] [ MAXVALUE <numeric value> ]
[ CYCLE | NOCYCLE ]`
關於Sequence,詳情請參見Sequence。
TDDL-4403 ERR_MISS_SEQUENCE_TABLE_ON_DEFAULT_DB
Sequence使用的資料表不存在。
樣本:
ERR-CODE: [TDDL-4403][ERR_MISS_SEQUENCE_TABLE_ON_DEFAULT_DB] Sequence table
is not in default db.
無法在後端的資料庫裡訪問名稱為sequence
或者sequence_opt
的資料表。
TDDL-4404 ERR_SEQUENCE_TABLE_META
Sequence資料表結構錯誤。
樣本:
ERR-CODE: [TDDL-4404][ERR_SEQUENCE_TABLE_META] the meta of sequence table
is error, some columns missed
Sequence相關資料表(如sequence
或sequence_opt
)中缺少相應的欄位。
TDDL-4405 ERR_INIT_SEQUENCE_FROM_DB
初始化Sequence錯誤。
樣本:
ERR-CODE: [TDDL-4405][ERR_INIT_SEQUENCE_FROM_DB] init sequence manager
error: *****
在初始化需要訪問的Sequence時出錯,錯誤資訊在init sequence manager error:
後給出。
建議先檢查後端RDS MySQL狀態。
TDDL-4407 ERR_OTHER_WHEN_BUILD_SEQUENCE
訪問Sequence資料表出錯。
樣本:
ERR-CODE: [TDDL-4407][ERR_OTHER_WHEN_BUILD_SEQUENCE] error when build
sequence: *****
在訪問Sequence相關資料表(如sequence
或 sequence_opt
)時發生錯誤。錯誤資訊在error when build sequence:
後給出。
建議先檢查後端RDS MySQL狀態。
DDL-4408 ERR_SEQUENCE_NEXT_VALUE
擷取Sequence值出錯。
樣本:
ERR-CODE: [TDDL-4408][ERR_SEQUENCE_NEXT_VALUE] error when get sequence's
next value, sequence is: *****, error: *****
使用PolarDB-X 1.0自增主鍵,或者使用<sequence name>.NEXTVAL
文法手工擷取全域唯一ID時發生錯誤。錯誤原因在error:
提示後給出。
產生TDDL-4408錯誤的原因一般來自後端的RDS MySQL故障。建議先檢查後端RDS MySQL狀態和訪問壓力。
TDDL-4500 ERR_PARSER
解析SQL語句失敗。
樣本:
ERR-CODE: [TDDL-4500][ERR_PARSER] not support statement: '*****'
PolarDB-X 1.0支援符合SQL-92標準的SQL文法,以及MySQL支援的文法擴充與函數。請檢查執行的SQL語句是否符合PolarDB-X 1.0相容的SQL文法標準及MySQL規範。
關於SQL標準文法,請參見SQL標準文法。
關於PolarDB-X 1.0相容的SQL文法,請參見SQL使用限制。
TDDL-4501 ERR_OPTIMIZER
最佳化器轉換SQL語句失敗。
樣本:
ERR-CODE: [TDDL-4501][ERR_OPTIMIZER] optimize error by: Unknown column
'*****' in 'order clause'
PolarDB-X 1.0最佳化器的工作是轉換SQL語句到內部文法樹。如果SQL語句中出現邏輯錯誤,最佳化器轉換就會失敗,產生TDDL-4501錯誤。
建議按照optimize error by:
後的提示檢查和調整您的SQL語句。
TDDL-4502 ERR_OPTIMIZER_MISS_ORDER_FUNCTION_IN_SELECT
ORDER BY
包含的函數列在SELECT
子句中不存在。
樣本:
ERR-CODE: [TDDL-4502][ERR_OPTIMIZER_MISS_ORDER_FUNCTION_IN_SELECT] Syntax
Error: orderBy/GroupBy Column ***** is not existed in select clause`
當SQL語句中的ORDER BY
子句包含函數列(例如RAND())時,PolarDB-X 1.0要求同樣的函數列必須也在SELECT
子句中出現,否則提示TDDL-4502錯誤。
建議在SELECT
子句中添加相應的函數列。
TDDL-4504 ERR_OPTIMIZER_SELF_CROSS_JOIN
相同表JOIN的條件不足。
樣本:
ERR-CODE: [TDDL-4504][ERR_OPTIMIZER_SELF_CROSS_JOIN] self cross join case,
add shard column filter on right table
PolarDB-X 1.0在執行相同表的JOIN時,如果WHERE
子句只包含其中一張左表(或右表)的拆分欄位(sharding column)條件,會提示TDDL-4504錯誤。
建議調整SQL語句,在WHERE
子句中補全JOIN左表(或右表)的拆分欄位條件。
TDDL-4506 ERR_MODIFY_SHARD_COLUMN
禁止更新拆分鍵。
樣本:
ERR-CODE: [TDDL-4506][ERR_MODIFY_SHARD_COLUMN] Column '*****' is a sharding
key of table '*****', which is forbidden to be modified.
PolarDB-X 1.0禁止使用UPDATE語句修改拆分鍵(sharding key)的值。由於更新操作很可能會改變資料所在的分區,PolarDB-X 1.0無法保證操作的原子性與資料的一致性。
建議將對應UPDATE
語句修改為相同效果的INSERT+DELETE
語句。
TDDL-4508 ERR_OPTIMIZER_NOT_ALLOWED_SORT_MERGE_JOIN
無法執行合并排序JOIN。
樣本:
ERR-CODE: [TDDL-4508][ERR_OPTIMIZER_NOT_ALLOWED_SORT_MERGE_JOIN] sort merge
join is not allowed when missing equivalent filter
如果SQL語句中需要JOIN的資料表分別來自不同的RDS MySQL執行個體,PolarDB-X 1.0會優先選擇合并排序(Sort-merge Join
)演算法。該演算法要求JOIN的左表與右表必須包含欄位相等的關聯條件,否則將提示TDDL-4508錯誤。
建議調整SQL語句,在JOIN
或WHERE
部分添加相應的關聯條件。
TDDL-4509 ERR_OPTIMIZER_ERROR_HINT
Hint語法錯誤。
樣本:
ERR-CODE: [TDDL-4509][ERR_OPTIMIZER_ERROR_HINT] Hint Syntax Error:
unexpected operation: *****.
該錯誤表示SQL語句中的Hint文法無法被PolarDB-X 1.0解析。更多關於Hint文法資訊,請參見Hint簡介。
TDDL-4510 ERR_CONTAINS_NO_SHARDING_KEY
缺少拆分鍵(sharding key)條件。
樣本:
ERR-CODE: [TDDL-4510][ERR_CONTAINS_NO_SHARDING_KEY] Your SQL contains NO
SHARDING KEY '*****' for table '*****', which is not allowed in DEFAULT.
如果PolarDB-X 1.0拆分表沒有開啟全表掃描(full-table scan)功能,則訪問該表時必須在WHERE
子句中包含拆分鍵條件。否則,將提示TDDL-4510錯誤。
PolarDB-X 1.0在建表時預設開啟全表掃描功能。如果手工關閉全表掃描,建議確認與該表有關的SQL語句都已添加拆分鍵條件。
TDDL-4511 ERR_INSERT_CONTAINS_NO_SHARDING_KEY
INSERT
語句缺少拆分鍵 (sharding key)。
樣本:
ERR-CODE: [TDDL-4511][ERR_INSERT_CONTAINS_NO_SHARDING_KEY] Your INSERT SQL
contains NO SHARDING KEY '*****' for table '*****'.
當INSERT語句的目標是一張PolarDB-X 1.0拆分表時,必須在插入資料中包含拆分鍵的值(拆分鍵是自增主鍵例外)。否則,將提示TDDL-4511錯誤。
如果遇到該錯誤,建議修改INSERT
語句補充缺少的拆分索引值。
TDDL-4515 ERR_CONNECTION_CHARSET_NOT_MATCH
輸入字元集不匹配。
樣本:
ERR-CODE: [TDDL-4515][ERR_CONNECTION_CHARSET_NOT_MATCH] Caused by MySQL's
character_set_connection doesn't match your input charset. Partition DDL can
only take ASCII or chinese column name. If you want use chinese table or
column name, Make sure MySQL connection's charset support chinese character.
Use "set names xxx" to set correct charset.
PolarDB-X 1.0支援用中文字元命名表名及欄位名。在執行含有中文字元的SQL語句時,如果資料庫連接的字元集設定(character_set_connection
)不支援中文(如 latin1
),會提示TDDL-4515錯誤。
您可以使用SHOW VARIABLES LIKE 'character_set_connection'
查詢MySQL用戶端當前的串連字元集,使用SET NAMES x
命令修改當前串連字元集。如果是Java程式JDBC方式串連PolarDB-X 1.0,請設定資料庫連接參數characterEncoding
。
TDDL-4516 ERR_TRUNCATED_DOUBLE_VALUE_OVERFLOW
浮點數轉換為整數溢出。
樣本:
ERR-CODE: [TDDL-4516][ERR_TRUNCATED_DOUBLE_VALUE_OVERFLOW] Truncated
incorrect DOUBLE value '*****' over column[*****]'s value range.
PolarDB-X 1.0將浮點數轉換成對應類型的整數時,結果超過了整數類型的取值範圍。建議檢查SQL語句中的欄位類型和輸入參數。
TDDL-4517 ERR_MODIFY_SYSTEM_TABLE
禁止修改系統資料表。
樣本:
ERR-CODE: [TDDL-4517][ERR_MODIFY_SYSTEM_TABLE] Table '*****' is PolarDB-XSYSTEM
TABLE, which is forbidden to be modified.
PolarDB-X 1.0內部維護了一些系統資料表,使用SQL語句更新其中的資料會提示TDDL-4517錯誤。
限制的系統資料表包括sequence
、sequence_opt
、txc_undo_log
和__DRDS__SYSTEM__LOCK__
,請避免在業務或資料庫設計中使用這些表名。
TDDL-4518 ERR_VALIDATE
中繼資料校正失敗。
樣本:
ERR-CODE: [TDDL-4518][ERR_VALIDATE] Object 'optest1' not found
SQL發送到PolarDB-X 1.0計算節點上,會基於現有的元資訊做校正,這個異常說明查詢的表或者列等資訊不符合現有元資訊要求。
TDDL-4600 ERR_FUNCTION
錯誤的函數調用。
樣本:
ERR-CODE: [TDDL-4600][ERR_FUNCTION] function compute error by Incorrect
parameter count in the call to native function '*****'
該錯誤表明在SQL語句中使用了錯誤的文法或參數調用函數。建議仔細檢查SQL語句中的函數調用部分,並且使用正確的參數個數和類型調用函數。
TDDL-4601 ERR_EXECUTOR
SQL執行過程出錯。
樣本:
ERR-CODE: [TDDL-4601][ERR_EXECUTOR] only one column is supported in
distinct aggregate
該錯誤代表PolarDB-X 1.0在執行SQL語句過程中出現了意外錯誤。這類錯誤通常與後端RDS MySQL異常狀態有關。
TDDL-4602 ERR_CONVERTOR
錯誤的類型轉換。
樣本:
ERR-CODE: [TDDL-4602][ERR_CONVERTOR] convertor error by Unsupported convert:
[*****]
該錯誤表明PolarDB-X 1.0在執行SQL時進行資料類型轉換失敗。請檢查SQL語句中是否存在需要隱式類型轉換的資料,並且盡量使用相同類型進行比較和計算。
TDDL-4603 ERR_ACCROSS_DB_TRANSACTION
跨庫事務失敗。
樣本:
ERR-CODE: [TDDL-4603][ERR_ACCROSS_DB_TRANSACTION] Transaction accross db is
not supported in current transaction policy, transaction node is: {0}, but
this sql execute on: *****.
PolarDB-X 1.0預設僅支援單庫事務,即事務中的所有SQL語句都必須按規則轉寄到相同RDS MySQL分庫執行。否則,將提示TDDL-4603錯誤。
TDDL-4604 ERR_CONCURRENT_TRANSACTION
嵌套事務失敗。
樣本:
ERR-CODE: [TDDL-4604][ERR_CONCURRENT_TRANSACTION] Concurrent query is not
supported on transaction group, transaction group is: {0}.
PolarDB-X 1.0不支援嵌套事務,如果在同一個資料庫連接裡嘗試同時開啟2個以上事務,將提示TDDL-4604錯誤。
建議在應用開發時避免使用嵌套事務,或者使用應用程式層的事務架構防止產生嵌套事務。
TDDL-4606 ERR_QUERY_C
當前執行的SQL被取消。
樣本:
ERR-CODE: [TDDL-4606][ERR_QUERY_CANCLED] Getting connection is not allowed
when query has been cancled, group is *****
使用KILL x
取消某條正在執行的SQL語句時,被取消的SQL語句會返回該錯誤。如果經常出現這一情況,請排查是否有用戶端或程式在執行KILL
命令。
TDDL-4607 ERR_INSERT_WHEN_UPDATE
以INSERT DELETE
方式執行UPDATE
語句時出錯。
樣本:
ERR-CODE: [TDDL-4607][ERR_INSERT_WHEN_UPDATE] Insert new values error,
table is: *****, old Values: *****, new Values: *****
開啟允許更新分庫鍵(Sharding-key)功能後,PolarDB-X 1.0可以將UPDATE
分庫索引值的SQL語句按照INSERT+DELETE
方式轉換執行。如果執行失敗,則提示TDDL-4607錯誤。
該錯誤通常是因為後端RDS MySQL故障導致的。建議首先檢查RDS MySQL狀態。
TDDL-4610 ERR_CONNECTION_CLOSED
串連已經關閉。
樣本:
ERR-CODE: [TDDL-4610][ERR_CONNECTION_CLOSED] connection has been closed
當事務中的SQL語句執行出錯,或者被KILL
命令取消後,重複使用同一個資料庫連接執行其他SQL語句會提示TDDL-4610錯誤。
建議在該情況下關閉串連,重新擷取一個新的資料庫連接。
TDDL-4636 ERR_DDL_JOB_ERROR
DDL語句執行失敗。
樣本:
ERR-CODE: [PXC-4636][ERR_DDL_JOB_ERROR] xxxx
該錯誤碼錶示DDL語句執行失敗,處理方法請參見如何處理DDL異常。
TDDL-4642 ERR_UNKNOWN_TABLE
資料庫中不存在這張表。
樣本:
ERR-CODE: [PXC-4642][ERR_UNKNOWN_TABLE] Unknown table XX.XX
請檢查當前資料庫中是否有這張表。
TDDL-1305 ERR_UNKNOWN_SAVEPOINT
指定名稱的SAVEPOINT
不存在。
樣本:
ERR-CODE: [TDDL-1305][ERR_UNKNOWN_SAVEPOINT] SAVEPOINT ***** does not exist
在PolarDB-X 1.0上執行ROLLBACK TO SAVEPOINT x
或者RELEASE SAVEPOINT x
命令時,如果指定的SAVEPOINT
名稱不存在,會提示TDDL-1305錯誤。
建議檢查SAVEPOINT
命令返回的名稱是否和使用的名稱一致。
TDDL-1094 ERR_UNKNOWN_THREAD_ID
KILL
命令指定的會話ID不存在。
樣本:
ERR-CODE: [TDDL-1094][ERR_UNKNOWN_THREAD_ID] Unknown thread id: *****
在PolarDB-X 1.0上執行KILL x
命令取消執行的SQL語句時,如果指定的會話ID不存在,或者對應的SQL語句已經結束執行,會提示TDDL-1094錯誤。
建議使用SHOW PROCESSLIST
命令查看正在執行的SQL語句會話ID,並只使用返回的ID執行KILL
操作。
TDDL-4612 ERR_CHECK_SQL_PRIV
由於許可權不夠,SQL語句無法執行。
樣本:
ERR-CODE: [TDDL-4612][ERR_CHECK_SQL_PRIV] check user ***** on db ***** sql
privileges failed.
PolarDB-X 1.0支援帳號和授權,類似MySQL帳號許可權體系,只有擁有對應類型許可權的帳號才能執行該SQL語句。如果帳號許可權不足,PolarDB-X 1.0將提示TDDL-4612錯誤。
建議檢查使用者擁有的PolarDB-X 1.0許可權。如果許可權不足,請在PolarDB-X 1.0控制台設定。
TDDL-4613 ERR_INSERT_SELECT
執行INSERT ... SELECT
語句出錯。
樣本:
ERR-CODE: [TDDL-4613][ERR_INSERT_SELECT] insert error, table is: *****,
values: *****
PolarDB-X 1.0支援將跨庫的INSERT ... SELECT
語句拆分成獨立的SELECT和INSERT語句批量執行。如果執行失敗,則提示TDDL-4613錯誤。
該錯誤通常是因為後端RDS MySQL故障導致的。建議首先檢查RDS MySQL狀態。
TDDL-4614 ERR_EXECUTE_ON_MYSQL
SQL語句在RDS MySQL上執行報錯。
樣本:
ERR-CODE: [TDDL-4614][ERR_EXECUTE_ON_MYSQL] Error occurs when execute on GROUP '*****': Duplicate entry '*****' for key 'PRIMARY'
Duplicate entry '*****' for key 'PRIMARY'
表示寫入RDS MySQL資料表發生了主鍵衝突。The table '*****' is full
表示RDS MySQL使用的暫存資料表已滿,需要調整暫存資料表空間或最佳化SQL語句。Deadlock found when trying to get lock;
表示在RDS MySQL中出現了死結,通常是資料寫入存在較多事務衝突導致的。
建議參考TDDL-4614提供的原始錯誤資訊排查問題。更多關於SQL語句錯誤資訊請參見MySQL(5.6)文檔。
TDDL-4615 ERR_CROSS_JOIN_SIZE_PROTECTION
分布式JOIN返回的資料行數超出限制。
樣本:
ERR-CODE: [TDDL-4615][ERR_CROSS_JOIN_SIZE_PROTECTION] across join table size protection, check your sql or enlarge the limination size .
當PolarDB-X 1.0以嵌套迴圈(Nested-loop)方式執行分布式JOIN語句時,如果從右表返回大量資料,將嚴重佔據記憶體,影響PolarDB-X 1.0服務的穩定性。因此,PolarDB-X 1.0限制這種情況下右表返回的資料行數最多不能超過5000。如果超出這一限制,PolarDB-X 1.0會提示TDDL-4615錯誤。
建議最佳化SQL語句避免從右表返回大量資料,或者讓PolarDB-X 1.0能夠使用更好的演算法(如合并排序Sort-merge Join)執行分布式JOIN。
- 如果單條記錄超過100K,不建議調整該值。
- 如果單條記錄不超過100K,可以適當調整。建議不要設定太大的值,否則會有爆記憶體的風險。
- 假設單條記錄是100K,參與分布式JOIN計算的記憶體就需要500M(100K*5000)。如果有多個串連都在運行該SQL,很容易引起爆記憶體,例如有5個串連同時在運行該SQL,就需要2.5G(500M*5)的記憶體。
- 如果確實需要調整,請在需要調整的SQL前面加HINT,例如調整成5100:
/*!TDDL:MAX_ROW_RETURN_FROM_RIGHT_INDEX_NESTED_LOOP=5100*/SQL
。
TDDL-4616 ERR_UNKNOWN_DATABASE
錯誤的資料庫。
樣本:
ERR-CODE: [TDDL-4616][ERR_UNKNOWN_DATABASE] Unknown database '*****'
PolarDB-X 1.0允許在DDL語句中指定資料庫名稱。如果指定的資料庫名稱與PolarDB-X 1.0提供的資料庫名稱不一致,將返回TDDL-4616錯誤。
建議修改DDL語句中的資料庫名稱,確保與PolarDB-X 1.0資料庫名稱一致。
TDDL-4617 ERR_SUBQUERY_LIMIT_PROTECTION
子查詢返回的資料行數超出限制。
樣本:
ERR-CODE: [TDDL-4617][ERR_SUBQUERY_LIMIT_PROTECTION] The number of rows returned by the subquery exceeds the maximum number of 20000.
當PolarDB-X 1.0執行含子查詢(Sub-query)的SQL語句時,如果子查詢返回大量資料,會嚴重佔據記憶體,影響PolarDB-X 1.0服務的穩定性。因此,PolarDB-X 1.0限制這種情況下子查詢返回的資料行數最多不能超過20000。如果超出這一限制,PolarDB-X 1.0會返回TDDL-4617錯誤。
建議最佳化SQL語句中的子查詢避免返回大量資料。或者設法將子查詢改寫成JOIN形式,讓PolarDB-X 1.0能夠使用更好的演算法(如合并排序Sort-merge Join)執行。
TDDL-4800 ERR_SET_TXCID
執行SET TXC_ID x
命令失敗。
樣本:
ERR-CODE: [TDDL-4800][ERR_SET_TXCID] set txc_id failed: *****
TDDL-4801 ERR_TXCID_NULL
執行SELECT LAST_TXC_ID
返回NULL。
樣本:
ERR-CODE: [TDDL-4801][ERR_TXCID_NULL] txc_xid is null: *****
TDDL-4802 ERR_SELECT_LAST_TXCID
執行SELECT LAST_TXC_ID
命令失敗。
樣本:
ERR-CODE: [TDDL-4802][ERR_SELECT_LAST_TXCID] select last_txc_xid failed: *****
TDDL-4994 ERR_FLOW_CONTROL
流量控制。
樣本:
ERR-CODE: [TDDL-4994][ERR_FLOW_CONTROL] [*****] flow control by *****
該錯誤代表PolarDB-X 1.0處理SQL請求已達到內部資料傳輸量上限,當前請求被拒絕。
建議檢查SQL請求量是否存在異常峰值。
TDDL-4998 ERR_NOT_SUPPORT
不支援的特性。
樣本:
ERR-CODE: [TDDL-4998][ERR_NOT_SUPPORT] ***** not support yet!
該錯誤表示使用的SQL文法或者功能PolarDB-X 1.0尚不支援。
TDDL-5001 ERR_TRANS
一般性的事務錯誤。
樣本:
ERR-CODE: [TDDL-5001][ERR_TRANS] Too many lines updated in statement.
請參考錯誤資訊處理,Too many lines updated in statement
表示事務中的UPDATE語句更新行數超出限制(1000),建議檢查UPDATE語句的WHERE
條件。如果需要在事務中執行大批量資料更新,可以使用PolarDB-X 1.0 Hint語句/*TDDL:UNDO_LOG_LIMIT={number}*/
調整限制值。
Deferred execution is only supported in Flexible or XA Transaction
表示後置執行功能僅僅在柔性事務與XA事務策略下可用。在用PolarDB-X 1.0 Hint語句/*TDDL:DEFER*/
提交後置執行語句之前,請先用SET drds_transaction_policy = ***
命令更改事務策略。
TDDL-5002 ERR_TRANS_UNSUPPORTED
事務中的文法或功能尚不支援。
樣本:
ERR-CODE: [TDDL-5002][ERR_TRANS_UNSUPPORTED] Table without primary keys is not
supported.
TDDL-5003 ERR_TRANS_LOG
無法訪問交易記錄。
樣本:
ERR-CODE: [TDDL-5003][ERR_TRANS_LOG] Failed to update transaction state: *****
為保證分散式交易的原子性,PolarDB-X 1.0在事務中會訪問後端RDS MySQL上的交易記錄。如果PolarDB-X 1.0在讀寫交易記錄時出錯,將返回TDDL-5003錯誤。
產生TDDL-5003錯誤的原因通常來自後端的RDS MySQL故障。建議檢查PolarDB-X 1.0後端RDS MySQL狀態和訪問壓力。
TDDL-5004 ERR_TRANS_NOT_FOUND
事務ID不存在。
ERR-CODE: [TDDL-5008][ERR_TRANS_TERMINATED] Current transaction was killed
or timeout. You may need to set a longer timeout value.
如果事務在執行中被Kill或者逾時(執行時間超出drds_transaction_timeout值),則出現該錯誤。
如果是事務逾時導致報錯,建議使用SET drds_transaction_timeout = ***命令修改事務的執行時間上限,單位是毫秒。
TDDL-5006 ERR_TRANS_COMMIT
事務提交過程中出錯。
ERR-CODE: [TDDL-5006][ERR_TRANS_COMMIT] Failed to commit primary group *****:
*****, TRANS_ID = *****
PolarDB-X 1.0在提交事務分支過程中出錯,TRANS_ID對應的事務將被自動復原。
產生TDDL-5006錯誤的原因通常來自後端的RDS MySQL故障。建議檢查PolarDB-X 1.0後端RDS MySQL狀態和訪問壓力。
TDDL-5007 ERR_TRANS_PARAM
事務參數不正確。
ERR-CODE: [TDDL-5007][ERR_TRANS_PARAM] Illegal timeout value: *****
命令中指定事務參數不正確,例如SET drds_transaction_timeout = ***
指定的參數值是負數。
TDDL-5008 ERR_TRANS_TERMINATED
事務已Kill或逾時中止。
ERR-CODE: [TDDL-5008][ERR_TRANS_TERMINATED] Current transaction was killed
or timeout. You may need to set a longer timeout value.
如果事務在執行中被Kill或者逾時(執行時間超出drds_transaction_timeout
值),則出現該錯誤。
如果是事務逾時導致報錯,建議使用SET drds_transaction_timeout = ***
事務的執行時間上限,單位是毫秒。