PostgreSQL ืึทืงื˜ื™ื•ื• ืกืขืกื™ืข ื’ืขืฉื™ื›ื˜ืข - ื ื™ื™ึท ืคึผื’ืกื ื˜ื™ื ืขืœ ืคืึทืจืœืขื ื’ืขืจื•ื ื’

ืคื™ืจืžืข pgsentinel ื‘ืืคืจื™ื™ื˜ ื“ื™ pgsentinel ืคืึทืจืœืขื ื’ืขืจื•ื ื’ ืคื•ืŸ ื“ื™ ื–ืขืœื‘ืข ื ืึธืžืขืŸ (ื’ื™ื˜ื”ื•ื‘ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™), ื•ื•ืึธืก ืžื•ืกื™ืฃ ื“ื™ pg_active_session_history ืžื™ื™ื ื•ื ื’ ืฆื• PostgreSQL - ื“ื™ ื’ืขืฉื™ื›ื˜ืข ืคื•ืŸ โ€‹โ€‹ืึทืงื˜ื™ื•ื• ืกืขืฉืึทื ื– (ืขื ืœืขืš ืฆื• Oracle's v$active_session_history).

ื™ืกืขื ืฉืึทืœื™, ื“ืึธืก ื–ืขื ืขืŸ ืคืฉื•ื˜ ืจื’ืข-ื“ื•ืจืš-ืกืขืงื•ื ื“ืข ืกื ืึทืคึผืฉืึทืฅ ืคื•ืŸ pg_stat_activity, ืึธื‘ืขืจ ืขืก ื–ืขื ืขืŸ ื•ื•ื™ื›ื˜ื™ืง ืคื•ื ืงื˜ืŸ:

  1. ืึทืœืข ืึทืงื™ื•ืžื™ืึทืœื™ื™ื˜ื™ื“ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืื™ื– ืกื˜ืึธืจื“ ื‘ืœื•ื™ื– ืื™ืŸ ื‘ืึทืจืึทืŸ, ืื•ืŸ ื“ื™ ืงืึทื ืกื•ืžื“ ืกื•ืžืข ืคื•ืŸ โ€‹โ€‹ื–ื›ึผืจื•ืŸ ืื™ื– ืจืขื’ื™ืึทืœื™ื™ื˜ืึทื“ ื“ื•ืจืš ื“ื™ ื ื•ืžืขืจ ืคื•ืŸ ืœืขืฆื˜ืข ืกื˜ืึธืจื“ ืจืขืงืึธืจื“ืก.
  2. ื“ื™ queryid ืคืขืœื“ ืื™ื– ืฆื•ื’ืขื’ืขื‘ืŸ - ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ queryid ืคึฟื•ืŸ ื“ื™ pg_stat_statements ืคืึทืจืœืขื ื’ืขืจื•ื ื’ (ืคืึทืจ-ื™ื ืกื˜ืึทืœื™ืจื•ื ื’ ืคืืจืœืื ื’ื˜).
  3. ื“ื™ top_level_query ืคืขืœื“ ืื™ื– ืฆื•ื’ืขื’ืขื‘ืŸ - ื“ืขืจ ื˜ืขืงืกื˜ ืคื•ืŸ ื“ื™ ืึธื ืคึฟืจืขื’ ืคึฟื•ืŸ ื•ื•ืึธืก ื“ื™ ืงืจืึทื ื˜ ืึธื ืคึฟืจืขื’ ืื™ื– ื’ืขืจื•ืคืŸ (ืื•ื™ื‘ ื ื™ืฆืŸ pl/pgsql)


ื’ืึทื ืฅ ืจืฉื™ืžื” ืคื•ืŸ pg_active_session_history ืคืขืœื“ืขืจ:

      ื–ื™ื™ึทืœ | ื˜ื™ืคึผ ------------------+------------------------- ืึทืฉ_ื˜ื™ื™ื | ืฆื™ื™ื˜ ืฉื˜ืขืžืคึผืœ ืžื™ื˜ ืฆื™ื™ื˜ ื–ืึธื ืข ื“ืึทื˜ื™ื“ | oid ื“ืึทื˜ืขื ืึทืžืข | ื˜ืขืงืกื˜ ืคึผื™ื“ | ื™ื ื˜ืึทื“ื–ืฉืขืจ ื ื•ืฆืŸ | oid usename | ื˜ืขืงืกื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ_ื ืึธืžืขืŸ | ื˜ืขืงืกื˜ client_addr | ื˜ืขืงืกื˜ ืงืœื™ืขื ื˜_ื”ืึธืกื˜ื ืึทืžืข | ื˜ืขืงืกื˜ ืงืœื™ืขื ื˜_ืคึผืึธืจื˜ | ื™ื ื˜ืึทื“ื–ืฉืขืจ ื‘ืึทืงืขื ื“_ืกื˜ืึทืจื˜ | ืฆื™ื™ื˜ ืกื˜ืึทืžืคึผ ืžื™ื˜ ืฆื™ื™ื˜ ื–ืึธื ืข xact_start | ืฆื™ื™ื˜ ืกื˜ืึทืžืคึผ ืžื™ื˜ ืฆื™ื™ื˜ ื–ืึธื ืข query_start | ืฆื™ื™ื˜ ืกื˜ืึทืžืคึผ ืžื™ื˜ ืฆื™ื™ื˜ ื–ืึธื ืข ืฉื˜ืึทื˜_ื˜ืฉืึทื ื’ืข | ืฆื™ื™ื˜ ืกื˜ืึทืžืคึผ ืžื™ื˜ ืฆื™ื™ื˜ ื–ืึธื ืข wait_event_type | ื˜ืขืงืกื˜ ื•ื•ืึทื˜ื˜_ืขื•ื•ืขื ื˜ | ื˜ืขืงืกื˜ ืฉื˜ืึทื˜ | ื˜ืขืงืกื˜ ื‘ืึทืงืขื ื“_ืงืกื™ื“ | xid backend_xmin | xid top_level_query | ื˜ืขืงืกื˜ ืึธื ืคึฟืจืขื’ | ื˜ืขืงืกื˜ queryid | ื‘ื™ื’ื™ื ื˜ ื‘ืึทืงืขื ื“_ื˜ื™ืคึผ | ื˜ืขืงืกื˜                     

ืขืก ืื™ื– ื ืึธืš ืงื™ื™ืŸ ืคืึทืจื˜ื™ืง ืคึผืขืงืœ ืคึฟืึทืจ ื™ื ืกื˜ืึทืœื™ืจื•ื ื’. ืขืก ืื™ื– ืกืึทื’ื“ื–ืฉืขืกื˜ื™ื“ ืฆื• ืึธืคึผืœืึธื“ื™ืจืŸ ื“ื™ ืžืงื•ืจื™ื ืื•ืŸ ืึทืกืขืžื‘ืึทืœ ื“ื™ ื‘ื™ื‘ืœื™ืึธื˜ืขืง ื–ื™ืš. ืื™ืจ ืขืจืฉื˜ืขืจ ื“ืึทืจืคึฟืŸ ืฆื• ื™ื ืกื˜ืึทืœื™ืจืŸ ื“ื™ "ื“ืขื•ื•ืขืœ" ืคึผืขืงืœ ืคึฟืึทืจ ื“ื™ื™ืŸ ืกืขืจื•ื•ืขืจ ืื•ืŸ ืฉื˜ืขืœืŸ ื“ืขื ื“ืจืš ืฆื• pg_config ืื™ืŸ ื“ื™ PATH ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง. ืžื™ืจ ืงืœื™ื™ึทื‘ืŸ:

cd pgsentinel/src
ืžืึทื›ืŸ
ืžืึทื›ืŸ ื™ื ืกื˜ืึทืœื™ืจืŸ

ืœื™ื™ื’ ืคึผืึทืจืึทืžืขื˜ืขืจืก ืฆื• postgres.conf:

shared_preload_libraries = 'pg_stat_statements, pgsentinel'
track_activity_query_size = 2048
pg_stat_statements.track = ืึทืœืข

# ื ื•ืžืขืจ ืคื•ืŸ ืœืขืฆื˜ืข ืจืขืงืึธืจื“ืก ื’ืขื”ืืœื˜ืŸ ืื™ืŸ ื–ื›ึผืจื•ืŸ
pgsentinel_ash.max_entries = 10000

ืจื™ืกื˜ืึทืจื˜ PostgreSQL ืื•ืŸ ืฉืึทืคึฟืŸ ืึท ืคืึทืจืœืขื ื’ืขืจื•ื ื’:

ืฉืึทืคึฟืŸ ื’ืขืฉืคึผืจื™ื™ื˜ ืคึผื’ืกื ื˜ื™ื ืขืœ;

ื“ื™ ืึทืงื™ื•ืžื™ืึทืœื™ื™ื˜ื™ื“ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืึทืœืึทื•ื– ืื•ื ื“ื– ืฆื• ืขื ื˜ืคึฟืขืจืŸ ืคึฟืจืื’ืŸ ืึทื–ืึท ื•ื•ื™:

  • ืื•ื™ืฃ ื•ื•ืึธืก ื•ื•ืืจื˜ืŸ ืกืขืฉืึทื ื– ื”ืึธื˜ ืื™ืจ ืคืึทืจื‘ืจืขื ื’ืขืŸ ื“ื™ ืžืขืจืกื˜ ืฆื™ื™ื˜?
  • ื•ื•ืึธืก ืกืขืฉืึทื ื– ื–ืขื ืขืŸ ื“ื™ ืžืขืจืกื˜ ืึทืงื˜ื™ื•ื•?
  • ื•ื•ืึธืก ืจื™ืงื•ื•ืขืก ื–ืขื ืขืŸ ื“ื™ ืžืขืจืกื˜ ืึทืงื˜ื™ื•ื•?

ืื™ืจ ืงืขื ื˜, ืคื•ืŸ ืงื•ืจืก, ื‘ืึทืงื•ืžืขืŸ ืขื ื˜ืคึฟืขืจืก ืฆื• ื“ื™ ืคึฟืจืื’ืŸ ืžื™ื˜ SQL ืงื•ื•ื™ืจื™ื–, ืึธื‘ืขืจ ืขืก ืื™ื– ืžืขืจ ื‘ืึทืงื•ื•ืขื ืฆื• ื–ืขืŸ ื“ืขื ื•ื•ื™ื–ืฉื•ื•ืึทืœื™ ืื•ื™ืฃ ืึท ื’ืจืึทืคื™ืง ื“ื•ืจืš ื›ื™ื™ืœื™ื™ื˜ื™ื ื’ ื“ื™ ื™ื ื˜ืขืจื•ื•ืึทืœื– ืคื•ืŸ ืฆื™ื™ื˜ ืžื™ื˜ ื“ื™ ืžื•ื™ื–. ืื™ืจ ืงืขื ืขืŸ ื˜ืึธืŸ ื“ืึธืก ืžื™ื˜ ืึท ืคืจื™ื™ ืคึผืจืึธื’ืจืึทื PASH-Viewer (ืื™ืจ ืงืขื ืขืŸ ืืจืืคืงืืคื™ืข ื“ื™ ื’ืขื–ืืžืœื˜ ื‘ื™ื ืึทืจื™ืขืก ืื™ืŸ ื“ื™ ืึธืคึผื˜ื™ื™ืœื•ื ื’ ืจื™ืœื™ืกื™ื–).

ื•ื•ืขืŸ ืกื˜ืึทืจื˜ื™ื ื’, PASH-Viewer (ืกื˜ืึทืจื˜ื™ื ื’ ืคื•ืŸ ื•ื•ืขืจืกื™ืข 0.4.0) ื˜ืฉืขืงืก ืคึฟืึทืจ ื“ื™ ื‘ื™ื™ึทื–ื™ื™ึทืŸ ืคื•ืŸ ื“ื™ pg_active_session_history ืžื™ื™ื ื•ื ื’ ืื•ืŸ ืื•ื™ื‘ ืขืก ื™ื’ื–ื™ืกืฅ, ืขืก ืœืึธื•ื“ื– ื“ื™ ื’ืื ืฆืข ืึทืงื™ื•ืžื™ืึทืœื™ื™ื˜ื™ื“ ื’ืขืฉื™ื›ื˜ืข ืคึฟื•ืŸ ืขืก ืื•ืŸ ื”ืืœื˜ ืฆื• ืœื™ื™ืขื ืขืŸ ื ื™ื™ึท ื™ื ืงืึทืžื™ื ื’ ื“ืึทื˜ืŸ, ืึทืคึผื“ื™ื™ื˜ื™ื ื’ ื“ื™ ื’ืจืึทืคื™ืง ื™ืขื“ืขืจ 15 ืกืขืงื•ื ื“ืขืก.

PostgreSQL ืึทืงื˜ื™ื•ื• ืกืขืกื™ืข ื’ืขืฉื™ื›ื˜ืข - ื ื™ื™ึท ืคึผื’ืกื ื˜ื™ื ืขืœ ืคืึทืจืœืขื ื’ืขืจื•ื ื’

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’