web-dev-qa-db-ja.com

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

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

mysqldump --ignore-table=dbname.exam_*を試しましたが、--ignore-table=dbname.exam_%も試しましたが、期待どおりに動作しませんでした。 --ignore-tableを複数回使用する必要がありました。

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

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

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

8
anup

いいえ、_ docs のように、mysqldumpコマンドにはそのようなオプションはありません。

--ignore-table = db_name.tbl_name

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

13
NickW

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

3
Buttle Butkus

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%';
0
user3783243