Mysqldumpは、特定のプレフィックス/ Mysqldumpワイルドカードを持つテーブルのみですか?


83

クリーンアップしているこの巨大で乱雑なデータベースがあります。Magento EnterpriseとJoomlaを1つのDBに組み合わせた結果、500以上のテーブルが格納されます。

さらに悪いことに、まったく使用されていない70以上のJoomlaテーブルのセットがあります。これらはすべて接頭辞がbak_。です。

これらのbak_テーブルを削除するだけでも簡単ですが、最初にそれらを「ベイク」したいと思います(そこで何をしたかを参照してください)。私の頭の中で私はこのようなコマンドを想像することができます:

mysqldump -u username -p mydatabase bak_*

しかし、これは機能しません。これを行うための最良の方法は何でしょうか?ありがとう!

編集:はい、含める70のテーブル、または除外する〜430のテーブルを明示的にリストできますが、可能であれば、これを行うためのより良い方法を探しています。


答えは、クエリでそのテーブルを選択し、mysqldumpでそのクエリを渡すことです。mysqldumpは正規表現をサポートしていないためです。幸運を祈ります
ダリク2011年

1
:私はあなたの質問への答えはここにあると思いstackoverflow.com/questions/2949330/...
ラグー

@minazによって与えられた答えは、現在最良としてマークされている答えよりも明らかに優れています。もちろん同意するなら、それをより良いものとしてマークするのに役立つでしょう。
ダンダスカレスク2012

回答:


119

コマンドラインでテーブル名を次々に指定できますが、ワイルドカードは使用できません。 mysqldump databasename table1 table2 table3

--ignore-tableそれが短い場合にも使用できます。

別のアイデアは、テーブルを次のようなファイルにまとめることです。

mysql -N information_schema -e "select table_name from tables where table_schema = 'databasename' and table_name like 'bak_%'" > tables.txt 

ファイルを編集して、すべてのデータベースを1行にまとめます。その後、

mysqldump dbname `cat tables.txt` > dump_file.sql

テーブルを1行にドロップするには(非推奨)、次の操作を実行できます。

mysql -NB  information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql dbname -e "DROP TABLE {}"

4
ただし、いずれにしても、無視する70個のテーブル、または含める430個のテーブルをリストする必要があります。これは私が避けようとしていることです。私の質問はもっと明確にすべきでしたが、答えてくれてありがとう。このWOULD作業、はい;)
thaddeusmt 2011年

1
もう1つのアイデアは、ファイルのmysql -N information_schema -e "select table_name from tables where table_name like 'bak_%'"" > tables.txt編集などを使用してテーブルをファイルにまとめ、すべてのデータベースを1行にまとめることです。次に行うmysqldump dbname `cat tables.txt`
sreimer 2011年

bak_テーブルを削除するだけでしたが、それでもこれを使用してテーブルのリストを取得しました。次に、それらをコンマと一緒に操作して、大きなDROPTABLEステートメントを作成しましたgawk '{print $1"," }' tables.txt > baktables.sql。ありがとう!
thaddeusmt 2011年

ワンライナーでこれを行う方法はありますか?すなわち:一時ファイルを仲介として使用せずに?
トム・オージェ

3
これはそれをするでしょうmysql -NB information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql test -e "DROP TABLE {}"
sreimer 2011

59

簡単な方法は次のとおりです。

mysql [dbname] -u [username] -p[password] -N -e 'show tables like "bak\_%"' | xargs mysqldump [dbname] -u [username] -p[password] > [dump_file]

4
これはワイルドカードでもあり、エスケープする必要があるshow tables like "<prefix>\_%"ため_です...そうしないと、同じプレフィックスを持つテーブルで問題が発生する可能性があります-bak_とbak2_のようなプレフィックスは両方とも一致しますbak_%
reox 2012年

5
-Nをに渡すことができ、行を除外mysqlするためにを実行する必要はありません。grepTables_in
ダンダスカレスク2012

1
私のために働いたが、mysql-NBで働いた。
wesamly 2015

show tables like "bak\_%"何も返さない場合、すべてのデータベースがダンプされます。これを防ぐ方法はありますか?
Seb333 0019

56

お気に入り:

mysqldump DBNAME $(mysql -D DBNAME -Bse "show tables like 'wp\_%'") > FILENAME.sql

すべての答えはほぼ同じアプローチを取りますが、これは最も簡潔な構文です。


11
好奇心旺盛な人のために、これらのフラグは-Bバッチ-e実行-sサイレントモード(出力が少ない) dev.mysql.com/doc/refman/5.6/en/mysql-command-options.html
jsh

これ大好き。私はこのスニペットをつかむために何度もここに戻ってきました!
Jason Galuten 2016年

ちょっとした落とし穴:mysqldumpコマンドとmysqlコマンドの両方について、ユーザー名とパスワードのパラメーターを入力する必要がある場合があります。また、mysql呼び出しが失敗した場合、mysqldumpはデフォルトでデータベース全体をダンプします。これは、特にデータのサブセットのみをダンプする傾向がある場合は、膨大になる可能性があります。
gwideman

これは機能していませんmysql -u "$MYSQL_USER_NAME" -h host -p"$MYSQL_PASSWORD" -N -e 'show databases like "auth\_%"' | xargs mysqldump -u "$MYSQL_USER_NAME" -h host -p"$MYSQL_PASSWORD" > test
クラウドバッド

2

テーブルの名前のリストを抽出mysql -sN …し、「for…in…」シェルループの各アイテムを使用してそれらを削除する別のワンライナー:

for f in `mysql dbname -sN -e "SHOW TABLES LIKE 'bak\_%' "` ; do mysql dbname -rsN -e "DROP TABLE $f"; done

または(拡張バージョン)

for f in `mysql dbname -sN -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname' AND TABLE_NAME LIKE 'bak\_%' "` ; do mysql dbname -rsN -e "DROP TABLE $f"; done

または、テーブルの名前が十分に短い場合は、「group_concat」を使用してテーブルの名前を連結*します。

tables=`mysql dbname -srN -e "SELECT GROUP_CONCAT(TABLE_NAME SEPARATOR ',') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname'  AND TABLE_NAME LIKE 'bak\_%' "`; mysql dbname -rsN -e "DROP TABLE $tables"

*「group_concat_max_len」の値(通常は1024に等しい、70個のテーブルを参照)などのいくつかの制限が干渉する可能性があります。


同じ原則ですが、「bak_」で始まるテーブルを除くすべてのテーブルをダンプします。

for f in `mysql dbname -sN -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname' AND NOT(TABLE_NAME LIKE 'bak\_%') "` ; do mysqldump -u [u] -p dbname "$f" >> dump_dbname.sql; done

2

すでにたくさんの良い答えがありますが、私はそのようなバリエーションでここに来ました:

mysql MY_DATABASE -N -u MY_MYSQLUSER -p -e 'show tables like "%MY_LIKE_CODE%";' |
xargs mysqldump MY_DATABASE -u MY_MYSQLUSER -p |
gzip > ~/backup/`date +%Y%m%d:::%H:%M:%S-MY_DAMP.sql.gz`

このアクションにより、データベースから単一ファイルへの%mask%のようなマスクによるテーブルダンプを作成しました。うまくいけば、誰かがそれが役に立つと思うでしょう。


2

MySQL 5.7以降、このmysqlpumpツールはパターンを使用したテーブル名のフィルタリングをサポートしています。

これは中途半端なツールであるため、必要な機能をサポートし、それらを正しく実行することを確認する必要があることに注意してください(たとえば、MySQL 5.7.12以降、トリガーのエクスポートは壊れています)。


3
「mysqlpump」はタイプミスではないことがわかりました。dev.mysql.com/doc/refman/5.7/en/mysqlpump.html。はい、-include-tables abc%オプションを使用すると、ワイルドカードを使用してダンプするテーブルを指定できます。しかし、mysqlpumpにビューを除外させる方法はないようです。うん、確かにかなり中途半端な。
gwideman

1

ここにある他の良い答えのいくつかに基づいて、これをさらに簡単にするシェルスクリプトを作成しました。このスクリプトは、出力に3つのファイルを生成します。1つはすべてのテーブルの構造、1つはすべての除外されていないテーブルのデータ、もう1つはすべての「除外された」テーブルのデータです(本当に必要ない場合はコメントアウトできます)。必要ありません)。次に、必要なものを使用できます。

#!/bin/bash

echo -n "DB Password: "
read -s PASSWORD

HOST=yourhostname.com
USER=youruser
DATABASE=yourdatabase

MAIN_TABLES=$(mysql -h $HOST -u $USER -p$PASSWORD -D $DATABASE -Bse "SHOW TABLES WHERE Tables_in_dashboard NOT LIKE 'bigtable_%';")
STATS_TABLES=$(mysql -h $HOST -u $USER -p$PASSWORD -D $DATABASE -Bse "SHOW TABLES LIKE 'bigtable_%';")

echo "Dumping structure..."
mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-data | gzip > structure.sql.gz

echo "Dumping main data..."
mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-create-info $MAIN_TABLES | gzip > data.sql.gz

echo "Dumping big table data..."
mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-create-info $STATS_TABLES | gzip > big_table_data.sql.gz

0

私の解決策:

mysqldump -u username -p mydatabase `mysql -B --disable-column-names -u username -p mydatabase -e "SHOW TABLES LIKE 'bak\_%'" | sed ':a;N;$!ba;s/\n/ /g'`

0

mysql DATABASE -u USERNAME -p -e '「PREFIX%」のようなテーブルを表示します' | grep -v Tables_in | xargs mysqldump DATABASE -u USERNAME -p> DUMP.sql

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.