بيان المشكلة
لتحسين استعلامات PostgreSQL ، تعد القدرة على تحليل محفوظات النشاط ، ولا سيما - التوقعات ، والأقفال ، وإحصائيات الجدول ، مطلوبة للغاية.
الخيارات المتاحة
أداة تحليل الحملات
التاريخية أو "AWR for Postgres" : حل مثير للاهتمام للغاية ، ولكن لا يوجد تاريخ من pg_stat_activity و pg_locks.
تمديد Pgsentinel :
"
يتم تخزين كافة المعلومات المتراكمة في ذاكرة الوصول العشوائي فقط ، ويتم تنظيم كمية الذاكرة المستهلكة بعدد آخر السجلات المخزنة.
تتم إضافة حقل queryid - نفس queryid من ملحق pg_stat_statements (مطلوب تثبيت أولي). "
بالطبع ، سيساعد هذا الأمر إلى حد كبير ، ولكن مصدر الإزعاج هو الفقرة الأولى ، "
يتم تخزين جميع المعلومات المتراكمة في ذاكرة الوصول العشوائي فقط " ، أي لدينا تأثير على القاعدة المستهدفة. بالإضافة إلى ذلك ، لا يوجد سجل تأمين وإحصائيات الجدول. أي بشكل عام ، الحل غير مكتمل: "
لا توجد حزمة جاهزة للتثبيت بعد. يُقترح تنزيل المصادر وبناء المكتبة بنفسك. أولاً ، تحتاج إلى تثبيت الحزمة "devel" لخادمك وكتابة المسار إلى pg_config في متغير PATH. ".
بشكل عام - الكثير من الضجة ، وفي حالة قواعد بيانات الإنتاج الخطيرة ، ربما لن تكون هناك طريقة لفعل شيء ما مع الخادم. مرة أخرى ، تحتاج إلى التوصل إلى شيء خاص بك.
تحذير.
نظرًا لحداثة الموضوع وعدم اكتمال فترة الاختبار ، فإن المقال مخصص للإرشاد فقط ، وليس كمجموعة من الملخصات والنتائج الوسيطة.
سيتم إعداد مواد أكثر تفصيلا في وقت لاحق ، في أجزاء.
الخطوط العريضة لمتطلبات الحل
من الضروري تطوير أداة لتخزين:
عرض تاريخ Pg_stat_activityسجل قفل الجلسة باستخدام طريقة العرض pg_locksمتطلبات القرار هو تقليل التأثير على قاعدة البيانات الهدف.
الفكرة العامة هي أن وكيل جمع البيانات يتم إطلاقه ليس في قاعدة البيانات الهدف ، ولكن في قاعدة بيانات المراقبة كخدمة systemd. نعم ، من الممكن فقدان بعض البيانات ، لكن هذا ليس ضروريًا للإبلاغ ، لكن لا يوجد تأثير على قاعدة البيانات الهدف من الذاكرة ومساحة القرص. وفي حالة استخدام تجمع اتصال ، يكون التأثير على عمليات المستخدم ضئيلًا.
مراحل التنفيذ
1. الجداول الخدمة
لتخزين الجداول ، يتم استخدام مخطط منفصل حتى لا يعقد تحليل الجداول الرئيسية المستخدمة.
DROP SCHEMA IF EXISTS activity_hist ; CREATE SCHEMA activity_hist AUTHORIZATION monitor ;
هام: لم يتم إنشاء المخطط في قاعدة البيانات الهدف ، ولكن في قاعدة بيانات المراقبة.عرض تاريخ Pg_stat_activity
استخدم الجدول لتخزين اللقطات الحالية لطريقة العرض pg_stat_activity
activity_hist.history_pg_stat_activity: لتسريع الإدراج - لا فهارس أو قيود.
لتخزين المحفوظات مباشرةً ، يتم استخدام جدول مقسم:
activity_hist.archive_pg_stat_activity: DROP TABLE IF EXISTS activity_hist.archive_pg_stat_activity; CREATE TABLE activity_hist.archive_pg_stat_activity ( timepoint timestamp without time zone , datid oid , datname name , pid integer, usesysid oid , usename name , application_name text , client_addr inet , client_hostname text , client_port integer, backend_start timestamp with time zone , xact_start timestamp with time zone , query_start timestamp with time zone , state_change timestamp with time zone , wait_event_type text , wait_event text , state text , backend_xid xid , backend_xmin xid , query text , backend_type text , queryid bigint ) PARTITION BY RANGE (timepoint);
نظرًا لعدم وجود متطلبات لسرعة الإدراج في هذه الحالة ، تم إنشاء بعض الفهارس لتسريع إعداد التقارير.
جلسة قفل التاريخ
لتخزين لقطات قفل الجلسة الحالية ، استخدم الجدول:
activity_hist.history_locking: أيضا ، لتسريع الإدراج - لا فهارس أو قيود.
لتخزين المحفوظات مباشرةً ، يتم استخدام جدول مقسم:
activity_hist.archive_locking: DROP TABLE IF EXISTS activity_hist.archive_locking; CREATE TABLE activity_hist.archive_locking ( timepoint timestamp without time zone , locktype text , relation oid , mode text , tid xid , vtid text , pid integer , blocking_pids integer[] , granted boolean ) PARTITION BY RANGE (timepoint);
نظرًا لعدم وجود متطلبات لسرعة الإدراج في هذه الحالة ، تم إنشاء بعض الفهارس لتسريع إعداد التقارير.
2. ملء التاريخ الحالي
لالتقاط لقطات من العرض مباشرةً ، يتم استخدام برنامج نصي bash يقوم بتشغيل وظيفة plpgsql.
تقوم وظيفة
plpgsql dblink بالوصول إلى طرق العرض في قاعدة البيانات الهدف وإدراج صفوف في جداول الخدمة في قاعدة بيانات المراقبة.
get_current_activity.sql CREATE OR REPLACE FUNCTION activity_hist.get_current_activity( current_host text , current_s_name text , current_s_pass text ) RETURNS BOOLEAN AS $$ DECLARE database_rec record; dblink_str text ; BEGIN EXECUTE 'SELECT dblink_connect(''LINK1'',''host='||current_host||' port=5432 dbname=postgres'|| ' user='||current_s_name||' password='||current_s_pass|| ' '')'; -------------------------------------------------------------------- --GET pg_stat_activity stats INSERT INTO activity_hist.history_pg_stat_activity ( SELECT * FROM dblink('LINK1', 'SELECT now() , datid , datname , pid , usesysid , usename , application_name , client_addr , client_hostname , client_port , backend_start , xact_start , query_start , state_change , wait_event_type , wait_event , state , backend_xid , backend_xmin , query , backend_type FROM pg_stat_activity ') AS t ( timepoint timestamp without time zone , datid oid , datname name , pid integer, usesysid oid , usename name , application_name text , client_addr inet , client_hostname text , client_port integer, backend_start timestamp with time zone , xact_start timestamp with time zone , query_start timestamp with time zone , state_change timestamp with time zone , wait_event_type text , wait_event text , state text , backend_xid xid , backend_xmin xid , query text , backend_type text ) ); --------------------------------------- --ACTIVITY_HIST.HISTORY_LOCKING INSERT INTO activity_hist.history_locking ( SELECT * FROM dblink('LINK1', 'SELECT now() , lock.locktype, lock.relation, lock.mode, lock.transactionid as tid, lock.virtualtransaction as vtid, lock.pid, pg_blocking_pids(lock.pid), lock.granted FROM pg_catalog.pg_locks lock LEFT JOIN pg_catalog.pg_database db ON db.oid = lock.database WHERE NOT lock.pid = pg_backend_pid() ') AS t ( timepoint timestamp without time zone , locktype text , relation oid , mode text , tid xid , vtid text , pid integer , blocking_pids integer[] , granted boolean ) ); PERFORM dblink_disconnect('LINK1'); RETURN TRUE ; END $$ LANGUAGE plpgsql;
لجمع لقطات من العرض ، يتم استخدام خدمة systemd ، واثنين من البرامج النصية:
pg_current_activity.service pg_current_activity.timer تعيين حقوق البرامج النصية:
# chmod 755 pg_current_activity.timer
# chmod 755 pg_current_activity.service
نبدأ الخدمة:
# systemctl الخفي إعادة تحميل
# systemctl start pg_current_activity.service
وبالتالي ، يتم جمع تاريخ العروض في شكل كل لقطات ثانية. بالطبع ، إذا تم ترك كل شيء كما هو ، فسوف تزداد الجداول بسرعة في الحجم وسيصبح العمل المنتج أكثر أو أقل مستحيلاً.
من الضروري تنظيم أرشفة البيانات.
3. أرشفة التاريخ
للأرشفة ، يتم استخدام الجداول المقسمة *.
يتم إنشاء أقسام جديدة كل ساعة ، بينما يتم حذف البيانات القديمة من الجداول * ، لذلك لا يتغير حجم السجل * الجداول كثيرًا ولا تتناقص سرعة الإدراج مع مرور الوقت.
يتم تنفيذ إنشاء أقسام جديدة بواسطة دالة plpgsql activity_hist.archive_current_activity. خوارزمية العملية بسيطة للغاية (باستخدام مثال القسم لجدول archive_pg_stat_activity).
إنشاء وملء قسم جديد EXECUTE format( 'CREATE TABLE ' || partition_name || ' PARTITION OF activity_hist.archive_pg_stat_activity FOR VALUES FROM ( %L ) TO ( %L ) ' , to_char(date_trunc('year', partition_min_range ),'YYYY')||'-'|| to_char(date_trunc('month', partition_min_range ),'MM')||'-'|| to_char(date_trunc('day', partition_min_range ),'DD')||' '|| to_char(date_trunc('hour', partition_min_range ),'HH24')||':00', to_char(date_trunc('year', partition_max_range ),'YYYY')||'-'|| to_char(date_trunc('month', partition_max_range ),'MM')||'-'|| to_char(date_trunc('day', partition_max_range ),'DD')||' '|| to_char(date_trunc('hour', partition_max_range ),'HH24')||':00' ); INSERT INTO activity_hist.archive_pg_stat_activity ( SELECT * FROM activity_hist.history_pg_stat_activity WHERE timepoint BETWEEN partition_min_range AND partition_max_range );
إنشاء الفهارس EXECUTE format ( 'CREATE INDEX '||index_name|| ' ON '||partition_name||' ( wait_event_type , backend_type , timepoint )' ); EXECUTE format ('CREATE INDEX '||index_name|| ' ON '||partition_name||' ( wait_event_type , backend_type , timepoint , queryid )' );
احذف البيانات القديمة من جدول history_pg_stat_activity DELETE FROM activity_hist.history_pg_stat_activity WHERE timepoint < partition_max_range;
بالطبع ، يتم حذف الأقسام القديمة بشكل دوري باعتبارها غير ضرورية.
التقارير الأساسية
في الواقع ، لماذا يتم كل هذا. لتلقي التقارير عن بُعد جدًا ، تذكرنا تقريبًا بـ Oracle AWR.
من المهم أن تضيف أنه من أجل تلقي التقارير ، من الضروري بناء علاقة بين عرضي pg_stat_activity و pg_stat_statements. يتم ربط الجداول عن طريق إضافة عمود "queryid" إلى الجداول "history_pg_stat_activity" ، "archive_pg_stat_activity". طريقة إضافة قيمة عمود خارج نطاق هذه المقالة ، وهي موصوفة هنا - pg_stat_statements + pg_stat_activity + loq_query = pg_ash؟ .
إجمالي وقت وحدة المعالجة المركزية للاستعلام
الاستعلام: WITH hist AS ( SELECT aa.query ,aa.queryid , count(*) * interval '1 second' AS duration FROM activity_hist.archive_pg_stat_activity aa 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 backend_type = 'client backend' AND datname != 'postgres' AND ( aa.wait_event_type IS NULL ) ANDaa.state = 'active' GROUP BY aa.wait_event_type , aa.wait_event , aa.query ,aa.queryid UNION SELECT ha.query ,ha.queryid, count(*) * interval '1 second' AS duration FROM activity_hist.history_pg_stat_activity_for_reports ha 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 backend_type = 'client backend' AND datname != 'postgres' AND ( ha.wait_event_type IS NULL )AND ha.state = 'active' GROUP BY ha.wait_event_type , ha.wait_event , ha.query ,ha.queryid ) SELECT query , queryid , SUM( duration ) as duration FROM hist GROUP BY query , queryid ORDER BY 3 DESC
فاصل ' WITH hist AS ( SELECT aa.query ,aa.queryid , count(*) * interval '1 second' AS duration FROM activity_hist.archive_pg_stat_activity aa 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 backend_type = 'client backend' AND datname != 'postgres' AND ( aa.wait_event_type IS NULL ) ANDaa.state = 'active' GROUP BY aa.wait_event_type , aa.wait_event , aa.query ,aa.queryid UNION SELECT ha.query ,ha.queryid, count(*) * interval '1 second' AS duration FROM activity_hist.history_pg_stat_activity_for_reports ha 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 backend_type = 'client backend' AND datname != 'postgres' AND ( ha.wait_event_type IS NULL )AND ha.state = 'active' GROUP BY ha.wait_event_type , ha.wait_event , ha.query ,ha.queryid ) SELECT query , queryid , SUM( duration ) as duration FROM hist GROUP BY query , queryid ORDER BY 3 DESC
* فاصل ' WITH hist AS ( SELECT aa.query ,aa.queryid , count(*) * interval '1 second' AS duration FROM activity_hist.archive_pg_stat_activity aa 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 backend_type = 'client backend' AND datname != 'postgres' AND ( aa.wait_event_type IS NULL ) ANDaa.state = 'active' GROUP BY aa.wait_event_type , aa.wait_event , aa.query ,aa.queryid UNION SELECT ha.query ,ha.queryid, count(*) * interval '1 second' AS duration FROM activity_hist.history_pg_stat_activity_for_reports ha 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 backend_type = 'client backend' AND datname != 'postgres' AND ( ha.wait_event_type IS NULL )AND ha.state = 'active' GROUP BY ha.wait_event_type , ha.wait_event , ha.query ,ha.queryid ) SELECT query , queryid , SUM( duration ) as duration FROM hist GROUP BY query , queryid ORDER BY 3 DESC
الخلفية "وdatname! =' بوستجرس 'AND (aa.wait_event_type باطل) ANDaa.state = WITH hist AS ( SELECT aa.query ,aa.queryid , count(*) * interval '1 second' AS duration FROM activity_hist.archive_pg_stat_activity aa 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 backend_type = 'client backend' AND datname != 'postgres' AND ( aa.wait_event_type IS NULL ) ANDaa.state = 'active' GROUP BY aa.wait_event_type , aa.wait_event , aa.query ,aa.queryid UNION SELECT ha.query ,ha.queryid, count(*) * interval '1 second' AS duration FROM activity_hist.history_pg_stat_activity_for_reports ha 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 backend_type = 'client backend' AND datname != 'postgres' AND ( ha.wait_event_type IS NULL )AND ha.state = 'active' GROUP BY ha.wait_event_type , ha.wait_event , ha.query ,ha.queryid ) SELECT query , queryid , SUM( duration ) as duration FROM hist GROUP BY query , queryid ORDER BY 3 DESC
مثال:
------------------------------------------------------------------- | TOTAL CPU TIME FOR QUERIES : 07:47:36 +----+----------------------------------------+-------------------- | #| queryid| duration +----+----------------------------------------+-------------------- | 1| 389015618226997618| 04:28:58 | 2| | 01:07:29 | 3| 1237430309438971376| 00:59:38 | 4| 4710212362688288619| 00:50:48 | 5| 28942442626229688| 00:15:50 | 6| 9150846928388977274| 00:04:46 | 7| -6572922443698419129| 00:00:06 | 8| | 00:00:01 +----+----------------------------------------+--------------------
إجمالي فترات الانتظار لطلبات البحث
الاستعلام: WITH hist AS ( SELECT aa.query ,aa.queryid , count(*) * interval '1 second' AS duration FROM activity_hist.archive_pg_stat_activity aa 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 backend_type = 'client backend' AND datname != 'postgres' AND ( aa.wait_event_type IS NOT NULL ) GROUP BY aa.wait_event_type , aa.wait_event , aa.query ,aa.queryid UNION SELECT ha.query ,ha.queryid, count(*) * interval '1 second' AS duration FROM activity_hist.history_pg_stat_activity_for_reports ha 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 backend_type = 'client backend' AND datname != 'postgres' AND ( ha.wait_event_type IS NOT NULL ) GROUP BY ha.wait_event_type , ha.wait_event , ha.query ,ha.queryid ) SELECT query , queryid , SUM( duration ) as duration FROM hist GROUP BY query , queryid ORDER BY 3 DESC
مثال: ------------------------------------------------------------------- | TOTAL WAITINGS TIME FOR QUERIES : 21:55:04 +----+----------------------------------------+-------------------- | #| queryid| duration +----+----------------------------------------+-------------------- | 1| 389015618226997618| 16:19:05 | 2| | 03:47:04 | 3| 8085340880788646241| 00:40:20 | 4| 4710212362688288619| 00:13:35 | 5| 9150846928388977274| 00:12:25 | 6| 28942442626229688| 00:11:32 | 7| 1237430309438971376| 00:09:45 | 8| 2649515222348904837| 00:09:37 | 9| | 00:03:45 | 10| 3167065002719415275| 00:02:20 | 11| 5731212217001535134| 00:02:13 | 12| 8304755792398128062| 00:01:31 | 13| 2649515222348904837| 00:00:59 | 14| 2649515222348904837| 00:00:22 | 15| | 00:00:12 | 16| 3422818749220588372| 00:00:08 | 17| -5730801771815999400| 00:00:03 | 18| -1473395109729441239| 00:00:02 | 19| 2404820632950544954| 00:00:02 | 20| -6572922443698419129| 00:00:02 | 21| 2369289265278398647| 00:00:01 | 22| 180077086776069052| 00:00:01 +----+----------------------------------------+--------------------
في انتظار الاستفسارات
عمليات البحث ذات الصلة: WITH hist AS ( SELECT aa.wait_event_type , aa.wait_event FROM activity_hist.archive_pg_stat_activity aa 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 backend_type = 'client backend' AND datname != 'postgres' AND aa.wait_event IS NOT NULL GROUP BY aa.wait_event_type , aa.wait_event UNION SELECT ha.wait_event_type , ha.wait_event FROM activity_hist.history_pg_stat_activity_for_reports ha 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 backend_type = 'client backend' AND datname != 'postgres' AND ha.wait_event IS NOT NULL GROUP BY ha.wait_event_type , ha.wait_event ) SELECT wait_event_type , wait_event FROM hist GROUP BY wait_event_type , wait_event ORDER BY 1 ASC,2 ASC
مثال: ------------------------------------------------ | WAITINGS FOR QUERIES +----------------------------------------------- | wait_event_type = Client| | wait_event = ClientRead| | Total time = 00:46:56| ------------------------------------------------ | #| queryid| duration +-----+--------------------+-------------------- | 1| 8085340880788646241| 00:40:20 | 2| | 00:03:45 | 3| 5731212217001535134| 00:01:53 | 4| | 00:00:12 | 5| 9150846928388977274| 00:00:09 | 6| 3422818749220588372| 00:00:08 | 7| 1237430309438971376| 00:00:06 | 8| 28942442626229688| 00:00:05 | 9| 4710212362688288619| 00:00:05 | 10|-5730801771815999400| 00:00:03 | 11| 8304755792398128062| 00:00:02 | 12|-6572922443698419129| 00:00:02 | 13|-1473395109729441239| 00:00:02 | 14| 2404820632950544954| 00:00:02 | 15| 180077086776069052| 00:00:01 | 16| 2369289265278398647| 00:00:01 +----------------------------------------------- | wait_event_type = IO| | wait_event = BufFileRead| | Total time = 00:00:38| ------------------------------------------------ | #| queryid| duration +-----+--------------------+-------------------- | 1| 28942442626229688| 00:00:38 +-----------------------------------------------
تاريخ العمليات المقفلة
الاستعلام: SELECT MIN(date_trunc('second',timepoint)) AS started , count(*) * interval '1 second' as duration , pid , blocking_pids , relation , mode , locktype FROM activity_hist.archive_locking al 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 locktype = 'relation' GROUP BY pid , blocking_pids , relation , mode , locktype UNION SELECT MIN(date_trunc('second',timepoint)) AS started , count(*) * interval '1 second' as duration , pid , blocking_pids , relation , mode , locktype FROM activity_hist.history_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 locktype = 'relation' GROUP BY pid , blocking_pids , relation , mode , locktype ORDER BY 1
مثال: -------------------------------------------------- -------------------------------------------------- ---------------------------------
| تاريخ العمليات المقفلة
+ ----- + ---------- + -------------------- + ---------- + -------------------- + -------------------- + -------- ------------ + --------------------
| # | PID | بدأ | المدة | blocking_pids | العلاقة | وضع | locktype
+ ----- + ---------- + -------------------- + ---------- + -------------------- + -------------------- + -------- ------------ + --------------------
| 1 | 26224 | 2019-09-02 19: 32: 16 | 00: 01: 45 | {26211} | 16541 | AccessShareLock | علاقة
| 2 | 26390 | 2019-09-02 19: 34: 03 | 00: 00: 53 | {26211} | 16541 | AccessShareLock | علاقة
| 3 | 26391 | 2019-09-02 19: 34: 03 | 00: 00: 53 | {26211} | 16541 | AccessShareLock | علاقة
| 4 | 26531 | 2019-09-02 19: 35: 27 | 00: 00: 12 | {26211} | 16541 | AccessShareLock | علاقة
| 5 | 27284 | 2019-09-02 19: 44: 02 | 00: 00: 19 | {27276} | 16541 | AccessShareLock | علاقة
| 6 | 27283 | 2019-09-02 19: 44: 02 | 00: 00: 19 | {27276} | 16541 | AccessShareLock | علاقة
| 7 | 27286 | 2019-09-02 19: 44: 02 | 00: 00: 19 | {27276} | 16541 | AccessShareLock | علاقة
| 8 | 27423 | 2019-09-02 19:45:24 | 00: 00: 12 | {27394} | 16541 | AccessShareLock | علاقة
| 9 | 27648 | 2019-09-02 19: 48: 06 | 00: 00: 20 | {27647} | 16541 | AccessShareLock | علاقة
| 10 | 27650 | 2019-09-02 19: 48: 06 | 00: 00: 20 | {27647} | 16541 | AccessShareLock | علاقة
| 11 | 27735 | 2019-09-02 19: 49: 08 | 00: 00: 06 | {27650} | 16541 | AccessExclusiveLock | علاقة
| 12 | 28380 | 2019-09-02 19: 56: 03 | 00: 01: 56 | {28379} | 16541 | AccessShareLock | علاقة
| 13 | 28379 | 2019-09-02 19: 56: 03 | 00: 00: 01 | 28377 | 16541 | AccessExclusiveLock | علاقة
| | | | | 28376 | |
حظر عمليات التاريخ
عمليات البحث ذات الصلة: SELECT blocking_pids FROM activity_hist.archive_locking al 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 locktype = 'relation' GROUP BY blocking_pids UNION SELECT blocking_pids FROM activity_hist.history_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 locktype = 'relation' GROUP BY blocking_pids ORDER BY 1
مثال: -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -----------------------
حظر عمليات التاريخ
+ ---- + ---------- + ---------- + -------------------- + - --------- + -------------------- + ------------------- - + ------------------------------ + ----------------- -----------------------
| # | PID | اسم المستخدم | application_name | البيانات | بدأ | المدة | الدولة | سؤال
+ ---- + ---------- + ---------- + -------------------- + - --------- + -------------------- + ------------------- - + ------------------------------ + ----------------- -----------------------
| 1 | 26211 | tuser | psql | tdb1 | 2019-09-02 19: 31: 54 | 00: 00: 04 | الخمول |
| 2 | 26211 | tuser | psql | tdb1 | 2019-09-02 19: 31: 58 | 00: 00: 06 | الخمول في المعاملة | تبدأ.
| 3 | 26211 | tuser | psql | tdb1 | 2019-09-02 19: 32: 16 | 00: 01: 45 | الخمول في المعاملة | قفل الجدول wafer_data.
| 4 | 26211 | tuser | psql | tdb1 | 2019-09-02 19: 35: 54 | 00: 01: 23 | الخمول | الالتزام.
| 5 | 26211 | tuser | psql | tdb1 | 2019-09-02 19: 38: 46 | 00: 00: 02 | الخمول في المعاملة | تبدأ.
| 6 | 26211 | tuser | psql | tdb1 | 2019-09-02 19: 38: 54 | 00: 00: 08 | الخمول في المعاملة | قفل الجدول wafer_data.
| 7 | 26211 | tuser | psql | tdb1 | 2019-09-02 19: 39: 08 | 00: 42: 42 | الخمول | الالتزام.
| 8 | 26211 | tuser | psql | tdb1 | 2019-09-03 07: 12: 07 | 00: 00: 52 | نشط | حدد test_del () ؛
التنمية.
الاستعلامات الأساسية المبينة والتقارير المستلمة تبسط الحياة بالفعل عند تحليل حوادث الأداء.
استنادًا إلى الاستعلامات الأساسية ، يمكنك الحصول على تقرير يذكرك تقريباً بـ Oracle AWR.
تقرير ملخص العينة + ------------------------------------------------- -----------------------------------
| التقرير الموحد للنشاط والانتظار. التاريخ: 09/03/2019 14:08
| ------------------------------------------------- -----------------------------------
| المضيف: XXXX
| BEGIN_SNAPSHOT: 09/02/2019 14:08 END_SNAPSHOT: 09/03/2019 14:00
| ------------------------------------------------- -----------------------------------
| حجم قاعدة البيانات الحالية:
| قاعدة البيانات: الشاشة
| الحجم (MB): 1370.00
| ------------------------------------------------- -----------------------------------
| الكتلة وحدة المعالجة المركزية الوقت: 19:44:22
| وقت انتظار المجموعة: 78:49:16
|
| SQL DBTIME: 65:53:09
| مزود وحدة المعالجة المركزية الوقت: 19:05:21
| وقت انتظار SQL: 21:50:46
| SQL IOTIME: 20:53:00
| SQL قراءة الوقت: 20:52:55
| وقت كتابة SQL: 00:00:05
|
| مكالمات SQL: 311293
-------------------------------------------------- -----------
| تقرأ كتل SQL المشتركة: 13351563334
| كتل حصة SQL: 2775427045
| كتل SQL المشتركة ضرب / قراءة٪: 20.79
| كتل SQL المشتركة: 21105
| تمت مشاركة كتل SQL المكتوبة: 3656
|
| كتل SQL المؤقتة تقرأ: 7464932
| كتب SQL المؤقتة: 10176024
-------------------------------------------------- -----------
|
| إحصائيات الانتظار
|
+ ------------------------------------------------- -----------------------------------
| أفضل 10 عمليات انتظار حسب إجمالي وقت الانتظار لعمليات النظام
+ ----- + ------------------------------ + ------------ -------- + --------------------
| # | wait_event_type | wait_event | مدة
+ ----- + ------------------------------ + ------------ -------- + --------------------
| 1 | النشاط | LogicalLauncherMain | 11:21:01
| 2 | النشاط | CheckpointerMain | 11:20:35
| 3 | النشاط | AutoV VacuumMain | 11:20:31
| 4 | النشاط | والوريترمان | 11:19:35
| 5 | النشاط | BgWriterMain | 10:14:19
| 6 | النشاط | BgWriterHibernate | 1:06:04
| 7 | النشاط | WalSenderMain | 0:04:05
| 8 | العميل | ClientWrite | 0:04:00
| 9 | IO | BufFileWrite | 0:02:45
| 10 | LWLock | العازلة | 0:02:14
+ ----- + ------------------------------ + ------------ -------- + --------------------
| أفضل 10 عمليات انتظار حسب إجمالي وقت الانتظار لعمليات العملاء
+ ----- + ------------------------------ + ------------ -------- + -------------------- + ----------
| # | wait_event_type | wait_event | المدة | ٪ dbtime
+ ----- + ------------------------------ + ------------ -------- + -------------------- + ----------
| 1 | قفل | معاملة | 11: 55: 37 | 18.1
| 2 | IO | DataFileRead | 07: 19: 43 | 11.12
| 3 | العميل | ClientRead | 00: 46: 54 | 1.19
| 4 | قفل | العلاقة | 00: 40: 37 | 1.03
| 5 | LWLock | العازلة | 00: 31: 08 | 0.79
| 6 | LWLock | buffer_io | 00: 22: 12 | 0.56
| 7 | مهلة | PgSleep | 00: 10: 58 | 0.28
| 8 | قفل | tuple | 00: 01: 30 | 0.04
| 9 | IO | BufFileWrite | 00: 01: 16 | 0.03
| 10 | IO | BufFileRead | 00: 00: 37 | 0.02
+ ----- + ------------------------------ + ------------ -------- + -------------------- + ----------
| أنواع الانتظار بوقت الانتظار الكلي ، لعمليات النظام
+ ----- + ------------------------------ + ------------ --------
| # | wait_event_type | مدة
+ ----- + ------------------------------ + ------------ --------
| 1 | النشاط | 56:46:10
| 2 | IO | 0:05:13
| 3 | العميل | 0:04:00
| 4 | LWLock | 0:03:07
+ ----- + ------------------------------ + ------------ --------
| أنواع الانتظار في إجمالي وقت الانتظار ، لعمليات العملاء
+ ----- + ------------------------------ + ------------ -------- + --------------------
| # | wait_event_type | المدة | ٪ dbtime
+ ----- + ------------------------------ + ------------ -------- + --------------------
| 1 | قفل | 12: 37: 44 | 19.17
| 2 | IO | 07: 21: 40 | 11.17
| 3 | LWLock | 00: 53: 26 | 1.35
| 4 | العميل | 00: 46: 54 | 1.19
| 5 | مهلة | 00: 10: 58 | 0.28
| 6 | IPC | 00: 00: 04 | 0
+ ----- + ------------------------------ + ------------ -------- + --------------------
| في انتظار عمليات النظام
+ ----- + ----------------------------- + ---------- + - ------------------ + ---------------------- + -------- ------------
| # | backend_type | dbname | wait_event_type | wait_event | مدة
+ ----- + ----------------------------- + ---------- + - ------------------ + ---------------------- + -------- ------------
| 1 | قاذفة النسخ المتماثل المنطقي | | النشاط | LogicalLauncherMain | 11:21:01
| 2 | checkpointer | | النشاط | CheckpointerMain | 11:20:35
| 3 | قاذفة autov Vacuum | | النشاط | AutoV VacuumMain | 11:20:31
| 4 | كاتب الخط | | النشاط | والوريترمان | 11:19:35
| 5 | كاتب الخلفية | | النشاط | BgWriterMain | 10:14:19
| 6 | كاتب الخلفية | | النشاط | BgWriterHibernate | 1:06:04
| 7 | walsender | | النشاط | WalSenderMain | 0:04:05
| 8 | walsender | | العميل | ClientWrite | 0:04:00
| 9 | عامل مواز | tdb1 | IO | BufFileWrite | 0:02:45
| 10 | عامل مواز | tdb1 | LWLock | العازلة | 0:02:05
| 11 | عامل مواز | tdb1 | IO | DataFileRead | 0:01:10
| 12 | عامل مواز | tdb1 | IO | BufFileRead | 0:01:05
| 13 | عامل مواز | tdb1 | LWLock | buffer_io | 0:00:45
| 14 | عامل فراغ تلقائي | tdb1 | LWLock | العازلة | 0:00:09
| 15 | كاتب الخط | | IO | الكتابة | 0:00:08
| 16 | كاتب الخط | | LWLock | WALWriteLock | 0:00:04
| 17 | كاتب الخلفية | | LWLock | WALWriteLock | 0:00:03
| 18 | كاتب الخلفية | | IO | الكتابة | 0:00:02
| 19 | كاتب الخلفية | | IO | DataFileWrite | 0:00:02
| 20 | checkpointer | | IO | ControlFileSyncUpdate | 0:00:01
| 21 | عامل فراغ تلقائي | tdb1 | LWLock | buffer_io | 0:00:01
+ ----- + ----------------------------- + ---------- + - ------------------ + ---------------------- + -------- ------------
| في انتظار SQL
+ ----- + ------------------------- + ---------- + ------ -------------- + -------------------- + -------------- ------ + ----------
| # | queryid | dbname | wait_event_type | wait_event | المدة | ٪ dbtime
+ ----- + ------------------------- + ---------- + ------ -------------- + -------------------- + -------------- ------ + ----------
| 1 | 389015618226997618 | tdb1 | قفل | معاملة | 09: 47: 43 | 14.87
| 2 | 389015618226997618 | tdb1 | IO | DataFileRead | 05: 47: 07 | 8.78
| 3 | | tdb1 | قفل | معاملة | 02: 07: 54 | 3.24
| 4 | | tdb1 | IO | DataFileRead | 01: 30: 24 | 2.29
| 5 | 8085340880788646241 | tdb1 | العميل | ClientRead | 00: 40: 20 | 1.02
| 6 | 389015618226997618 | tdb1 | LWLock | العازلة | 00: 20: 41 | 0.52
| 7 | 389015618226997618 | tdb1 | LWLock | buffer_io | 00: 17: 30 | 0.44
| 8 | 2649515222348904837 | tdb1 | مهلة | PgSleep | 00: 10: 58 | 0.28
| 9 | 4710212362688288619 | tdb1 | قفل | العلاقة | 00: 10: 44 | 0.27
| 10 | 9150846928388977274 | tdb1 | قفل | العلاقة | 00: 10: 24 | 0.26
| 11 | 28942442626229688 | tdb1 | قفل | العلاقة | 00: 07: 48 | 0.2
| 12 | 1237430309438971376 | tdb1 | قفل | العلاقة | 00: 07: 32 | 0.19
| 13 | | tdb1 | LWLock | العازلة | 00: 04: 32 | 0.11
| 14 | | tdb1 | LWLock | buffer_io | 00: 04: 13 | 0.11
| 15 | | tdb1 | العميل | ClientRead | 00: 03: 57 | 0.1
| 16 | 4710212362688288619 | tdb1 | LWLock | العازلة | 00: 02: 26 | 0.06
| 17 | 3167065002719415275 | tdb1 | قفل | العلاقة | 00: 02: 20 | 0.06
| 18 | 5731212217001535134 | tdb1 | العميل | ClientRead | 00: 01: 53 | 0.05
| 19 | 1237430309438971376 | tdb1 | LWLock | العازلة | 00: 01: 42 | 0.04
| 20 | 389015618226997618 | tdb1 | قفل | tuple | 00: 01: 30 | 0.04
| 21 | 8304755792398128062 | tdb1 | قفل | العلاقة | 00: 01: 29 | 0.04
| 22 | 28942442626229688 | tdb1 | IO | BufFileWrite | 00: 01: 16 | 0.03
| 23 | 9150846928388977274 | tdb1 | IO | DataFileRead | 00: 01: 07 | 0.03
| 24 | 28942442626229688 | tdb1 | LWLock | العازلة | 00: 01: 03 | 0.03
| 25 | 9150846928388977274 | tdb1 | LWLock | العازلة | 00: 00: 44 | 0.02
| 26 | 28942442626229688 | tdb1 | IO | BufFileRead | 00: 00: 37 | 0.02
| 27 | 28942442626229688 | tdb1 | LWLock | buffer_io | 00: 00: 25 | 0.01
| 28 | 1237430309438971376 | tdb1 | IO | DataFileRead | 00: 00: 24 | 0.01
| 29 | 28942442626229688 | tdb1 | IO | DataFileRead | 00: 00: 22 | 0.01
| 30 | 5731212217001535134 | tdb1 | قفل | العلاقة | 00: 00: 20 | 0.01
| 31 | 4710212362688288619 | tdb1 | IO | DataFileRead | 00: 00: 19 | 0.01
| 32 | 9150846928388977274 | tdb1 | العميل | ClientRead | 00: 00: 09 | 0
| 33 | 3422818749220588372 | tdb1 | العميل | ClientRead | 00: 00: 08 | 0
| 34 | 1237430309438971376 | tdb1 | العميل | ClientRead | 00: 00: 06 | 0
| 35 | 389015618226997618 | tdb1 | LWLock | المخزن المؤقت | 00: 00: 05 | 0
| 36 | 4710212362688288619 | tdb1 | العميل | ClientRead | 00: 00: 05 | 0
| 37 | 4710212362688288619 | tdb1 | LWLock | buffer_io | 00: 00: 04 | 0
| 38 | 28942442626229688 | tdb1 | العميل | ClientRead | 00: 00: 04 | 0
| 39 | 28942442626229688 | tdb1 | IPC | ParallelFinish | 00: 00: 03 | 0
| 40 | 389015618226997618 | tdb1 | IO | DataFileWrite | 00: 00: 02 | 0
| 41 | -5730801771815999400 | tdb1 | العميل | ClientRead | 00: 00: 02 | 0
| 42 | 2404820632950544954 | tdb1 | العميل | ClientRead | 00: 00: 02 | 0
| 43 | -6572922443698419129 | tdb1 | العميل | ClientRead | 00: 00: 02 | 0
| 44 | 8304755792398128062 | tdb1 | العميل | ClientRead | 00: 00: 02 | 0
| 45 | -1473395109729441239 | tdb1 | العميل | ClientRead | 00: 00: 02 | 0
| 46 | | tdb1 | LWLock | المخزن المؤقت | 00: 00: 01 | 0
| 47 | 180077086776069052 | tdb1 | العميل | ClientRead | 00: 00: 01 | 0
| 48 | | tdb1 | IO | DataFileWrite | 00: 00: 01 | 0
| 49 | 28942442626229688 | tdb1 | IPC | MessageQueueReceive | 00: 00: 01 | 0
| 50 | 2369289265278398647 | tdb1 | العميل | ClientRead | 00: 00: 01 | 0
| 51 | 9150846928388977274 | tdb1 | IO | DataFileWrite | 00: 00: 01 | 0
+ ----- + ------------------------- + ---------- + ------ -------------- + -------------------- + -------------- ------ + ----------
|
| إحصائيات SQL العميل
|
+ ------------------------------------------------- -----------------------------------
| عميل SQL مرتبة حسب الوقت المنقضي
+ -------------------- + ---------- + ---------- + ------ ---- + ---------- + ---------- + --------------------
| الوقت المنقضي | مكالمات | ٪ dbtime | ٪ وحدة المعالجة المركزية | ٪ IO | dbname | queryid
+ -------------------- + ---------- + ---------- + ------ ---- + ---------- + ---------- + --------------------
| 06: 43: 19 | 36 | 10.2 | 85 سبتمبر 17.38 | tdb1 | 389015618226997618
| 02: 06: 53 | 715 | 3.21 | 0.85 | 0.06 | tdb1 | 1237430309438971376
| 01: 52: 07 | 720 | 2.84 | 1.19 | 0.08 | tdb1 | 4710212362688288619
| 00: 39: 03 | 357 | 0.99 | 1.02 | 0.33 | tdb1 | 28942442626229688
| 00: 22: 00 | 8 | 0.56 | 0.96 | 0 | tdb1 | 2649515222348904837
+ -------------------- + ---------- + ---------- + ------ ---- + ---------- + ---------- + --------------------
| عميل SQL مرتبة حسب وقت وحدة المعالجة المركزية
+ -------------------- + ---------- + ---------- + ------ ---- + ---------- + ---------- + ---------- + ------------ --------
| وقت وحدة المعالجة المركزية | مكالمات | ٪ dbtime | total_time | ٪ وحدة المعالجة المركزية | ٪ IO | dbname | queryid
+ -------------------- + ---------- + ---------- + ------ ---- + ---------- + ---------- + ---------- + ------------ --------
| 16: 14: 38 | 36 | 10.2 | 06: 43: 19 | 85 سبتمبر 17.38 | tdb1 | 389015618226997618
| 00: 13: 38 | 720 | 2.84 | 01: 52: 07 | 1.19 | 0.08 | tdb1 | 4710212362688288619
| 00: 11: 39 | 357 | 0.99 | 00: 39: 03 | 1.02 | 0.33 | tdb1 | 28942442626229688
| 00: 10: 58 | 8 | 0.56 | 00: 22: 00 | 0.96 | 0 | tdb1 | 2649515222348904837
| 00: 09: 44 | 715 | 3.21 | 02: 06: 53 | 0.85 | 0.06 | tdb1 | 1237430309438971376
+ -------------------- + ---------- + ---------- + ------ ---- + ---------- + ---------- + ---------- + ------------ --------
| عميل SQL مرتبة حسب المستخدم I / O وقت الانتظار
+ -------------------- + ---------- + ---------- + ------ ---- + ---------- + ---------- + ---------- + ------------ --------
| وقت io_wait | مكالمات | ٪ dbtime | total_time | ٪ وحدة المعالجة المركزية | ٪ IO | dbname | queryid
+ -------------------- + ---------- + ---------- + ------ ---- + ---------- + ---------- + ---------- + ------------ --------
| 05: 47: 09 | 36 | 10.2 | 06: 43: 19 | 85 سبتمبر 17.38 | tdb1 | 389015618226997618
| 00: 02: 15 | 357 | 0.99 | 00: 39: 03 | 1.02 | 0.33 | tdb1 | 28942442626229688
| 00: 00: 24 | 715 | 3.21 | 02: 06: 53 | 0.85 | 0.06 | tdb1 | 1237430309438971376
| 00: 00: 19 | 720 | 2.84 | 01: 52: 07 | 1.19 | 0.08 | tdb1 | 4710212362688288619
| 00: 00: 00 | 8 | 0.56 | 00: 22: 00 | 0.96 | 0 | tdb1 | 2649515222348904837
+ -------------------- + ---------- + ---------- + ------ ---- + ---------- + ---------- + ---------- + ------------ --------
| عميل SQL مرتبة حسب قراءات المخازن المؤقتة المشتركة
+ -------------------- + ---------- + ---------- + ------ ---- + ---------- + ---------- + ---------- + ------------ --------
| يقرأ مخازن | مكالمات | ٪ dbtime | total_time | ٪ وحدة المعالجة المركزية | ٪ IO | dbname | queryid
+ -------------------- + ---------- + ---------- + ------ ---- + ---------- + ---------- + ---------- + ------------ --------
| 2562353244 | 36 | 10.2 | 06: 43: 19 | 85 سبتمبر 17.38 | tdb1 | 389015618226997618
| 11041689 | 357 | 0.99 | 00: 39: 03 | 1.02 | 0.33 | tdb1 | 28942442626229688
| 3303551 | 715 | 3.21 | 02: 06: 53 | 0.85 | 0.06 | tdb1 | 1237430309438971376
| 3242892 | 720 | 2.84 | 01: 52: 07 | 1.19 | 0.08 | tdb1 | 4710212362688288619
| 0 | 8 | 0.56 | 00: 22: 00 | 0.96 | 0 | tdb1 | 2649515222348904837
+ -------------------- + ---------- + ---------- + ------ ---- + ---------- + ---------- + ---------- + ------------ --------
| عميل SQL مرتبة حسب القرص يقرأ الوقت
+ -------------------- + ---------- + ---------- + ------ ---- + ---------- + ---------- + ---------- + ------------ --------
| قراءة الوقت | مكالمات | ٪ dbtime | total_time | ٪ وحدة المعالجة المركزية | ٪ IO | dbname | queryid
+ -------------------- + ---------- + ---------- + ------ ---- + ---------- + ---------- + ---------- + ------------ --------
| 03: 37: 46 | 36 | 10.2 | 06: 43: 19 | 85 سبتمبر 17.38 | tdb1 | 389015618226997618
| 00: 04: 07 | 357 | 0.99 | 00: 39: 03 | 1.02 | 0.33 | tdb1 | 28942442626229688
| 00: 00: 59 | 720 | 2.84 | 01: 52: 07 | 1.19 | 0.08 | tdb1 | 4710212362688288619
| 00: 00: 42 | 715 | 3.21 | 02: 06: 53 | 0.85 | 0.06 | tdb1 | 1237430309438971376
| 00: 00: 00 | 8 | 0.56 | 00: 22: 00 | 0.96 | 0 | tdb1 | 2649515222348904837
+ -------------------- + ---------- + ---------- + ------ ---- + ---------- + ---------- + ---------- + ------------ --------
| عميل SQL مرتبة حسب عمليات الإعدام
+ -------------------- + ---------- + ---------- + ------ ---- + ---------- + ---------- + ---------- + ------------ --------
| مكالمات | الصفوف | ٪ dbtime | total_time | ٪ وحدة المعالجة المركزية | ٪ IO | dbname | queryid
+ -------------------- + ---------- + ---------- + ------ ---- + ---------- + ---------- + ---------- + ------------ --------
| 720 | 720 | 2.84 | 01: 52: 07 | 1.19 | 0.08 | tdb1 | 4710212362688288619
| 715 | 715 | 3.21 | 02: 06: 53 | 0.85 | 0.06 | tdb1 | 1237430309438971376
| 357 | 0 | 0.99 | 00: 39: 03 | 1.02 | 0.33 | tdb1 | 28942442626229688
| 36 | 36 | 10.2 | 06: 43: 19 | 85 سبتمبر 17.38 | tdb1 | 389015618226997618
| 8 | 8 | 0.56 | 00: 22: 00 | 0.96 | 0 | tdb1 | 2649515222348904837
+ -------------------- + ---------- + ---------- + ------ ---- + ---------- + ---------- + ---------- + ------------ --------
| قائمة كاملة من نص SQL
----------------------------------------------
...
أن تستمر. الخطوة التالية هي تكوين سجل القفل (pg_stat_locks) ، وهو وصف أكثر تفصيلاً لعملية ملء الجداول.