web-dev-qa-db-ja.com

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

この巨大で乱雑なデータベースを整理しています。 500以上のテーブルを収容します。これは、Magento EnterpriseとJoomlaを1つのDBに結合した結果です。

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

これらを削除するだけでbak_テーブルは簡単になりますが、最初にテーブルを「焼き」たいと思います(そこで行ったことを確認してください)。私の心では、次のようなコマンドを想像できます。

mysqldump -u username -p mydatabase bak_*

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

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

70
thaddeusmt

コマンドラインでテーブル名を次々に指定できますが、ワイルドカードは使用できません。 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 {}"
104
sreimer

簡単な方法を次に示します。

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

お気に入り:

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

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

49

別のonelinerで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
eleg

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

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の時点で、トリガーのエクスポートは壊れています)。

2
Marcus

ここで他のニースの回答のいくつかに基づいて、これをさらに簡単にするシェルスクリプトを作成しました。このスクリプトは、出力に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
1
dtbarne

私の解決策:

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
user3453061

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

0
bhrached