Log Service(SLS)相容 PostgreSQL 協議,並支援通過標準 JDBC 驅動進行串連。您可以使用 psql 用戶端、JDBC 驅動或任何相容 PG 協議的工具接入 SLS,執行 SQL 語句以實現資料的讀寫與管理。
功能介紹
通過PostgreSQL協議接入SLS,您可以:
使用標準SQL文法管理LogStore(建立、修改、刪除)。
使用PostgreSQL的SQL文法分析日誌資料。
使用INSERT語句寫入日誌資料。
全面相容 PostgreSQL 系統資料表,支援以原生 PG 文法無縫查詢 LogStore 的 Schema 中繼資料。
使用限制
在使用PostgreSQL協議接入SLS時,存在以下限制:
限制項 | 說明 |
Prepared Statement | 不支援prepared statement執行(即pg協議的parse/bind/execute)。如果是採用JDBC的方式,則需要顯式設定PG的查詢模式為simple,比如設定下面的連結屬性: 或者在JDBC url中設定preferQueryMode參數: |
事務支援 | begin/commit/rollback語句會被忽略(無任何效果) |
主鍵和預設值 | 不支援主鍵、預設值等約束 |
前提條件
已建立Project。
已擷取AccessKey ID和AccessKey Secret。具體操作,請參見建立AccessKey。
已安裝PostgreSQL用戶端工具(如psql)或其他支援PostgreSQL協議的工具。
串連SLS
pg用戶端,使用以下URL格式串連SLS:
postgresql://{AccessKey_ID}:{AccessKey_Secret}@{Endpoint}:5432/{Project_Name}
# 串連預設會開啟TLS串連(認證採用MD5),若要顯式關閉TLS(比如用戶端不支援),可以指定sslmode參數為disable
postgresql://{AccessKey_ID}:{AccessKey_Secret}@{Endpoint}:5432/{Project_Name}?sslmode=disable通過JDBC的方式採用postgres協議串連SLS時,則可以採用如下配置:
private static final String URL = "jdbc:postgresql://{Endpoint}:5432/{Project_Name}?preferQueryMode=simple";
private static final String AccessKey_ID = "xyz";
private static final String AccessKey_Secret = "123456";
public static void main(String[] args) throws Exception
{
Properties props = new Properties();
props.setProperty(PGProperty.USER.getName(), AccessKey_ID);
props.setProperty(PGProperty.PASSWORD.getName(), AccessKey_Secret);
try (Connection conn = DriverManager.getConnection(URL, props)) {
System.out.println("串連成功!");
}
}參數說明:
參數 | 說明 | 樣本 |
AccessKey_ID | 阿里雲帳號或RAM使用者的AccessKey ID | LTAI5t*** |
AccessKey_Secret | 阿里雲帳號或RAM使用者的AccessKey Secret | *** |
Endpoint | SLS服務入口地址,更多資訊,請參見服務入口。注意,Endpoint中必須加上project名稱(即樣本說明)。 | {projectName}.cn-hangzhou.log.aliyuncs.com |
Project_Name | 記錄項目名稱 | my-project |
管理Table
在SLS的PostgreSQL協議中,Table對應SLS的LogStore。
建立Table
使用CREATE TABLE語句建立LogStore:
CREATE TABLE users (
id BIGINT,
name TEXT,
create_time TIMESTAMP
)
WITH (
shard_count = 4,
ttl = 14,
default_query_range = '1d',
full_text_search_enabled = true,
index_tokens = '&[ ]",''\',
log_time_field = 'create_time',
insert_any_allowed = false
);支援的列類型:
PostgreSQL類型 | SLS類型 | 說明 |
int8/bigint/int4/integer/int2/smallint/oid | long | 整數類型 |
text/varchar/char/bpchar/uuid | text | 字串類型 |
float4/real/float8/double precision/numeric | double | 浮點數類型 |
json | json | JSON類型 |
Table屬性(WITH子句):
屬性名稱 | 類型 | 說明 | 預設值 | 樣本 |
shard_count | 整數 | LogStore的Shard數量 | 4 | 4 |
ttl | 整數 | 資料儲存時間(天) | 365 | 14 |
default_query_range | 字串 | 預設查詢時間範圍,格式:{n}{d/m/s}(天/分鐘/秒) | '1d' | '3d' |
full_text_search_enabled | 布爾 | 是否開啟全文檢索索引 | false | true |
index_tokens | 字串 | 分詞使用的tokens | 預設分詞符 | '&[]",''' |
log_time_field | 字串 | 指定作為sls LogStore日誌時間的欄位 (資料插入時使用),類型必須為timestamp或者long (可以為epoch 秒/毫秒/微妙/納秒,系統會自動識別)。該配置,用於資料寫入時, 自動識別作為LogStore的日誌時間欄位 | - | 'create_time' |
insert_any_allowed | 布爾 | 是否允許寫入任意資料(不進行schema校正),如果對寫入的資料進行schema校正,可以將這個值設定為false | true | false |
hot_ttl | 整數 | LogStore的資料儲存為熱儲存的天數,超過這些天數後,資料會自動轉為低頻儲存(參考管理智能儲存分層)。如果不設定這個,資料生命週期內總是儲存為熱儲存。 | - | 7 |
chn_columns | 字串 | 定義包含中文的列(這些列的索引會開啟中文分詞),多個列名採用英文逗號隔開,其中__line__表示全文索引。注意,開啟中文分詞後,會影響分詞效能,請謹慎使用。 | - | '__line__,message,error' |
修改Column
支援以下Column修改操作:
新增Column:
ALTER TABLE users ADD COLUMN change_time TEXT;重新命名Column:
ALTER TABLE users RENAME COLUMN change_time TO update_time;修改Column類型:
ALTER TABLE users ALTER COLUMN update_time TYPE TIMESTAMP;刪除Column:
ALTER TABLE users DROP COLUMN update_time;清除資料
使用TRUNCATE語句清除Table中的所有資料:
TRUNCATE TABLE users;說明:資料刪除後,SQL可見度需要約30秒才會生效。
刪除Table
使用DROP TABLE語句刪除Table(對應刪除LogStore):
DROP TABLE users;查詢資料
基本查詢
使用標準SQL SELECT語句查詢資料:
SELECT id, name FROM users LIMIT 10;說明:如果SQL中沒有指定查詢時間範圍,將使用default_query_range指定的預設時間範圍。如果建立Table時未設定default_query_range,預設查詢最近15分鐘的資料。
指定查詢時間範圍
您可以通過以下兩種方式指定查詢時間範圍:
方式一:使用__time__欄位
-- 指定查詢時間下限
SELECT id, name FROM users
WHERE __time__ > 1766646000
LIMIT 10;
-- 指定查詢時間範圍
SELECT id, name FROM users
WHERE __time__ > 1766646000 AND __time__ < 1766646987
LIMIT 10;說明:__time__的值為Unix時間戳記(秒)。必須設定查詢時間下限才會生效;如果不設定上限,則結束時間預設為目前時間。方式二:使用query_begin和query_end變數
-- 設定查詢時間下限
SET query_begin = 1766646000;
SELECT id, name FROM users LIMIT 10;
-- 設定查詢時間範圍
SET query_begin = 1766646000;
SET query_end = 1766646987;
SELECT id, name FROM users LIMIT 10;
-- 在單條語句中設定(推薦)
SET query_begin = 1766646000; SET query_end = 1766646987; SELECT id, name FROM users LIMIT 10;說明:變數query_begin和query_end一旦設定,則整個串連周期內都是有效。另外,可以通過show query_begin/query_end來查看當前變數設定的值(如果為0,則表示沒有設定過)。
寫入資料
基本寫入
使用INSERT INTO語句寫入資料:
INSERT INTO users (id, name, create_time)
VALUES
(1, 'Name#1', '2025-12-25T06:54:19'),
(2, 'Name#2', '2025-12-25T06:54:20'),
(3, 'Name#3', '2025-12-25T06:54:21');EXACTLY ONCE寫入
SLS PostgreSQL協議不支援唯一性限制式(如主鍵),但支援EXACTLY ONCE的寫入方式,確保資料唯寫入一次。
使用hash_key和seq_id變數實現EXACTLY ONCE寫入:
SET hash_key = 'file#1';
SET seq_id = 1;
INSERT INTO users (id, name, create_time)
VALUES
(1, 'Name#1', '2025-12-25T06:54:19'),
(2, 'Name#2', '2025-12-25T06:54:20'),
(3, 'Name#3', '2025-12-25T06:54:21');參數說明:
參數 | 說明 |
hash_key | 用於標識資料來源的唯一鍵 |
seq_id | 序號,必須從1開始,且對於相同hash_key必須單調遞增 |
重複資料錯誤處理:
當寫入重複資料時,服務端會返回如下格式的錯誤資訊:
error: sequence id is lower than expected, hash_key=xyz,current sequence_id=100,requested sequence_id=90您可以使用以下Regex提取服務端當前的seq_id:
current\s+sequence_id=(\d+)查詢中繼資料
查詢所有LogStore
SELECT
table_schema,
table_name
FROM
information_schema.tables;說明:LogStore預設映射在同名Project的schema下。
查詢欄位結構
SELECT
column_name,
data_type
FROM
information_schema.columns
WHERE
table_name = 'access_log';