Simple Log Service (SLS) kompatibel dengan protokol PostgreSQL dan mendukung koneksi melalui driver JDBC standar. Anda dapat menggunakan client psql, driver JDBC, atau alat lain yang mendukung protokol PostgreSQL untuk terhubung ke SLS serta mengeksekusi pernyataan SQL guna membaca, menulis, dan mengelola data.
Fitur
Saat terhubung ke SLS menggunakan protokol PostgreSQL, Anda dapat:
Mengelola logstore menggunakan sintaks SQL standar (buat, ubah, hapus).
Menganalisis data log menggunakan sintaks SQL PostgreSQL.
Menulis data log menggunakan pernyataan INSERT.
Menanyakan metadata skema logstore secara mulus menggunakan sintaks PostgreSQL native, memastikan kompatibilitas penuh dengan tabel sistem PostgreSQL.
Batasan
Batasan berikut berlaku saat Anda terhubung ke SLS menggunakan protokol PostgreSQL:
Batasan | Deskripsi |
Prepared Statement | Eksekusi prepared statement (parse/bind/execute dalam protokol PG) tidak didukung. Jika Anda menggunakan JDBC, atur eksplisit mode kueri PG ke simple. Misalnya, atur properti koneksi berikut: Atau atur parameter preferQueryMode dalam URL JDBC: |
Dukungan transaksi | Pernyataan begin, commit, dan rollback diabaikan dan tidak berpengaruh. |
Primary key dan nilai default | Kendala seperti primary key dan nilai default tidak didukung. |
Prasyarat
Anda telah membuat project.
Anda telah memperoleh ID AccessKey dan Rahasia AccessKey. Untuk informasi selengkapnya, lihat Buat AccessKey.
Anda telah menginstal alat client PostgreSQL (seperti psql) atau alat lain yang mendukung protokol PostgreSQL.
Koneksi ke SLS
Untuk terhubung ke SLS menggunakan client PostgreSQL, gunakan format URL berikut:
postgresql://{AccessKey_ID}:{AccessKey_Secret}@{Endpoint}:5432/{Project_Name}
# Koneksi mengaktifkan TLS secara default (MD5 untuk autentikasi). Untuk menonaktifkan TLS secara eksplisit (misalnya, jika client tidak mendukungnya), atur parameter sslmode ke disable.
postgresql://{AccessKey_ID}:{AccessKey_Secret}@{Endpoint}:5432/{Project_Name}?sslmode=disableUntuk terhubung ke SLS menggunakan protokol PostgreSQL melalui JDBC, gunakan konfigurasi berikut:
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("Koneksi berhasil!");
}
}Deskripsi parameter:
Parameter | Deskripsi | Contoh |
AccessKey_ID | ID AccessKey akun Alibaba Cloud atau Pengguna RAM Anda. | LTAI5t*** |
AccessKey_Secret | Rahasia AccessKey akun Alibaba Cloud atau Pengguna RAM Anda. | *** |
Endpoint | Titik akhir SLS. Untuk informasi selengkapnya, lihat Endpoints. Perhatikan bahwa endpoint harus mencakup nama project (seperti ditunjukkan pada kolom Contoh). | {projectName}.cn-hangzhou.log.aliyuncs.com |
Project_Name | Nama project log. | my-project |
Kelola tabel
Dalam protokol PostgreSQL SLS, sebuah tabel merepresentasikan logstore SLS.
Buat tabel
Gunakan pernyataan CREATE TABLE untuk membuat 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
);Tipe kolom yang didukung:
Tipe PostgreSQL | Tipe SLS | Deskripsi |
int8/bigint/int4/integer/int2/smallint/oid | long | Tipe bilangan bulat |
text/varchar/char/bpchar/uuid | text | Tipe string |
float4/real/float8/double precision/numeric | double | Tipe bilangan pecahan |
json | json | Tipe JSON |
Properti tabel (klause WITH):
Nama properti | Type | Deskripsi | Nilai default | Contoh |
shard_count | Integer | Jumlah shard dalam logstore. | 4 | 4 |
ttl | Integer | Periode retensi data dalam hari. | 365 | 14 |
default_query_range | String | Rentang waktu kueri default. Format: {n}{d/m/s} (hari/menit/detik). | '1d' | '3d' |
full_text_search_enabled | Boolean | Menentukan apakah indeks teks penuh diaktifkan. | false | true |
index_tokens | String | Token yang digunakan untuk tokenisasi. | Pembatas default | '&[]",''' |
log_time_field | String | Menentukan bidang yang digunakan sebagai waktu log untuk logstore SLS selama penyisipan data. Tipe bidang harus berupa timestamp atau long (detik epoch, milidetik, mikrodetik, atau nanodetik). Sistem secara otomatis mendeteksi unitnya. Pengaturan ini mengidentifikasi bidang waktu log selama penulisan data. | - | 'create_time' |
insert_any_allowed | Boolean | Menentukan apakah penulisan data apa pun tanpa validasi skema diizinkan. Atur nilai ini ke false untuk memvalidasi skema data yang ditulis. | true | false |
hot_ttl | Integer | Jumlah hari data logstore disimpan dalam penyimpanan hot. Setelah periode ini, data secara otomatis beralih ke Kelas penyimpanan IA. Untuk informasi selengkapnya, lihat Kelola tiering cerdas. Jika parameter ini tidak diatur, data tetap berada di penyimpanan hot sepanjang siklus hidupnya. | - | 7 |
chn_columns | String | Menentukan kolom yang berisi teks berbahasa Tiongkok. Indeks untuk kolom-kolom ini mengaktifkan tokenisasi Tiongkok. Pisahkan beberapa nama kolom dengan koma. Gunakan __line__ untuk menunjukkan indeks teks penuh. Catatan: Mengaktifkan tokenisasi Tiongkok memengaruhi performa. Gunakan dengan hati-hati. | - | '__line__,message,error' |
Ubah kolom
Operasi modifikasi kolom berikut didukung:
Tambah kolom:
ALTER TABLE users ADD COLUMN change_time TEXT;Ubah nama kolom:
ALTER TABLE users RENAME COLUMN change_time TO update_time;Ubah tipe kolom:
ALTER TABLE users ALTER COLUMN update_time TYPE TIMESTAMP;Hapus kolom:
ALTER TABLE users DROP COLUMN update_time;Bersihkan data
Gunakan pernyataan TRUNCATE untuk menghapus semua data dari tabel:
TRUNCATE TABLE users;Catatan: Setelah data dihapus, perubahan tersebut memerlukan waktu sekitar 30 detik hingga terlihat dalam kueri SQL.
Hapus tabel
Gunakan pernyataan DROP TABLE untuk menghapus tabel (yang juga menghapus logstore terkait):
DROP TABLE users;Kueri data
Kueri dasar
Gunakan pernyataan SELECT SQL standar untuk menanyakan data:
SELECT id, name FROM users LIMIT 10;Catatan: Jika rentang waktu tidak ditentukan dalam pernyataan SQL, rentang waktu default yang ditentukan olehdefault_query_rangeakan digunakan. Jikadefault_query_rangetidak diatur saat tabel dibuat, kueri akan menggunakan data 15 menit terakhir secara default.
Tentukan rentang waktu kueri
Tentukan rentang waktu kueri dengan salah satu dari dua cara berikut:
Metode 1: Gunakan bidang __time__
-- Tentukan batas bawah rentang waktu
SELECT id, name FROM users
WHERE __time__ > 1766646000
LIMIT 10;
-- Tentukan rentang waktu
SELECT id, name FROM users
WHERE __time__ > 1766646000 AND __time__ < 1766646987
LIMIT 10;Catatan: Nilai __time__ adalah timestamp Unix dalam satuan detik. Anda harus menetapkan batas bawah agar rentang waktu berlaku. Jika batas atas tidak ditentukan, waktu akhir secara default menggunakan waktu saat ini.Metode 2: Gunakan variabel query_begin dan query_end
-- Atur batas bawah rentang waktu
SET query_begin = 1766646000;
SELECT id, name FROM users LIMIT 10;
-- Atur rentang waktu
SET query_begin = 1766646000;
SET query_end = 1766646987;
SELECT id, name FROM users LIMIT 10;
-- Atur variabel dalam satu pernyataan (disarankan)
SET query_begin = 1766646000; SET query_end = 1766646987; SELECT id, name FROM users LIMIT 10;Catatan: Setelah diatur, variabel query_begin dan query_end tetap berlaku sepanjang sesi koneksi. Jalankan show query_begin atau show query_end untuk melihat nilai saat ini. Nilai 0 berarti variabel belum diatur.
Tulis data
Penulisan dasar
Gunakan pernyataan INSERT INTO untuk menulis data:
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');Penulisan EXACTLY-ONCE
Protokol PostgreSQL SLS tidak mendukung kendala keunikan seperti primary key, tetapi mendukung penulisan EXACTLY-ONCE untuk memastikan data hanya ditulis sekali.
Gunakan variabel hash_key dan seq_id untuk menerapkan penulisan 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');Deskripsi parameter:
Parameter | Deskripsi |
hash_key | Kunci unik yang mengidentifikasi sumber data. |
seq_id | Nomor seri. Harus dimulai dari 1 dan meningkat secara monoton untuk hash_key yang sama. |
Penanganan error data duplikat:
Saat data duplikat ditulis, server mengembalikan pesan error dalam format berikut:
error: sequence id is lower than expected, hash_key=xyz,current sequence_id=100,requested sequence_id=90Gunakan ekspresi reguler berikut untuk mengekstrak seq_id saat ini dari respons server:
current\s+sequence_id=(\d+)Kueri metadata
Kueri semua logstore
SELECT
table_schema,
table_name
FROM
information_schema.tables;Catatan: Secara default, logstore dipetakan ke skema di bawah project dengan nama yang sama.
Kueri struktur bidang
SELECT
column_name,
data_type
FROM
information_schema.columns
WHERE
table_name = 'access_log';