F.35. pg_walinspect â пÑоÑмоÑÑ Ð¶ÑÑнала пÑедзапиÑи на низком ÑÑовне #
ÐодÑÐ»Ñ pg_walinspect пÑедоÑÑавлÑÐµÑ SQL-ÑÑнкÑии Ð´Ð»Ñ Ð¿ÑоÑмоÑÑа жÑÑнала пÑедзапиÑи на низком ÑÑовне. Ðн ÑабоÑÐ°ÐµÑ Ñ Ð·Ð°Ð¿ÑÑеннÑм клаÑÑеÑом баз даннÑÑ
PostgreSQL и Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½ Ð´Ð»Ñ Ñелей оÑладки, анализа, оÑÑÑÑноÑÑи или обÑÑениÑ. ÐодÑÐ»Ñ Ð¿Ð¾Ñ
ож на pg_waldump, но ÑабоÑÐ°ÐµÑ ÑеÑез SQL, а не как оÑделÑÐ½Ð°Ñ ÑÑилиÑа.
ÐÑе ÑÑнкÑии ÑÑого модÑÐ»Ñ Ð²ÑдаÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¸Ð· WAL, оÑноÑÑÑÑÑÑÑ Ðº ÑекÑÑей линии вÑемени ÑеÑвеÑа.
ÐÑимеÑание
ФÑнкÑии pg_walinspect заÑаÑÑÑÑ Ð²ÑзÑваÑÑÑÑ Ñ Ð°ÑгÑменÑом LSN, коÑоÑÑй задаÑÑ Ð½Ð°Ñало инÑеÑеÑÑÑÑей запиÑи WAL. Тем не менее некоÑоÑÑе ÑÑнкÑии, напÑÐ¸Ð¼ÐµÑ pg_logical_emit_message, возвÑаÑаÑÑ LSN поÑле ÑолÑко ÑÑо добавленной запиÑи.
ÐодÑказка
ÐÑе ÑÑнкÑии pg_walinspect, коÑоÑÑе показÑваÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ запиÑÑÑ
, попадаÑÑиÑ
в опÑеделÑннÑй диапазон знаÑений LSN, могÑÑ Ð¿ÑинимаÑÑ ÐºÐ¾Ð½ÐµÑнÑе_lsn поÑле ÑекÑÑего LSN ÑеÑвеÑа. ÐÑи иÑполÑзовании конеÑного_lsn «из бÑдÑÑего» оÑибки не возникнеÑ.
ÐÐ¾Ð¶ÐµÑ Ð±ÑÑÑ ÑдобнÑм ÑказаÑÑ Ð·Ð½Ð°Ñение FFFFFFFF/FFFFFFFF (макÑималÑно допÑÑÑимое знаÑение pg_lsn) в каÑеÑÑве аÑгÑменÑа конеÑного_lsn. ÐÑо аналогиÑно ваÑианÑÑ ÑказаÑÑ ÐºÐ¾Ð½ÐµÑнÑй_lsn, ÑовпадаÑÑий Ñ ÑекÑÑим LSN ÑеÑвеÑа.
Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ÑполÑзоваÑÑ ÑÑи ÑÑнкÑии ÑазÑеÑено ÑолÑко ÑÑпеÑполÑзоваÑелÑм и ÑолÑм, вклÑÑÑннÑм в ÑÐ¾Ð»Ñ pg_read_server_files. СÑпеÑполÑзоваÑÐµÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ Ð´Ð°ÑÑ Ð´Ð¾ÑÑÑп дÑÑгим, воÑполÑзовавÑиÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ GRANT.
F.35.1. ФÑнкÑии обÑего назнаÑÐµÐ½Ð¸Ñ #
-
pg_get_wal_record_info(in_lsn pg_lsn) returns record# ÐолÑÑÐ°ÐµÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ запиÑи WAL, коÑоÑÐ°Ñ ÑаÑположена по
заданномÑ_lsnили поÑле него. ÐапÑимеÑ:postgres=# SELECT * FROM pg_get_wal_record_info('0/E419E28'); -[ RECORD 1 ]----+------------------------------------------------- start_lsn | 0/E419E28 end_lsn | 0/E419E68 prev_lsn | 0/E419D78 xid | 0 resource_manager | Heap2 record_type | VACUUM record_length | 58 main_data_length | 2 fpi_length | 0 description | nunused: 5, unused: [1, 2, 3, 4, 5] block_ref | blkref #0: rel 1663/16385/1249 fork main blk 364ÐÑли
заданнÑй_lsnне Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð² наÑале запиÑи WAL, бÑÐ´ÐµÑ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð° инÑоÑмаÑÐ¸Ñ Ð¾ ÑледÑÑÑей коÑÑекÑной запиÑи WAL. ÐÑли Ñакой запиÑи WAL неÑ, ÑÑнкÑÐ¸Ñ Ð²ÑдаÑÑ Ð¾ÑибкÑ.-
pg_get_wal_records_info(start_lsn pg_lsn, end_lsn pg_lsn) returns setof record# ÐолÑÑÐ°ÐµÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ð±Ð¾ вÑÐµÑ ÐºÐ¾ÑÑекÑнÑÑ Ð·Ð°Ð¿Ð¸ÑÑÑ WAL междÑ
наÑалÑнÑм_lsnиконеÑнÑм_lsn. ÐозвÑаÑÐ°ÐµÑ Ð¾Ð´Ð½Ñ ÑÑÑÐ¾ÐºÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ запиÑи WAL. ÐÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÑнкÑии:postgres=# SELECT * FROM pg_get_wal_records_info('0/1E913618', '0/1E913740') LIMIT 1; -[ RECORD 1 ]----+-------------------------------------------------------------- start_lsn | 0/1E913618 end_lsn | 0/1E913650 prev_lsn | 0/1E9135A0 xid | 0 resource_manager | Standby record_type | RUNNING_XACTS record_length | 50 main_data_length | 24 fpi_length | 0 description | nextXid 33775 latestCompletedXid 33774 oldestRunningXid 33775 block_ref |ФÑнкÑÐ¸Ñ Ð²ÑдаÑÑ Ð¾ÑибкÑ, еÑли
наÑалÑнÑй_lsnнедоÑÑÑпен.-
pg_get_wal_block_info(start_lsn pg_lsn, end_lsn pg_lsn, show_data boolean DEFAULT true) returns setof record# ÐолÑÑÐ°ÐµÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ каждой ÑÑÑлке на блок из вÑÐµÑ ÐºÐ¾ÑÑекÑнÑÑ Ð·Ð°Ð¿Ð¸Ñей WAL междÑ
наÑалÑнÑм_lsnиконеÑнÑм_lsnÑ Ð¾Ð´Ð½Ð¾Ð¹ или более ÑÑÑлок на блок. ÐозвÑаÑÐ°ÐµÑ Ð¾Ð´Ð½Ñ ÑÑÑÐ¾ÐºÑ Ð´Ð»Ñ ÑÑÑлки на блок Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ запиÑи WAL. ÐапÑимеÑ:postgres=# SELECT * FROM pg_get_wal_block_info('0/1230278', '0/12302B8'); -[ RECORD 1 ]-----+----------------------------------- start_lsn | 0/1230278 end_lsn | 0/12302B8 prev_lsn | 0/122FD40 block_id | 0 reltablespace | 1663 reldatabase | 1 relfilenode | 2658 relforknumber | 0 relblocknumber | 11 xid | 341 resource_manager | Btree record_type | INSERT_LEAF record_length | 64 main_data_length | 2 block_data_length | 16 block_fpi_length | 0 block_fpi_info | description | off: 46 block_data | \x00002a00070010402630000070696400 block_fpi_data |Ð ÑÑом пÑимеÑе ÑаÑÑмоÑÑена запиÑÑ WAL, ÑодеÑжаÑÐ°Ñ ÑолÑко Ð¾Ð´Ð½Ñ ÑÑÑÐ»ÐºÑ Ð½Ð° блок, однако во Ð¼Ð½Ð¾Ð³Ð¸Ñ Ð·Ð°Ð¿Ð¸ÑÑÑ WAL ÑÐ°ÐºÐ¸Ñ ÑÑÑлок неÑколÑко. СÑÑоки, возвÑаÑаемÑе ÑÑнкÑией
pg_get_wal_block_info, бÑдÑÑ Ð³Ð°ÑанÑиÑованно имеÑÑ ÑникалÑнÑÑ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°ÑиÑнаÑалÑного_lsnиid_блока.ÐолÑÑÐ°Ñ ÑаÑÑÑ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¹ здеÑÑ Ð¸Ð½ÑоÑмаÑии ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ Ð²Ñводом ÑÑнкÑии
pg_get_wal_records_info, пÑи ÑÑловии пеÑедаÑи одинаковÑÑ Ð°ÑгÑменÑов. Ðднакоpg_get_wal_block_infoвÑÐ²Ð¾Ð´Ð¸Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¸Ð· каждой запиÑи WAL в ÑаÑÑиÑенном виде, добавлÑÑ Ð² вÑвод по одной ÑÑÑоке Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑлки на блок, поÑÑÐ¾Ð¼Ñ Ð½ÐµÐºÐ¾ÑоÑÑе деÑали оÑÑлеживаÑÑÑÑ Ð½Ð° ÑÑовне ÑÑÑлки на блок, а не на ÑÑовне Ñелой запиÑи. Ð¢Ð°ÐºÐ°Ñ ÑÑÑÑкÑÑÑа полезна пÑи ÑабоÑе Ñ Ð·Ð°Ð¿ÑоÑами, коÑоÑÑе оÑÑлеживаÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ оÑделÑнÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð² Ñ ÑеÑением вÑемени. ÐбÑаÑиÑе внимание, ÑÑо Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñей без ÑÑÑлок на блоки (напÑимеÑ, запиÑи WAL длÑCOMMIT), ÑÑÑоки возвÑаÑаÑÑÑÑ Ð½Ðµ бÑдÑÑ, поÑÑÐ¾Ð¼Ñ ÑÑнкÑиÑpg_get_wal_block_infoдейÑÑвиÑелÑно Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ Ð¼ÐµÐ½ÑÑе ÑÑÑок, Ñем ÑÑнкÑиÑpg_get_wal_records_info.ÐаÑамеÑÑÑ
reltablespace,reldatabaseиrelfilenodeÑÑÑлаÑÑÑÑ Ð½Ð°pg_tablespace.oid,pg_database.oidиpg_class.relfilenodeÑооÑвеÑÑÑвенно. ÐолеrelforknumberобознаÑÐ°ÐµÑ Ð½Ð¾Ð¼ÐµÑ ÑÐ»Ð¾Ñ Ð² оÑноÑении Ð´Ð»Ñ ÑÑÑлки на блок (за подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðºcommon/relpath.h).ÐодÑказка
ФÑнкÑиÑ
pg_filenode_relation(Ñм. ТаблиÑÑ 9.101) позволÑÐµÑ Ð¾Ð¿ÑеделиÑÑ, какое оÑноÑение бÑло изменено пеÑвонаÑалÑно.ÐлиенÑÑ Ð¼Ð¾Ð³ÑÑ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð¸Ð·Ð´ÐµÑжек маÑеÑиализаÑии даннÑÑ Ð±Ð»Ð¾ÐºÐ°, ÑÑо Ð¼Ð¾Ð¶ÐµÑ ÑÑÑеÑÑвенно ÑÑкоÑиÑÑ Ð²Ñполнение ÑÑнкÑии. Ðогда длÑ
show_dataзадано знаÑениеfalse, знаÑениÑblock_dataиblock_fpi_dataопÑÑкаÑÑÑÑ (Ñо еÑÑÑ Ð²ÑÑ Ð¾Ð´Ð½Ñе аÑгÑменÑÑblock_dataиblock_fpi_dataпÑинимаÑÑ Ð·Ð½Ð°ÑениеNULLÐ´Ð»Ñ Ð²ÑÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаемÑÑ ÑÑÑок). ÐÑевидно, ÑÑо Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð°Ñ Ð¾Ð¿ÑимизаÑÐ¸Ñ Ð¾ÑÑÑеÑÑвима ÑолÑко Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов, коÑоÑÑм на Ñамом деле не ÑÑебÑÑÑÑÑ Ð´Ð°Ð½Ð½Ñе блоков.ФÑнкÑÐ¸Ñ Ð²ÑдаÑÑ Ð¾ÑибкÑ, еÑли
наÑалÑнÑй_lsnнедоÑÑÑпен.-
pg_get_wal_stats(start_lsn pg_lsn, end_lsn pg_lsn, per_record boolean DEFAULT false) returns setof record# ÐÑдаÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð¿Ð¾ вÑем коÑÑекÑнÑм запиÑÑм WAL междÑ
наÑалÑнÑм_lsnиконеÑнÑм_lsn. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð¾Ð´Ð½Ñ ÑÑÑÐ¾ÐºÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑипаменеджеÑа_ÑеÑÑÑÑов(resource_manager). Ðогдапо_ÑипÑ_запиÑÐ¸Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñениеtrue, Ñо возвÑаÑÐ°ÐµÑ Ð¾ÑделÑнÑе ÑÑÑоки Ð´Ð»Ñ ÑазнÑÑÑипов_запиÑей(record_type). ÐÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÑнкÑии:postgres=# SELECT * FROM pg_get_wal_stats('0/1E847D00', '0/1E84F500') WHERE count > 0 AND "resource_manager/record_type" = 'Transaction'; LIMIT 1; -[ RECORD 1 ]----------------+------------------- resource_manager/record_type | Transaction count | 2 count_percentage | 8 record_size | 875 record_size_percentage | 41.23468426013195 fpi_size | 0 fpi_size_percentage | 0 combined_size | 875 combined_size_percentage | 2.8634072910530795ФÑнкÑÐ¸Ñ Ð²ÑдаÑÑ Ð¾ÑибкÑ, еÑли
наÑалÑнÑй_lsnнедоÑÑÑпен.
F.35.2. ÐвÑÐ¾Ñ #
ÐÑ
аÑÐ°Ñ Ð ÑпиÑедди (Bharath Rupireddy) <[email protected]>