mysqldumpと復元

2011/08/24 | MySQL

何回やってもその都度忘れるのでメモ。

mysqldump db_name > dump.sql

mysql db_name < dump.sql

そしてこのエラーも毎回悩む。

ERROR 1005 at line 23: Can’t create table ‘./masters/answers.frm’ (errno: 150)

mysqldumpでは、innoDBで外部制約を使っていたとしても、それを考慮したSQL文とはなっていない(子テーブルの記述が親テーブルより先にくることがある)。結果として上記のようなエラーになる。

これを回避するには、リストアする前のSQLファイルに以下の1行を加えておく。

SET FOREIGN_KEY_CHECKS=0;

覚えられない。若い頃は「調べればわかるものは覚えない」というポリシーだったが、何度か使うと覚えていた。しかし最近はポリシーこそ変わらないけれど、一向に覚えられない。

老いた。

preg_matchの便利な書き方

2011/08/09 | PHPの基本

preg_match関数は以下のようにして使う(第三引数以降はオプション)。

preg_match($pattern,$subject,$matches,$flag,$offset);

第三引数$matchesには$subjectのうち$patternにマッチした文字が配列で格納される。例えばこんな感じ。

preg_match(‘/^(question([0-9]{2}))\.class\.php$/’,’question01.class.php’,$matches);
var_dump($matches);

array(3) {
[0]=>string(20) “question01.class.php”
[1]=>string(10) “question01″
[2]=>string(2) “01”
}

パターンマッチした箇所が配列で取得できるのだが、キーが数字なので、あとの取り扱いで少し不便。これを以下のように書きなおすことが出来る。

preg_match(‘/^(?P<name>question(?P<number>[0-9]{2}))\.class\.php$/’,’question01.class.php’,$matches);
var_dump($matches);

array(3) {
[0]=>string(20) “question01.class.php”
[“name”]=>string(10) “question01″
[1]=>string(10) “question01″
[“number”]=>string(2) “01”
[2]=>string(2) “01”
}

これでキーがnameとかnumberとか、わかりやすくて使いやすくなる。マニュアルに書いてあったのを見つけた。名前付きサブパターンというらしい。便利そうなのでメモ。

Saases、さようなら、とは言わないけれど

2011年7月と8月のトラブルメモ。試用期間中はあまり問題なかったのにね。
  • 7月28日10時09分
    外部からのDDoS攻撃。約30分程度。
  • 8月5日23時33分頃
    サーバ障害発生。原因調査と復旧作業開始(連絡が来たのが8月6日2時32分)
  • 8月6日4時45分
    復旧作業完了(物理サーバの再起動)。
    障害内容は ゲストOS起動不可、ストレージへのアクセス不能。
  • 8月6日13時25分
    サーバ障害発生。原因調査と復旧作業開始(連絡が来たのが8月6日15時38分)
    ただし本当はもっと前からサーバはおかしかった。つまり物理サーバ再起動は、何の解決にもなっていなかったと思われる。
  • 8月6日16時45分
    復旧作業完了(物理サーバの再起動)。
    障害内容は ゲストOS起動不可、ストレージへのアクセス不能。
  • 8月7日11時45分
    ゲストOS起動不可。
  • 8月7日12時45分
    物理サーバ再起動。

普通にこの経緯をみただけでも「物理サーバの再起動は一時しのぎであって根本的な解決にはなっていない」とわかるのだが。どのくらいの頻度でトラブルのかちょっと見ものだな。

MySQLでバイナリログ

2011/08/07 | MySQL

諸般の事情でMySQLのバイナリログをちゃんととっておかないと・・・という場面に遭遇してしまった。本来開発がメインだからセキュリティとか設定とかそういうのはやらないことにしているのだけれど、事情があってやむを得ず・・・。

MySQLはデフォルトではバイナリログを保存する設定にはなっていない。取得するための設定は/etc/my.cnfの[mysqld]セクションで以下の記述をして、MySQLを再起動。

log-bin=/home/binarylog/mysql-bin

ログを見るにはmysqlbinlogコマンドを使えばいい。

SQLだけ吐き出すにはこんな感じ(らしい)。

mysqlbinlog -D -uroot -pxxxxxxx -database=”db_name” /backup/mysql-bin.000001 > /backup/bin.sql

まぁ、使わずにすむものなら使いたくない。

再起動に2時間ってどうかと思う

Saasesインダストリア。やっと起動した。

シャットダウンや起動にすごく時間がかかるのはよくある話ではあるのだが、2時間ってどうかと思う。しかも長年使い込んでいじり倒ししたサーバならともかく、再インストールして設定中のサーバで。

とりあえず、退避させたウェブアプリをこちらに戻すのは延期。そんな気分じゃない。それに、いつまたこんな状態になるかもしれないと思うと気が気ではないので、バックアップのバックアップ程度に使うことにする。結局さくらのVPSを追加契約ということになるのか。まぁ、バックアップのバックアップがあるということで、全てのウェブサービスをさくらのサーバで運用してもいいか。

いや、ちょっと怖いな。


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