データベースを弄っていまして、テーブルが死ぬほどあるんです。
例えば200個くらいテーブルあって、そのうち piyo_ みたいなプリフィックスがついているのが60個くらいあって、それを除外して、mysqldumpしたい、なんて願望があります。
2、3個のテーブル除外であれば、--ignore-table
を使えばよいのです。で複数なので、--ignore-table="piyo%"
とかでいけないかと思ったのですが、ダメ。
結果、以下のアプローチで、なんとかできました。
まずは、除外ではない簡単なパターンから。
特定のプリフィックスがあるテーブルのみダンプする方法
例えば、hoge_ プリフィックスがついているテーブルが20個あって、それをダンプしたいという場合であれば、以下でいけます。(めんどうなので、-u rootで書いておきます。。)
mysql -u root [db_name] -N -e 'show tables like "hoge%"' | xargs mysqldump -u root [db_name] > dump.sql
これで、dump.sqlに欲しい情報は書き出されます。
(正確には"hoge\_%"
と_
をエスケープさして書いておいた方が厳密にプリフィックス指定できるので良いと思いますが、見づらいので以下、全部省略)
解説
-N … カラム名を表示しない。
-e … sqlを実行する。
前半でhoge_プリフィックスのテーブルを抽出して、それをxargsで後半部分(mysqldump)の引数としてます。(なので、複数個のテーブル情報が渡されています)
本題
最初は、sql実行部分を
show tables not like 'piyo%'
という感じにカスタマイズでokなんじゃない?と思ったのですが…。
これは使えない。
いろいろ調べていたら、次のように書けば大丈夫!というを見つけたのですが…
show tables where 'tables_in_[db_name]' not like 'piyo%';
これもダメ。(昔はokだったけど、新しいバージョンだとダメ、みたいなことが書いてあります。mysql: What is the right syntax for NOT LIKE?)実際やってみたけど、なんかエラー。
けど見つかりました!
SELECT table_name FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema = '[db_name]'
AND table_name NOT LIKE 'piyo%';
参照元:Why doesn’t this work? - SHOW TABLES NOT LIKE ‘history%’
で、できた…。
何コレ!
いきなり複雑なの出て来たよ。table_schemaとか、全然知らないし。。ここは後で勉強しよう。
でもこれで、一応特定のテーブルを除外してshowする方法は分かったので、これをあとはダンプと組み合わせればよい。
完成形
mysql -u root [db_name] -N -e
'SELECT table_name FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema = "[db_name]"
AND table_name NOT LIKE "piyo%"'
| xargs mysqldump -u root [db_name] > dump.sql
な、長い。
正直こんなコマンドが正常にうごくのか、かなり不安な気持ちになりましたが、うごかしてみたら、
できました!!\(˚◊˚)/
これで、piyo_プリフィックスのテーブル以外のテーブルをdumpすることができました。
以上、ありがとうございました。
■参考にさせて頂いたWebページ:多謝