PolarDB-X mendukung fitur audit dan analisis SQL. Entri log dari database PolarDB-X dikumpulkan dan dikirim ke Log Service untuk diproses dan dianalisis. Topik ini menjelaskan kondisi yang digunakan untuk menanyakan hasil analisis log serta memberikan contoh penggunaannya.
Prasyarat
Fitur audit dan analisis SQL harus diaktifkan untuk instance PolarDB-X Anda. Untuk informasi lebih lanjut, lihat Aktifkan Audit dan Analisis SQL.
Peringatan
Log audit dari database PolarDB-X dalam wilayah yang sama disimpan dalam Logstore yang sama di Log Service. Secara default, bidang
__topic__digunakan sebagai kondisi pada kotak pencarian halaman audit dan analisis SQL. Saat Anda menanyakan entri log atau hasil analisis berdasarkan kondisi ini, semua entri log yang dikembalikan berasal dari database PolarDB-X dalam wilayah yang sama. Anda dapat menentukan kondisi tambahan setelah bidang__topic__untuk melakukan kueri yang lebih rinci.Di tab Raw Logs, Anda dapat mengklik nilai suatu bidang untuk menentukannya sebagai kondisi.
Sebagai contoh, Anda dapat mengklik nilai
Deletedari bidangsql_typeuntuk menentukan kondisi guna menanyakan semua pernyataanDELETE.
Kueri Pernyataan SQL Tertentu
Anda dapat menentukan jenis kondisi berikut untuk menanyakan pernyataan SQL tertentu.
Gunakan kata kunci sebagai kondisi
Sebagai contoh, Anda dapat menentukan kondisi berikut untuk menanyakan pernyataan SQL yang mengandung kata kunci
200003.dan sql: 200003Gunakan bidang bawaan sebagai kondisi
Anda dapat menentukan bidang indeks bawaan untuk menanyakan pernyataan SQL yang mengandung bidang tertentu. Sebagai contoh, Anda dapat menentukan kondisi berikut untuk menanyakan semua pernyataan DROP.
dan sql_type:DropGunakan beberapa kondisi
Anda dapat menentukan beberapa kondisi dengan hubungan
ANDatauOR. Sebagai contoh, Anda dapat menentukan kondisi berikut untuk menanyakan pernyataan DELETE yang dieksekusi pada baris200003.dan sql: 200003 dan sql_type: DeleteGunakan ekspresi perbandingan numerik sebagai kondisi
Dalam contoh ini, nilai bidang
affect_rowsdanresponse_timeadalah numerik dan mendukung operator perbandingan. Sebagai contoh, Anda dapat menambahkan kondisi berikut untuk menanyakan pernyataan DROP di mana nilai parameterresponse_timelebih besar dari 5 detik.dan response_time > 5 dan sql_type: DropAnda juga dapat menentukan kondisi berikut untuk menanyakan pernyataan SQL yang dieksekusi untuk menghapus lebih dari 100 baris data.
dan affect_rows > 100 dan sql_type: Delete
Analisis Eksekusi SQL
Anda dapat mengeksekusi pernyataan berikut untuk menanyakan status eksekusi pernyataan SQL.
Tanyakan rasio kegagalan kueri SQL
Anda dapat mengeksekusi pernyataan berikut untuk menanyakan rasio kegagalan kueri SQL.
| SELECT sum(case when fail = 1 then 1 else 0 end) * 1.0 / count(1) as fail_ratioCatatanAnda dapat mengklik Save as Alert di sudut kanan atas halaman untuk membuat aturan peringatan sesuai kebutuhan bisnis Anda.
Tanyakan jumlah total baris tempat pernyataan SQL tertentu dieksekusi
Anda dapat mengeksekusi pernyataan berikut untuk menanyakan jumlah total baris tempat pernyataan SELECT dieksekusi.
dan sql_type: Select | SELECT sum(affect_rows)Tanyakan distribusi berbagai jenis kueri SQL
Anda dapat mengeksekusi pernyataan berikut untuk menanyakan distribusi berbagai jenis kueri SQL.
| SELECT sql_type, count(sql) as times GROUP BY sql_typeTanyakan distribusi alamat IP yang digunakan oleh pengguna
Anda dapat mengeksekusi pernyataan berikut untuk menanyakan distribusi alamat IP yang digunakan oleh pengguna untuk mengirim permintaan.
| SELECT user, client_ip, count(sql) as times GROUP BY user, client_ip
Analisis Kinerja
Anda dapat mengeksekusi pernyataan berikut untuk menanyakan hasil analisis kinerja SQL.
Tanyakan durasi eksekusi rata-rata pernyataan SELECT
Anda dapat mengeksekusi pernyataan berikut untuk menanyakan periode rata-rata waktu yang sistem perlukan untuk mengeksekusi pernyataan SELECT.
dan sql_type: Select | SELECT avg(response_time)Tanyakan distribusi pernyataan SQL berdasarkan durasi eksekusi
Anda dapat menentukan kondisi berikut untuk menanyakan distribusi pernyataan SQL berdasarkan durasi eksekusi.
dan response_time > 0 | select case when response_time <= 10 then '<=10ms' when response_time > 10 and response_time <= 100 then '10~100ms' when response_time > 100 and response_time <= 1000 then '100ms~1s' when response_time > 1000 and response_time <= 10000 then '1s~10s' when response_time > 10000 and response_time <= 60000 then '10s~1min' else '>1min' end as latency_type, count(1) as cnt group by latency_type order by latency_type DESCCatatanDalam kondisi sebelumnya, empat rentang waktu ditentukan menggunakan bidang
response_time: kurang dari atau sama dengan 10 milidetik, 10 hingga 100 milidetik (inklusif), 100 milidetik hingga 1 detik (inklusif), dan 1 hingga 10 detik (inklusif). Anda dapat menyesuaikan nilai bidangresponse_timeuntuk hasil yang lebih rinci.Tanyakan 50 pernyataan SQL lambat teratas
Anda dapat mengeksekusi pernyataan berikut untuk menanyakan 50 pernyataan SQL lambat teratas.
| SELECT date_format(from_unixtime(__time__), '%m/%d %H:%i:%s') as time, user, client_ip, client_port, sql_type, affect_rows, response_time, sql ORDER BY response_time desc LIMIT 50Tanyakan 10 template SQL teratas yang mengonsumsi sumber daya paling banyak
Dalam aplikasi, pernyataan SQL sering dibuat secara dinamis berdasarkan template. Nilai parameter bervariasi di setiap pernyataan SQL. Anda dapat mengeksekusi pernyataan berikut untuk menanyakan 10 template SQL teratas yang mengonsumsi sumber daya paling banyak:
| SELECT sql_code as "Template ID", round(total_time * 1.0 /sum(total_time) over() * 100, 2) as "Rasio Durasi Eksekusi (%)",execute_times as "Jumlah Kueri", round(avg_time) as "Durasi Eksekusi Rata-rata",round(avg_rows) as "Jumlah Rata-rata Baris yang Dioperasikan", CASE WHEN length(sql) > 200 THEN concat(substr(sql, 1, 200), '......') ELSE trim(lpad(sql, 200, ' ')) end as "Contoh SQL" FROM (SELECT sql_code, count(1) as execute_times, sum(response_time) as total_time, avg(response_time) as avg_time, avg(affect_rows) as avg_rows, arbitrary(sql) as sql FROM log GROUP BY sql_code) ORDER BY "Rasio Durasi Eksekusi (%)" desc limit 10Informasi hasil mencakup detail seperti ID setiap template SQL, rasio durasi eksekusi pernyataan SQL yang dihasilkan berdasarkan setiap template terhadap durasi eksekusi semua pernyataan SQL, jumlah pernyataan SQL yang dihasilkan, durasi eksekusi rata-rata, jumlah rata-rata baris tempat pernyataan SQL dieksekusi, dan contoh pernyataan SQL dari setiap template.
CatatanDalam contoh ini, template SQL diurutkan berdasarkan rasio durasi eksekusi. Anda dapat mengurutkan template SQL berdasarkan durasi eksekusi rata-rata atau jumlah pernyataan SQL sesuai kebutuhan bisnis Anda.
Tanyakan durasi eksekusi rata-rata transaksi
Dalam entri log tentang pernyataan SQL yang dieksekusi dalam transaksi yang sama, nilai parameter
trace_idmemiliki awalan yang sama. Akhirannya dalam format'-' + Nomor Seri. Untuk pernyataan SQL yang tidak dieksekusi dalam transaksi, nilai parametertrace_idtidak mengandung'-'. Anda dapat mengeksekusi pernyataan berikut untuk menanyakan kinerja kueri SQL dalam memproses transaksi.CatatanAnalisis transaksi kurang efisien dibandingkan operasi kueri lainnya karena sistem memeriksa awalan pernyataan SQL.
Tanyakan durasi eksekusi rata-rata transaksi
Anda dapat mengeksekusi pernyataan berikut untuk menanyakan periode rata-rata waktu yang sistem perlukan untuk mengeksekusi transaksi.
| SELECT sum(response_time) / COUNT(DISTINCT substr(trace_id, 1, strpos(trace_id, '-') - 1)) where strpos(trace_id, '-') > 0Tanyakan 10 transaksi lambat teratas
Anda dapat mengeksekusi pernyataan berikut untuk menanyakan transaksi lambat berdasarkan durasi eksekusi.
| SELECT substr(trace_id, 1, strpos(trace_id, '-') - 1) as "Transaction ID" , sum(response_time) as "Durasi Eksekusi" where strpos(trace_id, '-') > 0 GROUP BY substr(trace_id, 1, strpos(trace_id, '-') - 1) ORDER BY "Durasi Eksekusi" DESC LIMIT 10Kemudian, Anda dapat mengeksekusi pernyataan berikut untuk menanyakan pernyataan SQL yang dieksekusi dalam transaksi lambat berdasarkan ID transaksi. Ini membantu Anda menganalisis penyebab transaksi lambat.
dan trace_id: db3226a20402000*Tanyakan 10 transaksi teratas yang dilakukan pada jumlah baris terbesar
Anda dapat mengeksekusi pernyataan berikut untuk menanyakan 10 transaksi teratas yang dilakukan pada jumlah baris terbesar.
| SELECT substr(trace_id, 1, strpos(trace_id, '-') - 1) as "Transaction ID" , sum(affect_rows) as "Baris yang Dioperasikan" where strpos(trace_id, '-') > 0 GROUP BY substr(trace_id, 1, strpos(trace_id, '-') - 1) ORDER BY "Baris yang Dioperasikan" DESC LIMIT 10
Analisis Keamanan SQL
Anda dapat menentukan kondisi berikut untuk menanyakan hasil analisis keamanan.
Tanyakan distribusi kueri SQL gagal berdasarkan tipe
Anda dapat menentukan kondisi berikut untuk menanyakan distribusi kueri SQL gagal berdasarkan tipe.
dan fail > 0 | select sql_type, count(1) as "jumlah kegagalan" group by sql_typeTanyakan pernyataan SQL berisiko tinggi
Pernyataan DROP dan TRUNCATE adalah pernyataan SQL berisiko tinggi di PolarDB-X. Anda dapat menentukan aturan untuk mengidentifikasi pernyataan SQL berisiko tinggi sesuai kebutuhan bisnis Anda.
Anda dapat menentukan kondisi berikut untuk menanyakan pernyataan DROP atau TRUNCATE.
dan sql_type: Drop OR sql_type: TruncateTanyakan pernyataan DELETE yang digunakan untuk menghapus data dari sejumlah besar baris
Anda dapat menentukan kondisi berikut untuk menanyakan pernyataan SQL yang digunakan untuk menghapus data dari lebih dari 100 baris.
dan affect_rows > 100 dan sql_type: Delete | SELECT date_format(from_unixtime(__time__), '%m/%d %H:%i:%s') as time, user, client_ip, client_port, affect_rows, sql ORDER BY affect_rows desc LIMIT 50