Simple Log Service (SLS) は PostgreSQL プロトコルと互換性があり、標準の JDBC ドライバーを介した接続をサポートしています。psql クライアント、JDBC ドライバー、または PostgreSQL プロトコルをサポートする任意のツールを使用して SLS に接続し、データの読み取り、書き込み、管理を行うための SQL ステートメントを実行できます。
機能
PostgreSQL プロトコルを使用して SLS に接続すると、以下の操作が可能です。
標準の SQL 構文(CREATE、MODIFY、DROP)を使用してログストアを管理します。
PostgreSQL の SQL 構文を使用してログデータを分析します。
INSERT ステートメントを使用してログデータを書き込みます。
ネイティブな PostgreSQL 構文でログストアのスキーマメタデータをシームレスにクエリし、PostgreSQL のシステムテーブルとの完全な互換性を確保します。
制限事項
PostgreSQL プロトコルを使用して SLS に接続する場合、以下の制限が適用されます。
制約事項 | 説明 |
プリペアドステートメント | PostgreSQL プロトコルにおけるプリペアドステートメントの実行(PARSE/BIND/EXECUTE)はサポートされていません。JDBC を使用する場合は、明示的に PG クエリモードを simple に設定してください。たとえば、次の接続プロパティーを設定します。 または、JDBC URL 内で preferQueryMode パラメーターを設定します。 |
トランザクションのサポート | BEGIN、COMMIT、ROLLBACK ステートメントは無視され、効果がありません。 |
プライマリキーおよびデフォルト値 | プライマリキーおよびデフォルト値などの制約はサポートされていません。 |
前提条件
プロジェクト を作成済みである。
AccessKey ID および AccessKey Secret を取得済みである。詳細については、「AccessKey の作成」をご参照ください。
PostgreSQL クライアントツール(例:psql)または PostgreSQL プロトコルをサポートするその他のツールをインストール済みである。
SLS への接続
PostgreSQL クライアントを使用して SLS に接続するには、次の URL 形式を使用します。
postgresql://{AccessKey_ID}:{AccessKey_Secret}@{Endpoint}:5432/{Project_Name}
# 接続では TLS がデフォルトで有効化されています(認証方式は MD5)。TLS を明示的に無効化する場合(たとえばクライアントが TLS をサポートしていない場合)、sslmode パラメーターを disable に設定します。
postgresql://{AccessKey_ID}:{AccessKey_Secret}@{Endpoint}:5432/{Project_Name}?sslmode=disableJDBC を介して PostgreSQL プロトコルで 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 | Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ID。 | LTAI5t*** |
AccessKey_Secret | Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey Secret。 | *** |
Endpoint | SLS のエンドポイント。詳細については、「エンドポイント」をご参照ください。エンドポイントにはプロジェクト名が含まれている必要があります(例列に示すとおり)。 | {projectName}.cn-hangzhou.log.aliyuncs.com |
Project_Name | ログプロジェクトの名称。 | my-project |
テーブルの管理
SLS の PostgreSQL プロトコルでは、テーブルは SLS のログストアに対応します。
テーブルの作成
CREATE TABLE ステートメントを使用してログストアを作成します。
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 型 |
テーブルプロパティ(WITH 句):
プロパティ名 | 型 | 説明 | デフォルト値 | 例 |
shard_count | Integer | ログストア内のシャード数。 | 4 | 4 |
ttl | Integer | データ保持期間(日単位)。 | 365 | 14 |
default_query_range | String | デフォルトのクエリ時間範囲。フォーマット:{n}{d/m/s}(日/分/秒)。 | '1d' | '3d' |
full_text_search_enabled | Boolean | フルテキストインデックスを有効化するかどうかを指定します。 | false | true |
index_tokens | String | 形態素解析に使用するトークン。 | デフォルトのデリミタ | '&[]",''' |
log_time_field | String | データ挿入時に SLS ログストアのログ時刻として使用するフィールドを指定します。フィールド型は timestamp または long(エポック秒、ミリ秒、マイクロ秒、ナノ秒)である必要があります。システムが自動的に単位を検出します。この設定により、データ書き込み時のログ時刻フィールドが識別されます。 | - | 'create_time' |
insert_any_allowed | Boolean | スキーマ検証なしで任意のデータを書き込むことを許可するかどうかを指定します。書き込まれるデータのスキーマを検証するには、この値を false に設定します。 | true | false |
hot_ttl | Integer | ログストアのデータがホットストレージに保持される日数。この期間が経過すると、データは自動的に低頻度アクセス(IA)ストレージクラスへトランジションします。詳細については、「インテリジェントティアリングの管理」をご参照ください。このパラメーターが設定されていない場合、データはライフサイクル全体にわたりホットストレージに保持されます。 | - | 7 |
chn_columns | String | 中国語テキストを含むカラムを定義します。これらのカラムのインデックスにより、中国語の形態素解析が可能になります。複数のカラム名はカンマで区切ります。全文検索を示すには __line__ を使用します。注:中国語の形態素解析を有効化すると、パフォーマンスに影響を与える可能性があります。慎重に使用してください。 | - | '__line__,message,error' |
カラムの変更
以下のカラム変更操作がサポートされています。
カラムの追加:
ALTER TABLE users ADD COLUMN change_time TEXT;カラム名の変更:
ALTER TABLE users RENAME COLUMN change_time TO update_time;カラム型の変更:
ALTER TABLE users ALTER COLUMN update_time TYPE TIMESTAMP;カラムの削除:
ALTER TABLE users DROP COLUMN update_time;データのクリア
TRUNCATE ステートメントを使用してテーブル内のすべてのデータをクリアします。
TRUNCATE TABLE users;注:データが削除された後、SQL クエリで変更が反映されるまで約 30 秒かかります。
テーブルの削除
DROP TABLE ステートメントを使用してテーブルを削除します(対応するログストアも削除されます)。
DROP TABLE users;データのクエリ
基本的なクエリ
標準の SQL SELECT ステートメントを使用してデータをクエリします。
SELECT id, name FROM users LIMIT 10;注:SQL ステートメント内で時間範囲が指定されていない場合、default_query_rangeで定義されたデフォルトの時間範囲が使用されます。テーブル作成時にdefault_query_rangeが設定されていない場合、クエリは直近 15 分間のデータをデフォルトで対象とします。
クエリ時間範囲の指定
以下のいずれかの方法でクエリ時間範囲を指定します。
方法 1:__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 タイムスタンプです。時間範囲の下限を設定しなければ、範囲は有効になりません。上限が設定されていない場合、終了時刻は現在時刻になります。方法 2: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 または show 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 プロトコルは、プライマリキーなどの一意性制約をサポートしていませんが、データが 1 度だけ書き込まれることを保証する 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 | シリアル番号。同じ hash_key に対しては、1 から始まり、単調増加する必要があります。 |
重複データのエラー処理:
重複データが書き込まれた場合、サーバーは以下の形式でエラーメッセージを返します。
error: sequence id is lower than expected, hash_key=xyz,current sequence_id=100,requested sequence_id=90サーバーの応答から現在の seq_id を抽出するには、以下の正規表現を使用します。
current\s+sequence_id=(\d+)メタデータのクエリ
すべてのログストアのクエリ
SELECT
table_schema,
table_name
FROM
information_schema.tables;注:デフォルトでは、ログストアは同名のプロジェクト内のスキーマにマップされます。
フィールド構造のクエリ
SELECT
column_name,
data_type
FROM
information_schema.columns
WHERE
table_name = 'access_log';