全部產品
Search
文件中心

Simple Log Service:使用PostgreSQL協議接入SLS

更新時間:Mar 17, 2026

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,比如設定下面的連結屬性:

props.setProperty(PGProperty.PREFER_QUERY_MODE.getName(), "simple");

或者在JDBC url中設定preferQueryMode參數:

jdbc:postgresql://{endpoint}:5432/{project}?preferQueryMode=simple

事務支援

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_keyseq_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';

相關文檔