Gəlin əsasdan başlayaq. PostgreSQL SQL-sorğular və tranzaksiyaların analizi üçün möhtəşəm alətlər dəsti təqdim edir. Məsələn, daxili current_query() və txid_current() funksiyaları sənə imkan verir ki:
- Cari icra olunan SQL-sorğunu əldə edəsən.
- Sorğunun hansı tranzaksiya çərçivəsində icra olunduğunu biləsən.
- SQL-əməliyyatları sonradan analiz üçün loglayasan.
- Əgər kodun bir şey gözləyir, amma tamam başqa bir şey baş verirsə, tranzaksiyalarla bağlı problemləri izləyəsən.
Bütün bunlar səni o vəziyyətlərdə xilas edə bilər ki, standart debug çıxışı kömək etmir və ya sən sorğuların davranışını "izləməklə" analiz etmək istəyirsən.
Daxili funksiyalara baxış
current_query() funksiyası
current_query() bu bağlantıda icra olunan cari SQL-sorğunun mətnini qaytarır. "O bunu haradan bilir?" — deyə soruşacaqsan. PostgreSQL hər bir bağlantının vəziyyətini əla izləyir və bu funksiya sənə bu "pərdəarxasına" baxmağa kömək edir.
Sintaksis:
SELECT current_query();
İcra nümunəsi:
-- Funksiyada sorğunu icra edirik
DO $$
BEGIN
RAISE NOTICE 'Cari sorğu: %', current_query();
END;
$$;
-- Nəticə:
-- NOTICE: Cari sorğu: DO $$ BEGIN RAISE NOTICE 'Cari sorğu: %', current_query(); END; $$;
Nümunədən göründüyü kimi, current_query() bizə icra olunan sorğunun mətnini göstərir. Bu məlumat mürəkkəb prosedurların analizində çox faydalıdır: sən bilirsən ki, məhz nə icra olunur!
txid_current() funksiyası
Söhbət tranzaksiyalardan gedəndə, txid_current() funksiyası əla alətə çevrilir. O, cari tranzaksiyanın unikal identifikatorunu qaytarır. Bu xüsusilə faydalıdır, əgər sən bir tranzaksiya çərçivəsində əməliyyatların ardıcıllığını izləmək istəyirsənsə.
Sintaksis:
SELECT txid_current();
İcra nümunəsi:
BEGIN;
-- Cari tranzaksiyanın ID-sini əldə edirik
SELECT txid_current();
-- Çıxış:
-- 564 (məsələn, identifikator)
-- Tranzaksiyanı bitiririk
COMMIT;
Bu tranzaksiya ID-ləri logların uyğunlaşdırılması, əməliyyatların ardıcıllığının analizi və hətta çoxistifadəçili sistemlərin debugu üçün istifadə oluna bilər.
Real tapşırıqlarda istifadə nümunələri
- İcra zamanı cari sorğunun loglanması.
Bəzən prosedur və ya funksiya bir neçə SQL-sorğu saxlayır. Harada nə səhv getdiyini başa düşmək üçün cari SQL-sorğunu loglamaq olar. Məsələn:
DO $$
DECLARE
current_txn_id BIGINT;
BEGIN
current_txn_id := txid_current();
RAISE NOTICE 'Cari tranzaksiyanın ID-si: %', current_txn_id;
RAISE NOTICE 'Cari sorğu: %', current_query();
-- Burada sənin əlavə əməliyyatların ola bilər
END;
$$;
Bu kod konsolda tranzaksiyanın identifikatorunu və cari sorğunun mətnini çıxaracaq. İndi biz dəqiq bilirik ki, bu anda nə icra olunur.
- Problemləri aşkar etmək üçün tranzaksiyaların analizi.
Təsəvvür elə ki, istifadəçilər kütləvi yeniləmə zamanı məlumatların itməsi ilə bağlı şikayət edirlər. Sən bir neçə prosedur yaradırsan, hər biri bir tranzaksiya daxilində işə salınır. Necə başa düşək, günahkar kimdir? Nümunə:
BEGIN;
-- Tranzaksiyanın loglanmasını əlavə edirik
DO $$
BEGIN
RAISE NOTICE 'Cari tranzaksiyanın ID-si: %', txid_current();
END;
$$;
-- "Problemli" SQL sorğunu icra edirik
UPDATE orders
SET status = 'processed'
WHERE id IN (SELECT order_id FROM pending_orders);
COMMIT;
Əgər yeniləmələr keçmir, sən dərhal dəyişikliklərinin aid olduğu tranzaksiyanın ID-sini görürsən. Bu, təkcə səhvin tapılmasını asanlaşdırmır, həm də başa düşməyə kömək edir ki, tranzaksiya konfliktləri olubmu.
- Tarixi analiz üçün sorğuların loglanması.
Bəzən sənə təkcə cari problemi düzəltmək yox, həm də hansı SQL-sorğuların icra olunduğunu yadda saxlamaq lazımdır. Məsələn, loglama üçün cədvəl yarada bilərsən:
CREATE TABLE query_log (
log_time TIMESTAMP DEFAULT NOW(),
query_text TEXT,
txn_id BIGINT
);
Bax belə, current_query() və txid_current() istifadə edərək sorğuları necə yazmaq olar:
DO $$
BEGIN
INSERT INTO query_log (query_text, txn_id)
VALUES (current_query(), txid_current());
END;
$$;
İndi query_log cədvəlində hər bir icra olunan sorğu və onun icra olunduğu tranzaksiya haqqında məlumat saxlanılır. Bu, verilənlər bazasının işini analiz etmək üçün əvəzsiz alətdir.
İstifadə üzrə praktiki keislər
Nümunə 1: tranzaksiyaların auditi
Təsəvvür elə ki, sən çoxistifadəçili sistemdə əməliyyatları analiz edirsən. Tranzaksiya ID-sinin (txid_current) loglanması sənə bir tranzaksiya üzrə əməliyyatları qruplaşdırmağa imkan verir.
DO $$
DECLARE
txn_id BIGINT;
BEGIN
txn_id := txid_current();
RAISE NOTICE 'Tranzaksiya başladı, ID: %', txn_id;
-- Hər hansı əməliyyat
UPDATE users SET last_login = NOW() WHERE id = 123;
RAISE NOTICE 'Cari sorğu: %', current_query();
END;
$$;
Nümunə 2: prosedurların debugunu asanlaşdırmaq
Sən mürəkkəb proseduru çağırdın və nəsə səhv getdi. Funksiyanın müxtəlif mərhələlərində current_query() loglamasını əlavə edə bilərsən ki, hansı sorğunun icra olunduğunu görəsən:
CREATE OR REPLACE FUNCTION debugged_function() RETURNS VOID AS $$
BEGIN
RAISE NOTICE 'Yeniləmədən əvvəl cari sorğu: %', current_query();
UPDATE data_table SET field = 'debugging';
RAISE NOTICE 'Yeniləmədən sonra cari sorğu: %', current_query();
END;
$$ LANGUAGE plpgsql;
Funksiya çağırışı bitəndə, sən iki bildiriş alacaqsan, uyğun SQL-sorğularla.
İstifadə üçün məsləhətlər
current_query()istifadə et, çoxistifadəçili sistemlərdə sorğuları loglamaq üçün, başa düşmək üçün ki, hansı əməliyyatlar icra olunur.txid_current()dəyişikliklərin mənşəyini analiz etmək üçün idealdır: tranzaksiyanın hansı mərhələsində məlumat əlavə olunub və ya dəyişib.- İşin bitəndə artıq loglamanı silməyi unutma.
RAISE NOTICEilə daimi bildirişlər funksiyanın icrasını ləngidə bilər.
Bu daxili funksiyalar sənin "mikroskopundur", hansı ki, verilənlər bazasının necə işlədiyini ən xırda detallara qədər araşdırmağa imkan verir. Onlar sənə səhvləri tutmağa, performansı yaxşılaşdırmağa və mürəkkəb sistemlərdə nə baş verdiyini başa düşməyə kömək edəcək. Orada, PostgreSQL-in içində, sənin verilənlər bazan artıq sirləri bölüşməyə hazırdır — sadəcə onları oxumağı öyrənmək qalır.
GO TO FULL VERSION