共用サーバのバックアップ

共用サーバも自動で毎日バックアップを取ることにした。

今回クライアントに提供しているサーバ(VPS)のバックアップを外部サーバに自動バックアップをとるように設定したのだが、その理由は2つ。

  • サービスとしてバックアップ機能がない
    近々提供予定ということだったのだが・・・とりあえず現状バックアップの手段が提供されていない。
  • ローカルに保存するのは怖い
    やはり外部の(別の)メディアにバックアップしておきたい。

過去に何度となくトラブルに遭遇し、その都度痛い目を見ているので、今回はすごく真面目に取り組んでいる(気付くのが遅い・・・)。そしてこれを機に運用中の共用サーバもバックアップをとることにしたというわけ(サーバの停止はそのまま収入の減少にもつながるので)。

まずサーバでバックアップ用のコマンドが使えるかどうかチェック。PHPが使えるのでsystem関数を使ってパスが通っているかどうかをチェックする。

system(‘which mysqldump’);
system(‘which tar’);
system(‘which bash’);
system(‘which gzip’);
system(‘which ssh’);
system(‘which ftp’);
system(‘which expect’);
var_dump(__FILE__);

コマンドがあればパスを吐き出してくれる。うん、うん、だいたい使えそう。

MySQLはmysqldumpで吐き出す。この時、最初は-xオプションでロックをかけようとしていたのだけれど、それだとdumpできなかった。まぁ、共用サーバだからしょうがない。-xオプション無しでdump。そしてそれをパイプに渡してgzip。これでOKだ。現在使っている共用サーバは複数のMySQLデータベースを使用できるのだが、それらのユーザ情報は共通にしてあるので、–all-databasesオプションを使えば一発で全てのDBをdumpできる。

次にファイル。HTMLとかPHPとか画像とか。これはtarで固めてgzip。ただしバックアップファイルの保存先を上手く指定してやらないといけない。あとメールデータとかゴミとか不要なのはデータ領域の無駄なのでバックアップしない。そのためシェルスクリプトを組んで、バックアップをとるデータのリストを作成し、それを引数としてtarに渡すことにした。これでファイルのバックアップもOK。

上記の二つはcronで1日1回処理。これを外部サーバに転送する。上記二つの処理は一つのシェルスクリプト内で記述しているのでそこで完結させたいのだが、外部サーバのログイン情報を共有サーバに保存しておいておくのはとてもイヤ。だからやむなく外部サーバから共有サーバをつつくことになる。今回はFTPにした(しかも非暗号化・・・)。FTPSでコマンドラインでのアクセス方法がわからなかったので仕方なかった。

もうひとつの方法として、共有サーバで圧縮したファイルの保存先を共有SSL領域にしておいて、そこに対して外部サーバからwgetというのも考えた。これでベーシック認証かけてIPアドレスではじいておけば、こちらのほうがベターかも知れない。それはそれで今後の課題とする。

何はともあれ、root権有りサーバも、root権無しサーバも、自動バックアップが出来るようになった。あとは・・・もうちょっと手を加えれば完了。

いつの間にか外部キー制約が可能に

2011/04/11 | SQLite

普段はあまり使わないSQLiteだったけど、最近ちょっとしたデータ格納手段として使っている(SQLでデータの検索ができるのが便利)。HTML5ではローカルの保存領域として使えるようになったということもあり、これからはSQLiteを使う機会が増えるのは間違いなさそう。

で、SQLiteの外部キー制約。以前は使えなかった(というか定義しても無意味だった)はずだが、3.6.19から使えるようになったとのこと(2009年10月リリースって・・・気づかなさすぎ・・・)。

FireFoxのアドオンSQLite Managerで確認してみた。サーバ上でPHPで作られたSQLiteデータベースをダウンロードして確認。

PRAGMA foreign_keys;

0

どうやらデフォルトでは対応していないらしい。そこで以下のコマンド。

PRAGMA foreign_keys=ON;
PRAGMA foreign_keys;

1

おぉ、これで使えるようになったらしい。

でも、phpinfo()で調べてみると、サーバのPHPで使用しているSQLiteのライブラリのバージョンは3.3.6となっていた。OSはCentOS5.5。標準のRPMパッケージではNGなようだ。うちで借りているVPSやら専用サーバやらは基本的に全てCentOSで、パッケージ管理はyum、標準のリポジトリに頼っている。つまり・・・使えないってことか。あ、共有サーバなら対応してるかも・・・。

PostgreSQLのバックアップ

2011/04/10 | PostgreSQL

PostgreSQLの自動バックアップのメモ。

PostgreSQLのバックアップ用ユーザを追加しておく(Linuxユーザをbackupとして作っておいて同じ名前にする)。その際superuser権限を与えておく。ユーザ作成はpostgresになってから。

createuser backup

pg_hba.confでbackupユーザをlocalhostからパスワードなしでログイン出来るよう設定する。具体的には以下の行を追加する。

local all backup trust

これで以下のコマンドでバックアップできるようになる。

pg_dumpall -U backup > dump.sql

MySQLのバックアップ

2011/04/09 | MySQL

MySQLのバックアップも自動化してしまいたい。ということで、まずbackupユーザに権限を与え、パスワードなしでログイン出来るようにする。ちょっと危険なような気もするが・・・。MySQLのバックアップには、全ての特権を与える必要はない。今回は以下のように特権を与えた。

grant FILE, SELECT, LOCK TABLES, SHOW VIEW, RELOAD on *.* to backup@localhost;

localhostからのアクセスだけ。ということでご容赦願おう。でもって、実際のバックアップコマンドはこちら。

mysqldump -u backup -x –all-databases > all.dump.sql

-xオプションは全データベースをロックという意味。

実際には、パイプ処理でtarに渡し、さらにgzipして・・・最後はリモートサーバへsshで転送。

パスワードなしでSSHログイン

2011/04/08 | その他

対象ディレクトリのバックアップを作成し、コマンド一発でリモートサーバに転送する方法を書いたが、この方法だとパスワードを聞かれてしまう。バックアップは定期的かつ自動的に実行されて欲しいのだが、この方法では都度パスワードを入力しなくてはいけないので、自動的という訳にはいかない。パスワードの自動入力にはexpectを使う方法もあるが、そもそも入力しなくてもいいように設定してしまえば楽チンである。

まず事前にアカウントを作成しておくことにする。わかりやすいように、サーバ側(アクセスされる側・バックアップ先)、クライアント側(アクセスする側・バックアップ元)ともにbackupというユーザを作成することにする。当然クライアント側のバックアップしたいファイル群にはbackupの読み取り権限が必要になるので適宜設定しておく。

まずクライアント側で以下のコマンドを実行する。

ssh-keygen -t dsa

秘密鍵・公開鍵を作成する。この時、鍵の置き場所や鍵のパスフレーズを聞かれるが、何も入力せずに改行。でないと、サーバへのアクセス時にパスワードこそ聞かれないけれど、鍵に対するパスフレーズを聞かれることになってしまう(本末転倒)。

するとbackupのホームディレクトリに.ssh/というディレクトリが作成され、その中に以下のファイルが作成される

  • id_dsa(秘密鍵)
  • id_dsa.pub(公開鍵)

作ったディレクトリやファイルは誰にも触られないように、アクセス権限を変更しておく。

次に、公開鍵をサーバ側に転送する(何らかのセキュアな方法で)。サーバ側にもbackupというユーザを作成しておいた。backupのホームディレクトリに.ssh/というディレクトリを作成しておく。そして.ssh/authorized_keys2というファイルを作成し、先程の公開鍵の内容をコピペしておく。そして同様にアクセス権限を変更しておく。

以上で設定は終了だ。

いったんクライアント側からサーバ側にsshで接続してみる。最初はknown_hostsの登録がないので、登録するかどうか聞かれるのだが、以後はいきなりログイン出来るようになる。簡単なんだけど、ある意味怖いよね・・・。ま、しょうがないんだけど。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net