この巨大で乱雑なデータベースを整理しています。 500以上のテーブルを収容します。これは、Magento EnterpriseとJoomlaを1つのDBに結合した結果です。
さらに悪いことに、まったく使用されていない70以上のJoomlaテーブルのセットがあります。これらはすべて接頭辞bak_
。
これらを削除するだけでbak_
テーブルは簡単になりますが、最初にテーブルを「焼き」たいと思います(そこで行ったことを確認してください)。私の心では、次のようなコマンドを想像できます。
mysqldump -u username -p mydatabase bak_*
しかし、これは機能しません。これを行う最良の方法は何でしょうか?ありがとう!
編集:はい、含める70個のテーブルまたは除外する〜430個のテーブルを明示的にリストできますが、可能であれば、これを行うより良い方法を探しています。
コマンドラインでテーブル名を次々に指定できますが、ワイルドカードは使用できません。 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 {}"
簡単な方法を次に示します。
mysql [dbname] -u [username] -p[password] -N -e 'show tables like "bak\_%"' | xargs mysqldump [dbname] -u [username] -p[password] > [dump_file]
お気に入り:
mysqldump DBNAME $(mysql -D DBNAME -Bse "show tables like 'wp\_%'") > FILENAME.sql
すべての答えはほぼ同じアプローチを取りますが、これは最も簡潔な構文です。
別の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
すでに多くの良い答えがありますが、私はそのようなバリエーションでここに来ました:
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%などによってテーブルダンプを作成しました。うまくいけば、誰かがそれを役に立つと思うでしょう。
MySQL 5.7以降、mysqlpump
ツールはパターンを使用したテーブル名のフィルタリングをサポートします。
それは中途半端なツールであるため、必要な機能をサポートし、それらを正しく実行することを確認する必要があることに注意してください(例えば、MySQL 5.7.12の時点で、トリガーのエクスポートは壊れています)。
ここで他のニースの回答のいくつかに基づいて、これをさらに簡単にするシェルスクリプトを作成しました。このスクリプトは、出力に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
私の解決策:
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'`
mysql DATABASE -u USERNAME -p -e '"PREFIX%"のようなテーブルを表示する' | grep -v Tables_in | xargs mysqldump DATABASE -u USERNAME -p> DUMP.sql