もじれつとがめん

プログラムの忘備録とゲームとかその他色々。

cron で pg_dump を実行した時に失敗していた

cron で pg_dump を実行するとなぜか空の .gz.dumpファイルが生成されていた

調査するとcron内でpg_dumpのコマンドを実行する際にコマンドのPAHTが適用されていないみたい? なので、bin配下の実行ファイルをcronのコードの中で直接指定する事で解決した。

ぶっちゃけ当時は凄く焦った。 だってDBやれ色々バックアップを一日毎に保存させたかったんだけど、それが10日間くらいずっととれてなくて本当にビビった記憶がある...

cronとは

cronとは設定したスクリプト(コマンド)を自動実行するデーモンプロセスの事、らしい。 正直あまり詳しくは調べてない。。。 最初はコマンドを時間設定して自動的に実行してくれる、程度の認識で良いと思うけど近いうちに調べておこうと思う。 便利だもの。 非常に参考になるリンクだけ置いとく。 http://whitemix.net/89/cron.html http://miya0.dyndns.org/pc/settei/crontab.html

pg_dumpとは

PostgreSQLで使用するバックアップ用のライブラリ。 インストールして、コマンドを入れると指定のDBを全てdumpして出力してくれる。 その出力してくれた物を再度PostgreSQLに読み込ませるとバックアップをとった時点の状態が復元できる。 web上に文献はたくさんあるので、詳しくはそちらを調べるとして今回は省略する。 一応公式のドキュメントだけ... https://www.postgresql.jp/document/9.2/html/app-pgdump.html

解決法

まずはcronの編集画面を開く。 これじゃなくても、cronの実行ファイルを用意しても良い。 このcronの記述方式はどちらが良いとかは宗教戦争っぽいのでそちらは別の機会に。 [shell] $ crontab -e [/shell] 現状の確認。 自分のは時刻を合わせる指示と、問題のバックアップをとる指示の二つがある [shell] 0 /2 * * * ntpdate ntp.jst.mfeed.ad.jp 1 23 * *   pg_dump -U pgsql DATABASENAME | gzip -c > /home/hogehoge/dbbackup/date +\%Y\%m\%ddbback.dump.gz [/shell] これの pg_dump ~ じゃ無くて /usr/local/bin/pg_dump ~ のように修正する。 このパス指定は各自のディレクトリや使っているosで異なるのでそこは適宜変えること。 ちなみに、このコマンドはpg_dumpでバックアップを出力してそれをリダイレクトの ">" で  指定したファイルに保存してる。 date +\%Y\%m\%ddbback.dump.gz この部分は実行した日付を "YYYYmmdd"の形式で取得してファイル名に利用している。 [shell] 1 23 * * * /usr/local/bin/pg_dump -U pgsql DATABASENAME | gzip -c > /home/hogehoge/dbbackup/date +\%Y\%m\%ddbback.dump.gz [/shell] これでキチンとpg_dumpの実行ファイルが呼び出されてコマンドが無事に実行された。

おわりに

少なくともこんな事例の記事は日本語で書かれていなかったので一日ハマってた。 私が間抜けなのか、相当レアケースなのか判別付かないけどコマンドが上手く実行できてなかったらここら辺を疑ってみる教訓にはなった。