mysqldumpコマンドを使う
非常に便利なコマンド、mysqldumpコマンドを使ってみた。
今回は、データのダンプを取得するために利用する。
その場合、mysqldumpコマンドは、
mysqldump database名 [table名]
でデータのダンプを取得することができる。
[table名]は任意で、指定をするとそのテーブルのデータのみダンプがとれるって感じ。
今回はデータベースごとダンプを取得するのですが、ダンプの結果が都合よくとれないところがあったのでメモ。
ダンプの順序
まずダンプの結果は、テーブルごとに以下のようなことをする。
- テーブルをDROPする
- テーブルをCREATEする
- テーブルをLOCKする
- テーブルにデータをINSERTする
- テーブルをUNLOCKする
で、このときテーブル名順にダンプデータが作成される。
これにはテーブル間の関連は意識してくれないらしい。
つまりデータをINSERTするにも関わらず、その順序に関連が考慮されないってこと。なのでAテーブルでBテーブルのカラムを外部キーとして持っている場合、AテーブルのデータをINSERTする時にBテーブルのデータはないので、データのINSERTに失敗する。
ってことで、本件については、ダンプ結果を編集することにした。
>>追記
どうも関係なかった。
EUC-JPの環境から取得したダンプ結果を、UTF-8にエンコードしていたために発生したエラーみたい。ダンプ結果の中のchar-setを「ujis」から「utf8」に変更することで解決。
ちなみにダンプ結果のファイルがEUC-JPでかつchar-setが「ujis」であれば、問題なくできた。
つまり余計なことをしたために出た問題っていうか、自分で作った問題ってこと。
INSERT文
今回、データのダンプを取得する理由が、テーブル定義の変更があるから。
あるテーブルのカラムを追加するのに、
- データのダンプを取得
- テーブルの構成変更
- データの復元
ってことをやろうとしている。
しかしダンプの結果にあるINSERT文は、カラム名が省略されている。そのため、カラム追加文の値も入れないとINSERT文がエラーになる。ってことで、INSERT文の頭に自前でカラム名を追加した。INSERT文が一行で出力されていたため、一行文だけの追加で助かった。
で、試してみたら大丈夫だった。
ちなみに、mysqldumpコマンドのオプションにカラム名を省略しないオプションがあって、
mysqldump -c database名 [table名]
とすれば、問題解決。
オプションの説明は、こんな感じ。
-c, --complete-insert Use complete insert statements.