プレフィックス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をダンプしました。
いいえ、_ docs のように、mysqldump
コマンドにはそのようなオプションはありません。
--ignore-table = db_name.tbl_name
指定されたテーブルをダンプしないでください。テーブルは、
データベースとテーブルの名前。複数のテーブルを無視するには、このオプションを使用します
複数回。このオプションは、ビューを無視するためにも使用できます。
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
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%';