前回(http://www.igreks.jp/dev/2009/10/perlmysql2.html)の続きで今度はバックアップファイルのリストア。
MilkyStepでは、サーバにファイルを残さずにローカルからアップロードしてリストアさせるので、今回はその流れで。
まず事前に・・・
use CGI;
my $F = CGI->new();
------アップロード処理用ルーチン---------------------------------------------------------------------
sub upload{
my $fH = $F->upload('filename'); ### この辺でファイルチェック処理など適宜行う
### アップロードされたファイルを書き込み
my ($buffer);
open (OUT, ">./backup/$fH") || &show::error("ファイル($fH)が書き込みできません。");
binmode (OUT);
while(read($fH, $buffer, 1024)){
print OUT $buffer;
}
close (OUT);
close ($fH) if ($CGI::OS ne 'UNIX'); # for Windows
chmod (0644, "./backup/$fH");
}
----リストア用ルーチン---------------------------------------------------------------------------------
sub restore{
my $filename = $F->upload('filename');
### 圧縮ファイルを展開(今回の場合はgzip)tarだったら"tar -zxvf ファイル名"とか・・
my $rec1 = system "gzip -d ./backup/$filename";
##### DBのテーブルをすべて消去しておく
my @e_tables = $dbh->tables(); ### $dbhはデータベースハンドル(詳細割愛)
foreach(@e_tables){
&query("DROP TABLE IF EXISTS $_"); ### SQL発行&処理実行(詳細割愛)
}
#### リストア実行
my $rec2 = system "mysql --user=$dbuser --password=$dbpass dbname < ./backup/展開されたファイル名";
#### バックアップファイルは削除
my $rec3 = system "rm ./backup/展開されたファイル名";
#### エラー出力
&show::error("圧縮ファイルの展開に失敗しました。") if $rec1 != 0;
&show::error("DBの復元に失敗しました(mysql失敗)") if $rec2 != 0;
&show::error("バックアップファイルの削除に失敗しました") if $rec3 != 0;
}
もちろんこれも前回同様Webサーバからmysqlコマンドが発行できなきゃダメなんだけど、レンタルサーバの場合どうなんだろ?
まあ、多分大丈夫だべ!
私の場合は、
"mysql --user=$dbuser --password=$dbpass dbname < ./backup/展開されたファイル名"
をしたときに、
unknown option '--skip-character-set-client-handshake'
(そんなオプションはねーよ!)
とエラーが出た。
何じゃこりゃと思ったら、以前(http://www.igreks.jp/dev/2008/11/movabletype422.html)に設定したmy.cnfの最後の一行だった。
この部分をコメントアウトしたら成功した。
MilkyStepでは、サーバにファイルを残さずにローカルからアップロードしてリストアさせるので、今回はその流れで。
まず事前に・・・
use CGI;
my $F = CGI->new();
------アップロード処理用ルーチン---------------------------------------------------------------------
sub upload{
my $fH = $F->upload('filename'); ### この辺でファイルチェック処理など適宜行う
### アップロードされたファイルを書き込み
my ($buffer);
open (OUT, ">./backup/$fH") || &show::error("ファイル($fH)が書き込みできません。");
binmode (OUT);
while(read($fH, $buffer, 1024)){
print OUT $buffer;
}
close (OUT);
close ($fH) if ($CGI::OS ne 'UNIX'); # for Windows
chmod (0644, "./backup/$fH");
}
----リストア用ルーチン---------------------------------------------------------------------------------
sub restore{
my $filename = $F->upload('filename');
### 圧縮ファイルを展開(今回の場合はgzip)tarだったら"tar -zxvf ファイル名"とか・・
my $rec1 = system "gzip -d ./backup/$filename";
##### DBのテーブルをすべて消去しておく
my @e_tables = $dbh->tables(); ### $dbhはデータベースハンドル(詳細割愛)
foreach(@e_tables){
&query("DROP TABLE IF EXISTS $_"); ### SQL発行&処理実行(詳細割愛)
}
#### リストア実行
my $rec2 = system "mysql --user=$dbuser --password=$dbpass dbname < ./backup/展開されたファイル名";
#### バックアップファイルは削除
my $rec3 = system "rm ./backup/展開されたファイル名";
#### エラー出力
&show::error("圧縮ファイルの展開に失敗しました。") if $rec1 != 0;
&show::error("DBの復元に失敗しました(mysql失敗)") if $rec2 != 0;
&show::error("バックアップファイルの削除に失敗しました") if $rec3 != 0;
}
もちろんこれも前回同様Webサーバからmysqlコマンドが発行できなきゃダメなんだけど、レンタルサーバの場合どうなんだろ?
まあ、多分大丈夫だべ!
私の場合は、
"mysql --user=$dbuser --password=$dbpass dbname < ./backup/展開されたファイル名"
をしたときに、
unknown option '--skip-character-set-client-handshake'
(そんなオプションはねーよ!)
とエラーが出た。
何じゃこりゃと思ったら、以前(http://www.igreks.jp/dev/2008/11/movabletype422.html)に設定したmy.cnfの最後の一行だった。
この部分をコメントアウトしたら成功した。

コメントする