استمرار لمقال "في
محاولة لخلق التماثلية من الرماد ل PostgreSQL ".
سيتم النظر في المقالة وعرضها على استفسارات وأمثلة محددة - ما هي المعلومات المفيدة التي يمكن الحصول عليها باستخدام محفوظات طريقة العرض pg_locks.
تحذير.
بسبب حداثة الموضوع وفترة الاختبار غير المكتملة ، قد تحتوي المقالة على أخطاء. يتم تشجيع النقد والتعليقات بقوة ومتوقعة.
إدخال البيانات
تاريخ إرسال Pg_locks
archive_lockingCREATE TABLE archive_locking ( timepoint timestamp without time zone , locktype text , relation oid , mode text , tid xid , vtid text , pid integer , blocking_pids integer[] , granted boolean , queryid bigint );
في الواقع ، يشبه الجدول جدول
archive_pg_stat_activity الموضح بمزيد من التفاصيل هنا -
pg_stat_statements + pg_stat_activity + loq_query = pg_ash؟ وهنا -
محاولة لإنشاء مثيل لـ ASH لـ PostgreSQL.لملء العمود
queryid ، استخدم الوظيفة
update_history_locking_by_queryid Explanation: يتم تحديث قيمة عمود queryid في الجدول history_locking ، ثم عند تكوين قسم جديد للجدول archive_locking ، سيتم حفظ القيمة في القيم التاريخية.
إنتاج
معلومات عامة عن العمليات ككل.
في انتظار الكثير من LOCKTYPES
تحقيق WITH t AS ( SELECT locktype , mode , count(*) as total FROM activity_hist.archive_locking WHERE timepoint between pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') AND NOT granted GROUP BY locktype , mode ) SELECT locktype , mode , total * interval '1 second' as duration FROM t ORDER BY 3 DESC
مثال | في انتظار الكثير من LOCKTYPES
+ -------------------- + ---------------------------- - + --------------------
| نوع القفل | وضع | مدة
+ -------------------- + ---------------------------- - + --------------------
| معاملة | Sharelock | 19:39:26
| tuple | AccessExclusiveLock | 0:03:35
+ -------------------- + ---------------------------- - + --------------------
أخذ الكثير من LOCKTYPES
تحقيق WITH t AS ( SELECT locktype , mode , count(*) as total FROM activity_hist.archive_locking WHERE timepoint between pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') AND granted GROUP BY locktype , mode ) SELECT locktype , mode , total * interval '1 second' as duration FROM t ORDER BY 3 DESC
مثال | أخذ الكثير من LOCKTYPES
+ -------------------- + ---------------------------- - + --------------------
| نوع القفل | وضع | مدة
+ -------------------- + ---------------------------- - + --------------------
| العلاقة | RowExclusiveLock | 51:11:10
| virtualxid | ExclusiveLock | 48:10:43
| معاملة | ExclusiveLock | 44:24:53
| العلاقة | AccessShareLock | 20:06:13
| tuple | AccessExclusiveLock | 17:58:47
| tuple | ExclusiveLock | 1:40:41
| العلاقة | ShareUpdateExclusiveLock | 0:26:41
| كائن | RowExclusiveLock | 0:00:01
| معاملة | Sharelock | 0:00:01
| تمديد | ExclusiveLock | 0:00:01
+ -------------------- + ---------------------------- - + --------------------
معلومات مفصلة عن استفسارات محددة الاستعلام
في انتظار القطع بواسطة LOCKTYPES بواسطة QUERYID
تحقيق WITH lt AS ( SELECT pid , locktype , mode , timepoint , queryid , blocking_pids , MIN ( timepoint ) OVER (PARTITION BY pid , locktype ,mode ) as started FROM activity_hist.archive_locking WHERE timepoint between pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') AND NOT granted AND queryid IS NOT NULL GROUP BY pid , locktype , mode , timepoint , queryid , blocking_pids ) SELECT lt.pid , lt.locktype , lt.mode , lt.started , lt.queryid , lt.blocking_pids , COUNT(*) * interval '1 second' as duration FROM lt GROUP BY lt.pid , lt.locktype , lt.mode , lt.started , lt.queryid , lt.blocking_pids ORDER BY 4
مثال | في انتظار القطع بواسطة LOCKTYPES بواسطة QUERYID
+ ---------- + ------------------------- + ------------ -------- + ------------------------------ + ---------- ---------- + -------------------- + ------------------ -
| PID | نوع القفل | وضع | بدأ | queryid | blocking_pids | مدة
+ ---------- + ------------------------- + ------------ -------- + ------------------------------ + ---------- ---------- + -------------------- + ------------------ -
| 11288 | معاملة | Sharelock | 2019-09-17 10: 00: 00.302936 | 389015618226997618 | {11092} | 0:03:34
| 11626 | معاملة | Sharelock | 2019-09-17 10: 00: 21.380921 | 389015618226997618 | {12380} | 0:00:29
| 11626 | معاملة | Sharelock | 2019-09-17 10: 00: 21.380921 | 389015618226997618 | {11092} | 0:03:25
| 11626 | معاملة | Sharelock | 2019-09-17 10: 00: 21.380921 | 389015618226997618 | {12213} | 0:01:55
| 11626 | معاملة | Sharelock | 2019-09-17 10: 00: 21.380921 | 389015618226997618 | {12751} | 0:00:01
| 11629 | معاملة | Sharelock | 2019-09-17 10: 00: 24.331935 | 389015618226997618 | {11092} | 0:03:22
| 11629 | معاملة | Sharelock | 2019-09-17 10: 00: 24.331935 | 389015618226997618 | {12007} | 0:00:01
| 12007 | معاملة | Sharelock | 2019-09-17 10: 05: 03.327933 | 389015618226997618 | {11629} | 0:00:13
| 12007 | معاملة | Sharelock | 2019-09-17 10: 05: 03.327933 | 389015618226997618 | {11092} | 0:01:10
| 12007 | معاملة | Sharelock | 2019-09-17 10: 05: 03.327933 | 389015618226997618 | {11288} | 0:00:05
| 12213 | معاملة | Sharelock | 2019-09-17 10: 06: 07.328019 | 389015618226997618 | {12007} | 0:00:10
أخذ كتل بواسطة LOCKTYPES بواسطة QUERYID
تحقيق WITH lt AS ( SELECT pid , locktype , mode , timepoint , queryid , blocking_pids , MIN ( timepoint ) OVER (PARTITION BY pid , locktype ,mode ) as started FROM activity_hist.archive_locking WHERE timepoint between pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') AND granted AND queryid IS NOT NULL GROUP BY pid , locktype , mode , timepoint , queryid , blocking_pids ) SELECT lt.pid , lt.locktype , lt.mode , lt.started , lt.queryid , lt.blocking_pids , COUNT(*) * interval '1 second' as duration FROM lt GROUP BY lt.pid , lt.locktype , lt.mode , lt.started , lt.queryid , lt.blocking_pids ORDER BY 4
مثال | أخذ كتل بواسطة LOCKTYPES بواسطة QUERYID
+ ---------- + ------------------------- + ------------ -------- + ------------------------------ + ---------- ---------- + -------------------- + ------------------ -
| PID | نوع القفل | وضع | بدأ | queryid | blocking_pids | مدة
+ ---------- + ------------------------- + ------------ -------- + ------------------------------ + ---------- ---------- + -------------------- + ------------------ -
| 11288 | العلاقة | RowExclusiveLock | 2019-09-17 10: 00: 00.302936 | 389015618226997618 | {11092} | 0:03:34
| 11092 | معاملة | ExclusiveLock | 2019-09-17 10: 00: 00.302936 | 389015618226997618 | {} | 0:03:34
| 11288 | العلاقة | RowExclusiveLock | 2019-09-17 10: 00: 00.302936 | 389015618226997618 | {} | 0:00:10
| 11092 | العلاقة | RowExclusiveLock | 2019-09-17 10: 00: 00.302936 | 389015618226997618 | {} | 0:03:34
| 11092 | virtualxid | ExclusiveLock | 2019-09-17 10: 00: 00.302936 | 389015618226997618 | {} | 0:03:34
| 11288 | virtualxid | ExclusiveLock | 2019-09-17 10: 00: 00.302936 | 389015618226997618 | {11092} | 0:03:34
| 11288 | معاملة | ExclusiveLock | 2019-09-17 10: 00: 00.302936 | 389015618226997618 | {11092} | 0:03:34
| 11288 | tuple | AccessExclusiveLock | 2019-09-17 10: 00: 00.302936 | 389015618226997618 | {11092} | 0:03:34
استخدام محفوظات القفل عند تحليل حوادث الأداء.- طلب مع queryid = 389015618226997618 يتم تنفيذه بواسطة عملية مع pid = 11288 المتوقع حظر من 2019-09-17 10:00:00 لمدة 3 دقائق.
- تم تأمين القفل بواسطة عملية ذات معرف = 11092
- عقدت عملية باستخدام pid = 11092 تنفيذ استعلام باستخدام queryid = 389015618226997618 بدءًا من 2019-09-17 10:00:00 تمسك القفل لمدة 3 دقائق.
يؤدي
الآن ، آمل أن يبدأ الشيء الأكثر إثارة للاهتمام والمفيد - جمع الإحصاءات وتحليل الحالات حول تاريخ التوقعات والأقفال.
في المستقبل ، أريد أن أصدق ، سيتحول الأمر إلى مجموعة من الملاحظات (على غرار Oracle metalink).
بشكل عام ، لهذا السبب يتم عرض التقنية المستخدمة في أسرع وقت ممكن للتعرف العام.
في المستقبل القريب جدا سأحاول وضع المشروع على جيثب.