全部产品
Search
文档中心

:Analisis log

更新时间:Nov 09, 2025

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 Delete dari bidang sql_type untuk menentukan kondisi guna menanyakan semua pernyataan DELETE.

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: 200003
  • Gunakan 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:Drop
  • Gunakan beberapa kondisi

    Anda dapat menentukan beberapa kondisi dengan hubungan AND atau OR. Sebagai contoh, Anda dapat menentukan kondisi berikut untuk menanyakan pernyataan DELETE yang dieksekusi pada baris 200003.

    dan sql: 200003 dan sql_type: Delete
  • Gunakan ekspresi perbandingan numerik sebagai kondisi

    Dalam contoh ini, nilai bidang affect_rows dan response_time adalah numerik dan mendukung operator perbandingan. Sebagai contoh, Anda dapat menambahkan kondisi berikut untuk menanyakan pernyataan DROP di mana nilai parameter response_time lebih besar dari 5 detik.

    dan response_time > 5 dan sql_type: Drop

    Anda 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_ratio

    Catatan

    Anda 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_type
  • Tanyakan 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 DESC
    Catatan

    Dalam 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 bidang response_time untuk 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 50

  • Tanyakan 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 10

    Informasi 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.

    Catatan

    Dalam 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_id memiliki awalan yang sama. Akhirannya dalam format '-' + Nomor Seri. Untuk pernyataan SQL yang tidak dieksekusi dalam transaksi, nilai parameter trace_id tidak mengandung '-'. Anda dapat mengeksekusi pernyataan berikut untuk menanyakan kinerja kueri SQL dalam memproses transaksi.

    Catatan

    Analisis 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, '-') > 0
    • Tanyakan 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 10

      Kemudian, 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_type
  • Tanyakan 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: Truncate
  • Tanyakan 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