Category: "MySQL, データベース, 雑感" , Tags: mysqldump index dmp
暑さに弱いしゃちょーです。
東京の夏は最悪に暑い。
もっと冷やせと多方面にお願いしたい。
もっともまだ夏ではないけれども。
さて、そろそろMySQLのお話を少しずつ。
10年以上データベースの仕事をしてきて、色々触った結果Oracleしかないでしょ、とそう思っていた頃だった。
名前は聞いたことはあったし、軽くて早くて、なんていい評判も聞いていたし業界の人として情報は得ていた。
実際には予備知識なしで行きなり実践投入されたんだけど、1stインプレションとしては、「ほぼOracle」と感じた。「楽勝」とも。
実はここから苦闘が始まるのだがこの時点では知る由もなし。
Oracle技術者が躓くMySQLのポイントをいくつか。
いろんなところで語られているので多くを語ろうとは思っていないが、技術支援しているときなどに必ず出てくるネタを紹介していく。
レベルの高い人は読む必要がないが、うちのページにたどり着いている時点で、どちらかと言うとMySQL初心者SE(知らないって言ってるのに「大丈夫大丈夫」とか言って予備知識を入れる間もなくあっという間に客先に突っ込まれて放置される働き盛りのSE)が多いと思われるので、まあいいかと。
何かの役に立てばいいね。応援してるよ。
その1:mysqldumpでの出力をインポートした際にプライマリ以外のindexが消える。
Oracleのexportに似ていて結構使い勝手が違うのがmysqldump。
生々しくて、僕はmysqldumpの方が好み。
さてタイトルの件、mysqldumpの出力をみてみれば至極当たり前なのだけれど。
まず、
mysqldump -F -l -uxxxx -p –all-databases > test.sql
で出力したファイルをインポートしようとする場合、
dmpの中のテーブル定義についての出力は下記のようになる。
Drop table
Create Table
Lock Tables
Alter Table Disable Keys
Insert Table
Alter Table Enable Keys
上記のように先頭のdropでテーブル定義の全てが削除されるから、
Create文に含まれるPrimary Key以外のIndexは元に戻せない。当然だが。
もしDB定義もテーブル定義もIndex定義もそのままで、
データを全てtruncateしているような場合に、データのみのインポートをしたいようなら、下記のコマンドでdumpするとデータのみのdmpを作ることができる。
mysqldump -F -l -uxxx -p –all-databases –no-create-info –no-create-db –skip-add-drop-database –skip-add-drop-table > test.sql
–no-create-info :create tableを出力しない
–no-create-db :create databaseを出力しない
–skip-add-drop-database :drop databaseを出力しない
–skip-add-drop-table :drop tableを出力しない
テスト時など、データのみの出し入れを頻繁に繰り返すときにはありかも。
ただし、大きなテーブルでいくつもIndexを張っているような場合は
Insert前に多くのIndexがあると当然Insert速度は遅くなる。
現実的にはCreate IndexのSQLを別途作っておいて、通常にdrop tableするdmpを吐かせて
インポート終わった後にIndexを張った方が早い場合もある(手数をさし引いてもね)
mysqldumpのオプションによる出力結果の差を知るだけでも意味あり。
お試しを。


