SQL Detail mengaudit operasi DDL dan lock pada database serta tabel PolarDB for MySQL. Fitur ini menangkap konteks eksekusi setiap pernyataan dan secara otomatis menghapus catatan yang lebih lama dari periode retensi yang dikonfigurasi. Berbeda dengan fitur audit log lengkap—yang mengaudit setiap pernyataan SQL dengan overhead signifikan—SQL Detail hanya berfokus pada event perubahan skema dan lock, sehingga cocok untuk tim O&M (operations and maintenance) yang membutuhkan jejak audit ringan dan terarah.
Cara kerja
Saat pernyataan DDL atau lock mulai dieksekusi, SQL Detail menulis catatan ke tabel sistem sys.hist_sqldetail. Setelah pernyataan selesai, PolarDB memperbarui catatan tersebut dengan status akhir dan metrik performa. Catatan yang lebih lama dari periode retensi yang dikonfigurasi akan dihapus secara otomatis.
Apa yang ditangkap oleh SQL Detail:
Operasi DDL: perubahan skema seperti membuat tabel, menambah kolom, dan memodifikasi indeks
Operasi lock: pernyataan
LOCK TABLEdanLOCK DB
Apa yang tidak ditangkap oleh SQL Detail:
Pernyataan DML (INSERT, UPDATE, DELETE, SELECT) sengaja tidak disertakan. SQL Detail dirancang untuk auditing perubahan skema dengan overhead rendah, bukan untuk pencatatan kueri umum. Untuk mengaudit pernyataan DML, aktifkan fitur audit log lengkap.
Penyimpanan
Setiap catatan audit mengonsumsi ruang penyimpanan sebesar 1 KB. Sebagai contoh, 1.024 operasi DDL atau lock per hari dengan periode retensi 30 hari mengonsumsi sekitar 30 MB.
Prasyarat
Sebelum memulai, pastikan kluster Anda memenuhi salah satu persyaratan versi berikut:
PolarDB for MySQL 8.0.1, versi revisi 8.0.1.1.31 atau lebih baru
PolarDB for MySQL 8.0.2, versi revisi 8.0.2.2.12 atau lebih baru
Untuk memeriksa versi revisi kluster Anda, lihat Query the engine version.
Aktifkan SQL detail
Konfigurasikan parameter berikut di Konsol. Untuk petunjuknya, lihat Specify cluster and node parameters.
| Parameter | Level | Default | Nilai valid | Deskripsi |
|---|---|---|---|---|
loose_awr_sqldetail_enabled | Global | OFF | ON, OFF | Mengaktifkan atau menonaktifkan SQL detail |
loose_awr_sqldetail_switch | Global | ddl: ON; lock_db_table: ON | ddl: ON/OFF; lock_db_table: ON/OFF | Mengontrol jenis operasi yang diaudit. ddl mencakup pernyataan DDL; lock_db_table mencakup pernyataan LOCK TABLE dan LOCK DB |
loose_awr_sqldetail_retention | Global | 2592000 | 0–18446744073709551615 | Periode retensi untuk catatan audit, dalam detik. Catatan yang lebih lama dari nilai ini akan dihapus secara otomatis |
Tabel sys.hist_sqldetail
PolarDB for MySQL secara otomatis membuat tabel sistem sys.hist_sqldetail saat startup. Tidak diperlukan pembuatan manual.
CREATE TABLE `hist_sqldetail` (
`Id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`State` varchar(16) COLLATE utf8mb4_bin DEFAULT NULL,
`Thread_id` bigint(20) unsigned DEFAULT NULL,
`Host` varchar(60) COLLATE utf8mb4_bin NOT NULL DEFAULT '',
`User` varchar(32) COLLATE utf8mb4_bin NOT NULL DEFAULT '',
`Client_ip` varchar(60) COLLATE utf8mb4_bin DEFAULT NULL,
`Db` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL,
`Sql_text` mediumtext COLLATE utf8mb4_bin NOT NULL,
`Server_command` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL,
`Sql_command` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL,
`Start_time` timestamp(6) NULL DEFAULT NULL,
`Exec_time` bigint(20) DEFAULT NULL,
`Wait_time` bigint(20) DEFAULT NULL,
`Error_code` int(11) DEFAULT NULL,
`Rows_sent` bigint(20) DEFAULT NULL,
`Rows_examined` bigint(20) DEFAULT NULL,
`Rows_affected` bigint(20) DEFAULT NULL,
`Logical_read` bigint(20) DEFAULT NULL,
`Phy_sync_read` bigint(20) DEFAULT NULL,
`Phy_async_read` bigint(20) DEFAULT NULL,
`Process_info` text COLLATE utf8mb4_bin,
`Extra` text COLLATE utf8mb4_bin,
`Create_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`Update_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY (`Id`),
KEY `i_start_time` (`Start_time`),
KEY `i_update_time` (`Update_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;Referensi kolom
| Kolom | Deskripsi |
|---|---|
Id | ID catatan auto-increment |
State | Status operasi saat catatan ditulis |
Thread_id | ID thread yang mengeksekusi pernyataan |
Host | Host yang terkait dengan pengguna yang mengeksekusi |
User | Nama pengguna yang digunakan untuk mengeksekusi pernyataan |
Client_ip | Alamat IP klien |
Db | Database tempat pernyataan dieksekusi |
Sql_text | Teks lengkap pernyataan SQL |
Server_command | Jenis perintah server (misalnya, Query) |
Sql_command | Jenis pernyataan (misalnya, create_table, alter_table, lock_tables) |
Start_time | Timestamp saat eksekusi dimulai (presisi mikrodetik) |
Exec_time | Durasi eksekusi, dalam mikrodetik. Gunakan ini untuk mengidentifikasi operasi DDL yang tidak biasa lambat |
Wait_time | Waktu tunggu pernyataan sebelum eksekusi dimulai, dalam mikrodetik. Nilai tinggi mungkin mengindikasikan kontensi lock |
Error_code | Kode error. Nilai bukan nol berarti pernyataan gagal; gunakan ini untuk melacak perubahan skema yang gagal |
Rows_sent | Jumlah baris yang dikembalikan |
Rows_examined | Jumlah baris yang dipindai |
Rows_affected | Jumlah baris yang terpengaruh |
Logical_read | Jumlah bacaan logis |
Phy_sync_read | Jumlah physical synchronous read |
Phy_async_read | Jumlah physical asynchronous read |
Process_info | Informasi pemrosesan tambahan |
Extra | Informasi Tambahan |
Create_time | Timestamp saat catatan dibuat |
Update_time | Timestamp saat catatan terakhir diperbarui |
Contoh
Contoh ini menunjukkan bagaimana SQL Detail menangkap operasi DDL dan lock sambil mengabaikan DML.
Langkah 1: Atur loose_awr_sqldetail_enabled ke ON di Konsol, lalu jalankan pernyataan berikut:
create table t(c1 int);
-- Query OK, 0 rows affected (0.02 sec)
create table t(c1 int);
-- ERROR 1050 (42S01): Table 't' already exists
alter table t add column c2 int;
-- Query OK, 0 rows affected (0.02 sec)
-- Records: 0 Duplicates: 0 Warnings: 0
lock tables t read;
-- Query OK, 0 rows affected (0.00 sec)
unlock tables;
-- Query OK, 0 rows affected (0.00 sec)
insert into t values(1, 2);
-- Query OK, 1 row affected (0.00 sec)Langkah 2: Kueri catatan audit:
select * from sys.hist_sqldetail\GOutput yang diharapkan:
*************************** 1. row ***************************
Id: 1
State: FINISH
Thread_id: 18
Host: localhost
User: root
Client_ip: 127.0.0.1
Db: test
Sql_text: create table t(c1 int)
Server_command: Query
Sql_command: create_table
Start_time: 2023-01-13 16:18:21.840435
Exec_time: 17390
Wait_time: 318
Error_code: 0
Rows_sent: 0
Rows_examined: 0
Rows_affected: 0
Logical_read: 420
Phy_sync_read: 0
Phy_async_read: 0
Process_info: NULL
Extra: NULL
Create_time: 2023-01-13 16:18:22.391407
Update_time: 2023-01-13 16:18:22.391407
*************************** 2. row ***************************
Id: 2
State: FINISH
Thread_id: 18
Host: localhost
User: root
Client_ip: 127.0.0.1
Db: test
Sql_text: create table t(c1 int)
Server_command: Query
Sql_command: create_table
Start_time: 2023-01-13 16:18:22.416321
Exec_time: 822
Wait_time: 229
Error_code: 1050
Rows_sent: 0
Rows_examined: 0
Rows_affected: 0
Logical_read: 55
Phy_sync_read: 0
Phy_async_read: 0
Process_info: NULL
Extra: NULL
Create_time: 2023-01-13 16:18:23.393071
Update_time: 2023-01-13 16:18:23.393071
*************************** 3. row ***************************
Id: 3
State: FINISH
Thread_id: 18
Host: localhost
User: root
Client_ip: 127.0.0.1
Db: test
Sql_text: alter table t add column c2 int
Server_command: Query
Sql_command: alter_table
Start_time: 2023-01-13 16:18:34.123947
Exec_time: 16420
Wait_time: 245
Error_code: 0
Rows_sent: 0
Rows_examined: 0
Rows_affected: 0
Logical_read: 778
Phy_sync_read: 0
Phy_async_read: 0
Process_info: NULL
Extra: NULL
Create_time: 2023-01-13 16:18:34.394067
Update_time: 2023-01-13 16:18:34.394067
*************************** 4. row ***************************
Id: 4
State: FINISH
Thread_id: 18
Host: localhost
User: root
Client_ip: 127.0.0.1
Db: test
Sql_text: lock tables t read
Server_command: Query
Sql_command: lock_tables
Start_time: 2023-01-13 16:19:49.891559
Exec_time: 145
Wait_time: 129
Error_code: 0
Rows_sent: 0
Rows_examined: 0
Rows_affected: 0
Logical_read: 0
Phy_sync_read: 0
Phy_async_read: 0
Process_info: NULL
Extra: NULL
Create_time: 2023-01-13 16:19:50.399585
Update_time: 2023-01-13 16:19:50.399585
*************************** 5. row ***************************
Id: 5
State: FINISH
Thread_id: 18
Host: localhost
User: root
Client_ip: 127.0.0.1
Db: test
Sql_text: unlock tables
Server_command: Query
Sql_command: unlock_tables
Start_time: 2023-01-13 16:19:56.924648
Exec_time: 98
Wait_time: 0
Error_code: 0
Rows_sent: 0
Rows_examined: 0
Rows_affected: 0
Logical_read: 0
Phy_sync_read: 0
Phy_async_read: 0
Process_info: NULL
Extra: NULL
Create_time: 2023-01-13 16:19:57.400294
Update_time: 2023-01-13 16:19:57.400294Output berisi lima catatan—satu untuk setiap pernyataan DDL dan lock. Pernyataan insert into t values(1, 2) tidak dicatat karena SQL Detail tidak menangkap operasi DML.
Baris 2 menunjukkan Error_code: 1050 untuk upaya CREATE TABLE yang duplikat. SQL Detail mencatat baik pernyataan yang berhasil maupun yang gagal, memberikan personel O&M riwayat lengkap upaya perubahan skema, termasuk yang gagal.