PostgreSQLデータのリストアをシェルスクリプトで自動化する


開発サーバーでPostgreSQLのデータをバックアップし、公開サーバーに転送してリストアするという作業を自動化するためのスクリプトを書きました。

公開サーバーでダンプファイルをリストアをする際、パスワードを入力しなければならず、自動化するのが難しかったため、このページにまとめておきたいと思います。

PostgreSQLのダンプファイルをリストアする自動化スクリプトを探している方や、パスワード入力が必要な対話型のスクリプトを探している方は、ご参考にしていただければと思います。



実行環境


今回のスクリプトを動かした環境は以下のようになります。

・PostgreSQL 9.4
・Linux CentOS 7.3



自動化スクリプト


作成したスクリプトは以下のようになります。


スクリプトを作るにあたってつまずいてしまったのは、セキュリティのためにPostgreSQLにパスワード制限がかかっているため、コマンドを打つたびにパスワードを入力しないといけない点でした。いわゆる対話型となるために、普通にスクリプトを書くとうまく動きません。それを乗り越えるために、expectコマンドを利用しています。


必要であればスクリプト内にWEBサーバーの停止・起動やファイルの処理なども入れておくと、サーバーでの更新処理がスクリプト1つで実行できるようになって便利です。



[正常に動作するスクリプト]

#!/bin/sh

PASS=$1
DIR="/home/testuser"
DUMP="$DIR/backup.dmp"

expect -c "
set timeout -1
spawn pg_restore -U testuser -d testdb $DUMP
expect {
"Password:" {
send \"$PASS\n\";wait
}
}
expect \"\n\"
send \"exit\n\"
"


シェルスクリプトを実行する際に、PASS=$1という箇所で、引数でパスワードを渡しています。


最初は以下のように書いていたのですが全くリストアされず、すぐにスクリプトが終了して困っていたのですが、waitを入れることでうまく動きました。リストアするサイズが大きいと終了までの時間が長くなりますので、上のようなロジックにしておくとうまく動くと思います。


[うまく動かなかったスクリプト]

expect -c "
set timeout -1
spawn pg_restore -U testuser -d testdb $DUMP
expect \"Password:\"
send \"$PASS\n\"
sleep 2
expect \"\n\"
send \"exit\n\"

また、リストアのコマンドはpg_restoreを使っています。


その理由は、pg_dump testdb > $DUMPというコマンドを使ってバックアップを作成し、

spawn psql -U testuser testdb < $DUMP

というようにリストアしていたのですが、

psql: warning: extra command-line argument "<" ignored

というようなエラーが出てうまく動かなかったからです。

pg_restoreコマンドを使うとうまく動きました。


まとめ


今回の自動化スクリプトは、顧客先に納品したサーバー上で動かすために作成したものでした。

ユーザーさんはLinuxのコマンドを実行できる人たちなのですが、それでも自動化してあるととても楽です。

特に、開発サーバーでデータベースをバックアップ→公開サーバーへ転送→リストア、という手順を毎回手動で行うのは面倒です。

ここではリストアのスクリプトだけをご紹介しましたが、それが自動化できているだけでも保守はとても容易になりました。



このエントリーをはてなブックマークに追加



関連記事 

1.PostgreSQLが使えるレンタルサーバー
2.PGroongaをインストールしてPostgreSQLの全文検索を高速に実行する
3.CentOS 7でのPostgreSQLの自動起動スクリプト



▲ このページの上部へ戻る