mysqldumpがワイルドカードを含むテーブルを無視する


8

プレフィックスを持つ約15の奇数を除外したい50の奇数テーブルを含むデータベースのダンプをとる必要があります exam_

試しmysqldump --ignore-table=dbname.exam_* てみましたが--ignore-table=dbname.exam_% 、期待どおりに動作しませんでした。--ignore-table複数回使用しなければなりませんでした。

編集:リストtables not like tablename_%してに渡すシェルスクリプトをいくつか見ましたmysqldump

ただし、mysqldumpまたはmysqlにスクリプトを記述しなくても同じように実行できるオプションがあるかどうかを知りたいのですが。

Edit-add:最終的にスクリプトを使用して、DBを除くテーブルをignore-table=複数回ダンプしました。


使用したスクリプトを投稿できますか?多分それをgist.github.comで
rubo77

@ rubo77:そのスクリプトはもうありません。基本的なスクリプトでした。mysqlコマンドを使用して、除外したいテーブルのリストを取得しました。リストをBASHスクリプトにハードコーディングして、必要なときにいつでもダンプを生成しました。幸いにも、リストは一定でした。または、ここに掲載された解決策は、 スクリプトに関して有用かもしれません。
anup

さらに良い: TABLES=`mysql --skip-column-names [DB-NAME] -e 'show tables' | grep -v 'exam_'` mysqldump [DB-NAME] $TABLES > mysqldump.sql
anup

回答:


13

いいえ、ドキュメントにあるように、mysqldumpコマンドにはそのようなオプションはありません。

--ignore-table = db_name.tbl_name


データベース名とテーブル名の両方を使用して指定する必要がある特定のテーブルをダンプしないでください。複数のテーブルを無視するには、このオプションを
複数回使用します。このオプションは、ビューを無視するためにも使用できます。


余談として、それは価値がこれらのテーブルにアクセスすることはできませんmysqlのダンプユーザーを作成するかもしれないし、しようとしmysqldump --all-databasesてエラーが出て、または単に..次のDDBにスキップした場合にだけ見るために
NickW

試したことはありませんが、良さそうです。解決策として、テーブルを回避するためにシェルスクリプトを作成しました。
anup 2013年

@NickWそれはうまくいくかもしれません。ただし、柔軟性を高めたい場合は、別のクエリを実行してテーブル名を取得する必要があります。以下の私の答えを参照してください。
Buttle Butkus

すばやくダーティなバージョン:データベースを複製します。phpMyAdminのWebインターフェースを使用して、表示したくないテーブルを簡単にドロップできます。次にダンプし、ワイルドカードは必要ありません。CLIの実行が必要で、3番目のステップを気にしない場合は、sitepoint.com
community / t /

3

mysqlから必要なテーブル名を取得し、それらを使用してmysqlダンプパラメータを構築できます。

以下の例では、「someprefix」をプレフィックスに置き換えてください(例:「exam_」)。

SHOW TABLESクエリは、テーブルの他のセットを見つけるために変更することができます。または、INFORMATION_SCHEMAテーブルに対してクエリを使用して、さらに多くの基準を使用することもできます。

#/bin/bash

#this could be improved but it works
read -p "Mysql username and password" user pass

#specify your database, e.g. "mydb"
DB="mydb"

SQL_STRING='SHOW TABLES LIKE "someprefix%";'
DBS=$(echo $SQL_STRING | mysql -u $user -p$pass -Bs --database=$DB )

#next two lines untested, but intended to add a second excluded table prefix
#ANOTHER_SQL_STRING='SHOW TABLES LIKE "otherprefix%";'
#DBS="$DBS""\n"$(echo $ANOTHER_SQL_STRING | mysql -u $user -p$pass -Bs --database=$DB )

#-B is for batch - tab-separated columns, newlines between rows
#-s is for silent - produce less output
#both result in escaping special characters

#but the following might not work if you have special characters in your table names
IFS=$'\n' read -r -a TABLES <<< $DBS

IGNORE="--ignore_table="$DB"."
IGNORE_TABLES=""

for table in $TABLES; do
        IGNORE_TABLES=$IGNORE_TABLES" --ignore_table="$DB"."$table
done

#Now you have a string in $IGNORE_TABLES like this: "--ignore_table=someprefix1 --ignore_table=someprefix2 ..."

mysqldump $DB --routines -u $user -p$pass $IGNORE_TABLES > specialdump.sql

これは、「bashで除外するすべてのテーブル」を取得することに関するこの回答の助けを借りて構築されました:https : //stackoverflow.com/a/9232076/631764

そして、いくつかのbashが使用されているテーブルのスキップに関するこの回答:https : //stackoverflow.com/a/425172/631764


選択した回答に基づいて、私はあなたの回答に似たスクリプトを書きました。これを置いてくれてありがとう。編集:パイプとgrep除外パターンで2つのコマンドを使用したことを思い出しました。
anup

0

これを使用するにinformation_schemaは、を使用することをお勧めします。

select group_concat(concat('--ignore-table=', TABLE_SCHEMA, '.', table_name) SEPARATOR ' ') 
from information_schema.tables 
where TABLE_SCHEMA = 'Actual_DB_NAME' and TABLE_NAME like 'Actual_TABLE_NAME%';
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.