MySQL、リストア時の問題
○概要
MySQLのデータベースのバックアップ、リストアにはMySQL AdministratorというGUIのツールを使ってる。それ以外の選択肢としては以下のようなものがあるけど、Windowsアプリなので簡単にインストールので。
・phpMyAdmin
・mysqldumpコマンド
MySQL Administratorを使ってデータベースをバックアップしてリストアしたり、別のマシンのMySQLにデータを移行したりってのは良くあると思うけど、結構ちょくちょく問題が発生する。
MySQL AdministratorでダンプするとCREATE DATABAS, CREATE TABLE, INSERT文などが含まれたSQL文が作成されるけど、ダンプしたデータからリストアが出来ない事がよくある。
○いままであった問題点
・外部キーがあるテーブルのリストア時
テーブルAがテーブルBを参照しているとする。ダンプするとA→Bという順でCREATE TABLE文が作成されるけど、Aを作成する時点ではBが存在していないのでエラーになる。(errno 150 と表示される)
これを防ぐには一時的に以下のようにしておけばいい。
FOREIGN_KEY_CHECKS=0
マニュアルの該当ページ
MySQL Administratorでの出力の先頭に以下のような行がある。
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
と言う事で、通常は自動的にやってくれそうな感じだけど、リストア先のデータベース・リストア時のMySQL Administratorのバージョンとかの違いの為か上手くいかない場合があった。その時は以下のようにしたら上手くいった。(コメント行を外した)
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0
・データに ‘ があると…
INSERT文でVALUEに ‘ (シングルクォート)が含まれている時、そのINSERT文が失敗する(時がある?)。
こんな感じのヤツ↓(このSQLがエラーになるかどうかは試してないけど)
INSERT INTO tbl (name, value) VALUES ( 'foo', 'foo's value');