本文介紹查詢與分析日誌的常見報錯及對應的解決方案。
logstore * does not exist
logstore without index config
Too many queued queries
錯誤描述
您當前查詢的Logstore中索引欄位別名發生衝突,SQL無法確定您想要分析的具體列。
原理解釋
SLS SQL並發配額是使用者Project層級隔離,同一個Project中的多個SQL請求提交到SLS服務端,當SQL正在執行中,將佔用一個SQL並發配額;當SQL執行完成,將歸還本次分配的SQL並發配額。 使用者一個Project的SQL並發配額,執行普通SQL模式時為15,執行增強SQL模式時為150。
報錯原因
您的並發請求數過高。
您單次請求SQL的延時較高。
您的業務代碼中SQL請求異常重試邏輯導致的大量迴圈重試。
解決方案
降低請求量。
最佳化SQL,減少單次SQL的執行延時。
重試邏輯增加隨機等待時間,避免無效重複的迴圈重試,導致額外並發請求壓力的增加。
duplicate column conflicts
denied by sts or ram, action:*
you are using nested sql, please specify FROM LOGSTORE in the innermost sql
錯誤描述
您正在SQL中使用嵌套子查詢,請在最內層的子查詢中指定表名。
報錯原因
SLS為了簡化使用者查詢,在進行單表查詢時,預設指定當前所在Logstore為FROM所在表。假設您當前Logstore名為test,那麼,以下3個查詢語句是同義的:
語句1:您可以不指定FROM子句。
語句2:您可以使用FROM log,這將指定當前所在Logstore。
語句3:您可以明確指定您查詢的表為Logstore為test。
但當您進行包含子查詢的複雜查詢時,SLS無法為您推斷各子查詢中目標表,所以您必須在子查詢中手動指定FROM子句。
解決方案
如果您想查詢當前Logstore,您可以直接使用"FROM log"常量字串指定From表為當前Logstore。
當然您也可以明確指定您要查詢的目標Logstore名字。
IN value and list items must be the same type: varchar
Unexpected parameters (bigint) for function url_decode. Expected: url_decode(varchar(x))
錯誤描述
SQL語句中存在語法錯誤,使用SQL函數時,輸入的參數類型不正確。
報錯原因
該函數需要接收一個字串類型的參數,但是輸入的參數類型為bigint。
這類錯誤可能出現在不同的函數中,不一定是url_decode,也有可能是regexp_like,但錯誤原因一樣:使用SQL函數時,輸入的參數類型不正確。
解決方案
將輸入的參數轉換為字串類型後再傳遞給url_decode函數。可以使用CAST或CONVERT函數將bigint類型的參數轉換為字串類型的參數,或者直接在調用該函數時使用引號將參數括起來,將其轉換為字串類型。例如:
SELECT url_decode(CAST(bigint_param AS varchar(20))) -- 使用CAST函數將bigint型別參數轉換為字串類型SELECT url_decode('123456789') -- 若參數是字面量,可以直接將參數括起來,將其轉換為
target of repeat operator is not specified
NULL values are not allowed on the probe side of SemiJoin operator. See the query plan for details.
Array subscript out of bounds
Expression "*" is not of type ROW
Key-value delimiter must appear exactly once in each entry. Bad input: '*'
Pattern has # groups. Cannot access group
錯誤描述
正則匹配無法訪問指定組。
報錯原因
正則匹配到0個組,無法訪問第1個組。 有可能在Regex中使用了分組文法,但是沒有定義任何分組。在此情況下,無法訪問分組,因為分組根本不存在。
解決方案
檢查Regex中的分組文法,並確保至少有一個分組定義在模式中。可以使用圓括弧 () 來定義分組。例如,要匹配一個字串中的電子郵件地址,並將使用者名稱和網域名稱分別作為分組,請使用以下Regex:(w+)@(w+.w+)。在這個例子中,有兩個分組,因此可以用 group(1) 和 group(2) 來訪問分組的值。如果不需要分組,可以使用非捕獲分組,例如:(?:w+)@(?:w+.w+)。如果問題依然存在,可以使用線上正則檢查器進行線上調試,待驗證無誤後再填充到SQL中。
ts_compare must gropu by timestamp,your grouping by type is :bigint
錯誤描述
ts_compare函數必須按timestamp類型分組。
報錯原因
您在SQL中使用ts_compare函數時,group by的列,可能是非timestamp類型的數值型或其他類型。
解決方案
請確保ts_compare函數對應的group by列類型使用正確的timestamp類型,您可以使用from_unixtime函數等函數將整型時間戳記轉換成timestamp類型。
time # is out of specified time range
ROW comparison not supported for fields with null elements
The specified key does not exist.
reading data with pagination only allow reading max
Could not choose a best candidate operator. Explicit type casts must be added.
Function * not registered
SQL array indices start at 1
Index must be greater than zero
All COALESCE operands must be the same type: *
Multiple columns returned by subquery are not yet supported.
GROUP BY clause cannot contain aggregations or window functions: *
錯誤描述
GROUP BY子句不能包含彙總函式或視窗函數。
報錯原因
在GROUP BY子句中包含彙總函式或視窗函數。
解決方案
請在GROUP BY子句中只包含列名,而不是彙總函式或視窗函數。彙總函式和視窗函數應該在SELECT語句中使用,而不是在GROUP BY子句中使用。如果您需要在GROUP BY子句中使用彙總函式,則可以使用列的別名或數字索引來代替彙總函式。例如,使用以下查詢:
SELECT column1, column2, COUNT(column3) as count_column3 FROM table GROUP BY column1, column2, 3在這個查詢中,count_column3 是 COUNT(column3) 的別名,3 是 COUNT(column3) 在SELECT語句中的位置。請注意,使用數字索引可能會使代碼難以理解,建議使用列別名。
WHERE BY clause cannot contain aggregations or window functions: *
錯誤描述
WHERE子句不能包含彙總函式或視窗函數。
報錯原因
在WHERE子句中包含彙總函式或視窗函數。
解決方案
請在WHERE子句中只包含列名,而不是彙總函式或視窗函數。彙總函式和視窗函數應該在SELECT語句中使用,而不是在WHERE子句中使用。如果您需要在WHERE子句中使用彙總函式,則可以使用列的別名來代替彙總函式。
例如,使用以下查詢:
SELECT column1, column2, COUNT(column3) as count_column3 FROM table WHERE count_column3 > 10在這個查詢中,count_column3 是 COUNT(column3) 的別名,它代表column3的彙總計數結果。
Left side of LIKE expression must evaluate to a varchar (actual: bigint)
Left side of logical expression must evaluate to a boolean (actual: varchar)
Right side of logical expression must evaluate to a boolean (actual: bigint)
Invalid JSON path: ...
錯誤描述
非法JSON訪問路徑。
報錯原因
您在SQL中使用JSON函數(如json_extract、json_extract_scalar、json_size等)訪問指定的JSON路徑時,未指定有效路徑。
解決方案
正常指定json_path,格式為
$.a.b。其中$代表當前JSON對象的根節點,半形句號.引用到待提取的節點(可級聯),但是當JSON對象的欄位中存在特殊字元(如.、空格、-等),例如 http.path、http path、http-path等,則需要使用中括弧[]代替半形句號.,然後使用雙引號""包裹欄位名,例如:* | SELECT json_extract_scalar(request, '$["X-Power-Open-App-Id"]')您可以參考JSON函數使用說明,瞭解JSON函數和json_path的具體用法。您還可以參考查詢和分析JSON日誌的常見問題瞭解json_path的具體使用方式。
max distinct num is:10, please use approx_distinct
Key not present in map
line 1:44: Column 'XXX' cannot be resolved;please add the column in the index attribute
報錯原因
未對XXX欄位建立索引。
解決方案
為目標欄位設定索引,並開啟統計功能。具體操作,請參見建立索引。
ErrorType:QueryParseError.ErrorMessage:syntax error error position is from column:10 to column:11,error near < : >
報錯原因
查詢和分析語句的語法錯誤,錯誤位置在冒號(:)附近。
解決方案
檢查及修改查詢和分析語句,然後重新執行。
Column 'XXX' not in GROUP BY clause;please add the column in the index attribute
報錯原因
在SQL語句中,如果您使用了GROUP BY子句,則在執行SELECT語句時,只能選擇GROUP BY的列或者對任意列進行彙總計算,不允許選擇非GROUP BY的列。例如
* | SELECT status, request_time, COUNT(*) AS PV GROUP BY status為非法分析語句,因為request_time不是GROUP BY的列。解決方案
修改查詢和分析語句,然後重新執行。例如上述樣本的正確語句為
* | SELECT status, arbitrary(request_time), count(*) AS PV GROUP BY status。更多資訊,請參見GROUP BY子句。
sql query must follow search query,please read syntax doc
報錯原因
僅使用了分析語句。在Log Service中,分析語句必須與查詢語句一起使用,格式為
查詢語句|分析語句。解決方案
在分析語句前加上查詢語句,例如
* | SELECT status, count(*) AS PV GROUP BY status。更多資訊,請參見基礎文法。
line 1:10: identifiers must not start with a digit; surround the identifier with double quotes
報錯原因
分析語句中的列名、變數名等以數字開頭,不符合規範。在SQL標準中,列名必須由字母、數字和底線(_)組成,且以字母開頭。
解決方案
更改別名。如何修改,請參見列的別名。
line 1:9: extraneous input ‘’ expecting
報錯原因
輸入了多餘的中文引號。
解決方案
檢查及修改查詢和分析語句,然後重新執行。
key (XXX) is not config as key value config,if symbol : is in your log,please wrap : with quotation mark "
報錯原因
未對XXX欄位建立欄位索引,或者您所使用的欄位中包含了特殊字元(例如空格)但未使用雙引號("")包裹。
解決方案
確認是否已為目標欄位建立欄位索引且開啟統計功能。
如果是,請執行下一步。
如果不是,請先為目標欄位建立欄位索引且開啟統計功能。具體操作,請參見手動建立欄位索引。
執行該操作後,如果問題解決,則無需執行下一步。
使用雙引號("")包裹目標欄位。
Query exceeded max memory size of 3GB
報錯原因
當前查詢和分析語句所使用的服務端記憶體超過3 GB。該問題通常是因為使用GROUP BY子句去重後,值太多導致的。
解決方案
最佳化GROUP BY子句,減少GROUP BY子句中欄位的個數。
ErrorType:ColumnNotExists.ErrorPosition,line:0,column:1.ErrorMessage:line 1:123: Column 'XXX' cannot be resolved; it seems XXX is wrapper by ";if XXX is a string ,not a key field, please use 'XXX'
報錯原因
XXX不是索引欄位,不能使用雙引號("")包裹。在分析語句中,表示字串的字元必須使用單引號('')包裹,無符號包裹或被雙引號("")包裹的字元表示欄位名或列名。
解決方案
如果XXX為分析欄位,您需要為該欄位配置索引,並開啟統計功能。具體操作,請參見建立索引。
如果XXX為一般字元串,需要使用單引號('')包裹。
user can only run 15 query concurrently
報錯原因
分析操作並發數超過了15個。在Log Service中,單個Project支援的最大分析操作並發數為15個。
解決方案
合理控制分析操作的並發數。
unclosed string quote
報錯原因
查詢和分析語句的雙引號(")未成對出現。
解決方案
檢查及修改查詢和分析語句,然後重新執行。
error after :.error detail:error after :.error detail:line 1:147: mismatched input 'in' expecting {<EOF>, 'GROUP', 'ORDER', 'HAVING', 'LIMIT', 'OR', 'AND', 'UNION', 'EXCEPT', 'INTERSECT'}
報錯原因
輸入了錯誤的關鍵詞in。
解決方案
檢查及修改查詢和分析語句,然後重新執行。
Duplicate keys (XXX) are not allowed
報錯原因
建立索引時,為欄位配置了重複的索引。
解決方案
檢查您的索引配置。具體操作,請參見建立索引。
only support * or ? in the middle or end of the query
報錯原因
使用模糊查詢時,未正確使用萬用字元。
解決方案
修改查詢和分析語句中的萬用字元。相關說明如下:
支援在詞的中間或者末尾加上模糊查詢關鍵字,即星號(*)或問號(?)。
星號(*)或問號(?)不能用在詞的開頭。
long資料類型和double資料類型不支援使用星號(*)或問號(?)進行模糊查詢。
logstore (xxx) is not found
報錯原因
日誌庫XXX不存在或未配置索引。
解決方案
請檢查對應的日誌庫是否存在。如果存在,請確保至少存在一個欄位索引且開啟統計功能。
condition number 43 is more than 30
報錯原因
您在查詢語句中使用的欄位數為43個,超過Log Service所限制的30個。
解決方案
請修改查詢語句,將欄位數量控制在30個以內。
ErrorType:SyntaxError.ErrorPosition,line:1,column:19.ErrorMessage:line 1:19: Expression "data" is not of type ROW
報錯原因
查詢和分析語句中所使用的欄位的資料類型錯誤。
解決方案
請檢查ROW函數的參數是否正確,並且參數中所有的欄位是否存在且符合要求。如果參數正確,但結果仍然不是ROW類型,可以嘗試使用CAST函數將其轉換為ROW類型。
ErrorType:SyntaxError.ErrorPosition,line:1,column:9.ErrorMessage:line 1:9: identifiers must not contain ':'
報錯原因
您所分析的欄位中包含了半形冒號(:)。
解決方案
使用半形雙引號("")包裹欄位。例如您要分析
__tag__:__receive_time__欄位,可使用語句*| select "__tag__:__receive_time__"。重要在分析欄位前,必須先建立欄位索引。具體操作,請參見手動建立欄位索引。
No nodes available to run query
報錯原因
系統內部錯誤。
解決方案
請重新整理頁面,重新執行查詢和分析語句。