MySQLでデータベースのダンプを取りたい場合でも、一部のテーブルのみのダンプをとりたいという場合が割とあるので、どうやるのか調べてみた

[Sponsored Link]


当ブログでは「役に立った!」「写真使いました!」などご参考頂いた方からのAmazonギフト券の寄付をお待ち致しております。

Share on FacebookTweet about this on TwitterShare on Google+Share on TumblrPin on PinterestShare on LinkedInDigg this

MySQLでデータベースのダンプを取ることは良くある。バックアップとして取っておいたり、別のDBサーバにそのままデータを移行・コピーするなどの目的でダンプをとったり、さまざまであるが、一部のテーブルのみのダンプを取る方法を知りたくて少し調べて見た。


このブログで使っているinetdでもそうだが、一般的なホスティングサービスでは、指定されたMySQLサーバにアカウントと決められた名前の機械的なDB名を渡されて、1つのデータベースを複数のアプリケーションで利用するように求められる。

普通はアプリケーションごとにデータベースを分けて運用する場合が多いが、この例ではそうした運用ができない。
ということは、テーブル名で区分しなければならない、ということになる。

WordPressなどもそうだが、一般的なアプリケーションではこうした事情もふまえて(だと思うが)、そのアプリケーションで利用するテーブル名に「プレフィックス」という接頭辞を付けられるようになっている。たとえばWordPressなら「wp_」がデフォルトだ。

もちろんこのプレフィックスは変更が可能なので(可能じゃなかったら同じアプリケーションを複数同時利用できない)、別のプレフィックスに変更してテーブル名を区分することができる。

そういう運用形態の場合では、そのうちの1つのアプリケーションが利用するテーブルだけダンプを取りたい、という場面が往々にして出てくる。MySQLでのダンプはmysqldumpコマンドを利用するが、データベースのまるごとダンプだけだと私はずっと勘違いしていた。

が、当然であるが、テーブルごとのダンプだって取れないとおかしいよね、という当たり前のことをいまさらながら気がついたのである。
phpMyAdminだってできてるっていうことは、そういう仕組みがあるっていうことだよね。

で、マニュアルを調べたら、ふつーにありました orz

■MySQL :: MySQL 5.1 リファレンスマニュアル :: 7.11 mysqldump — データベースバックアッププログラム
http://dev.mysql.com/doc/refman/5.1/ja/mysqldump.html

単純に、DB名の後ろにテーブル名をつければよかったらしい……。MySQL4の頃からもあったようなので、単に私が無知だっただけであった(というか、直近まで必要性が無かったというのもある)。

mysqldump [options] db_name [tables]

ただ、テーブルは複数あり、それを個別にピックアップしていたらキリがない。
ということで、まとめてテーブル名を出力させるのもMySQLにやらせることにする。

[Sponsored Link]


ここでの例としては、「prefix_table1」「prefix_table2」……といった「prefix_XXX」という命名規則を持ったテーブル名のみmysqldumpを想定しよう。

まずはこの「prefix_XXX」だけを列挙させるところから考える。
これはmysqlコマンドでできるが、指定するデータベースは「information_schema」、select対象は「table_name」にする。条件となるwhere句の指定は「table_name like ‘prefix_%’」にすればよい。

mysql -uユーザ名 -p'パスワード' -h 接続先DBホスト名 information_schema -N -e "select table_name from tables where table_name like 'prefix_%'"

コマンドラインにパスワードを見える形で入力したりhistoryで発見されるのに抵抗を感じる人は単に「-p」のみで指定してプロンプトで入力すればよいだろう。

また、プレフィックスじゃなくて、規則性がテーブル名の中に埋もれている場合は「%middle%」のようにすればいいだろう。
そしていよいよダンプするわけだが、このSQLをそのままmysqldumpコマンドのテーブル名の位置に食わせるようにする。

mysqldump -uユーザ名 -p'パスワード' -h 接続先DBホスト名 DB名 `mysql -uユーザ名 -p'パスワード' -h 接続先DBホスト名 information_schema -N -e "select table_name from tables where table_name like 'prefix_%'"`

ユーザ名とパスワードとホスト名が2回出てきてうっとうしい気もするが、問題なくコマンドは実行可能である。

もちろん事前にSQLの出力をファイルに保存しておき、そのファイルを食わせることもできる。ファイルを編集した後にmysqldumpを実行したいなどの場合には、以下の方法がよいだろうか。

mysql -uユーザ名 -p'パスワード' -h 接続先DBホスト名 information_schema -N -e "select table_name from tables where table_name like 'prefix_%'" > table_name.txt
mysqldump -uユーザ名 -p'パスワード' -h 接続先DBホスト名 DB名 `cat table_name.txt`

基礎からのMySQL 改訂版 (プログラマの種シリーズ SE必修! )実践ハイパフォーマンスMySQL 第3版PHP+MySQLマスターブックMySQL Cluster構築・運用バイブル ~仕組みからわかる基礎と実践のノウハウエキスパートのためのMySQL[運用+管理]トラブルシューティングガイド達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

Share on FacebookTweet about this on TwitterShare on Google+Share on TumblrPin on PinterestShare on LinkedInDigg this

当ブログでは「役に立った!」「写真使いました!」などご参考頂いた方からのAmazonギフト券の寄付をお待ち致しております。


Atsushi Ezura について

ナチュラルな女性のしぐさや表情を撮りたいIT系エンジニア。女性モデル募集中プロフィール
カテゴリー: MySQL, コンピュータ, サーバ タグ: , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。