CodeGym /コース /SQL SELF /データベース監視のイントロ

データベース監視のイントロ

SQL SELF
レベル 45 , レッスン 0
使用可能

データの海を航海する船長になったつもりで考えてみて。船をただ進ませるだけじゃなくて、長いクエリという氷山にぶつからないようにしたいし、突然のロックの嵐に巻き込まれたくないし、接続の過負荷で沈没したくもないよね。データベースの監視は、レーダーであり、気圧計であり、魚群探知機みたいなもの。氷山や嵐、パニックを避けるための必須アイテムだよ。

なんで、どうやってデータベースを監視するの?

監視をちゃんとやると、DBが安定して動くし、問題の兆候も早めにキャッチできる。たとえば、サービスがいきなり落ちる代わりに「おい、ここでクエリがもう30秒も動いてるぞ、なんか変だぞ」って早めにアラートが来る感じ。どこが詰まってるか、誰がロックを持ってるか、どのタイミングでリソース不足になりそうか、事前に分かるんだ。

こんなポイントに注目しよう:

  • クエリとトランザクションのアクティビティ。 クエリの流れを、交差点の交通整理みたいに見張ろう。どのSQLコマンドが他を遅くしてる?誰が一番DBを重くしてる?こういう答えが分かれば、焦らずパニックにならずに最適化できるよ。

  • リソースの使い方。 CPU、メモリ、ディスク容量は、船の燃料や船体みたいなもの。どれかが「漏れてる」か、オーバーロードしてたら、船全体が止まっちゃう。監視でどこが重いか分かるから、負荷を分散できるよ。

  • クエリのパフォーマンス。 一部のSQLクエリは、わがままな乗客みたいなもんで、やたらリソースを食って他を遅くしたり、ずっと文句言ってたりする。監視で特に「大食い」なやつが分かるから、インデックスを貼ったり、書き直したり、置き換えたりできる。

  • ロックとコンフリクト。 時々クエリ同士がバッティングすることもある。誰かがリソースを持ってて、他が待ってる状態。ドアを片方が引っ張って、もう片方が逆に引っ張ってる感じ。こういうロックを監視しておけば、タイミングよく介入してストレスを減らせるよ。

いい監視は、単に「DBが生きてるよ」って教えてくれるだけじゃない。どこでトラブルが起きそうかヒントをくれて、問題が現実になる前に直すチャンスをくれるんだ。

PostgreSQL監視のキーメトリクス

DBの状態をちゃんと把握するには、どこを見ればいいか知っておく必要がある。これらのメトリクスは、DBの「脈拍」と「血圧」みたいなもの。主なパラメータはこれ:

  1. アクティブな接続数。

    今何人が接続してる?無茶なクエリでDBを壊そうとしてるやつはいない?例えば、pg_stat_activity(これは次の講義で話すよ)で今のアクティビティが見える。

  2. クエリの実行時間。

    どのクエリが一番速い?逆に、どのクエリが「もう引退してもいいんじゃない?」ってくらい遅い?

  3. インデックスの利用状況。

    インデックスがあるのに使われてなかったら、何かおかしいよね。これはpg_stat_user_indexesでチェックできる。

  4. ロックとコンフリクトのレベル。

    「Deadlocks」(相互ロック)を防ぐためによく使われる。

  5. CPU負荷とメモリ使用量。

    例えば、PostgreSQLがサーバーのリソースをどれだけ「食ってる」か?

実際どうやるの?

実際の例を見てみよう。特定のDBのサイズを知りたいときに使えるシンプルなクエリがこれ:

SELECT pg_size_pretty(pg_database_size('kimi_no_db_namae')) AS database_size;

このシンプルなクエリは、DBのサイズを分かりやすいフォーマットで返してくれる。たとえば、243 MBとか1.2 GBみたいな感じ。最近どれくらいDBが大きくなったかサクッと知りたいときに便利だよ。

全部のDBサイズを一気に見たいなら、いちいち名前を指定しなくても、こんなクエリが使える:

SELECT datname, pg_size_pretty(pg_database_size(datname)) AS size
FROM pg_database;

これならサーバー上の全DBのサイズが一覧で見れる。ディスク使用量を見張ってる管理者には超便利。「大食い」なDBを早めに見つけて、ホスティングから「もうすぐ容量切れるよ」ってメールが来る前に対処できるよ。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION