web-dev-qa-db-ja.com

mysqldumpは構造全体ですが、1つのコマンドで選択したテーブルのデータのみをダンプします

私のデータベースには、table1、table2、table3の3つのテーブルがあります。

このデータベースで次の条件でmysqldumpを実行したいと思います。

  • すべてのテーブルのダンプ構造
  • Table1とtable2のデータのみをダンプし、table3のデータは無視します

現在、私は2つのmysqldumpステートメントでこれを行っています

mysqldump -u user -p -d db > db_structure.sql
mysqldump -u user -p db --ignore-table=db.table3 > table1_and_table2_data.sql

ダンプされたのと同じ順序でそれらをインポートします(構造、次にtable1とtable2からのデータ)

これを単一のmysqldumpコマンドに組み合わせる方法はありますか?

31
Trevor

これらを1つのコマンドに結合することはできませんが、両方のコマンドを同時に実行して同じファイルに出力することはできます。

mysqldump -u user -p --no-data db > structure.sql; mysqldump -u user -p db table1 table2 >> structure.sql

パスワードを2回入力する必要がないようにするには、-ppasswordを実行できます(スペースが不足していることに注意してください)。また、最初のコマンドで--no-dataを使用しないと、データも使用できなくなります。 -dは、データベースを1つだけ実行する場合は必要ありません。

40
Cfreak

私が行ったように、ファイルにリダイレクトして次のコマンドでそのファイルに追加するのではなく、出力を別のコマンドにパイプしたい場合は、次のことを試すことができます(staskの例から変更)。

(mysqldump -u $1 -p$2 -d db && mysqldump -u $1 -p$2 db --ignore-table=db.table3) |\
your_command

... 私の場合:

(mysqldump -u $1 -p$2 -d db && mysqldump -u $1 -p$2 db --ignore-table=db.table3) |\
gzip -9 > filename.sql.gz

2つのmysqldumpコマンドを括弧で囲むと、サブシェルが作成され、その出力がgzipにパイプされてから、ファイルにリダイレクトされます。

PS:しかし、それを1つのmysqldump呼び出しに結合することもできませんでした。

6
0xC0000022L

実際には非常に単純です。データが不要なテーブルで--where句を使用し、常にfalseの条件を指定します。たとえば、fooとgahにデータをロードし、barにスキーマのみをロードします。

mysqldump -u ... -p... myDatabase foo bar --where='1=2' gah > myfile.sql

そうです、これは1行で実行できます。

0
Mycenae

INSERT INTO ...部分を削除できます。

mysqldump \
  --opt \
  -u ${DB_USER} -p${DB_PASS} \
  ${DB_NAME} \
  | grep -v 'INSERT INTO `table3`' \
  | grep -v 'INSERT INTO `table4`'
0
Eduardo Cuomo

1つのコマンドでそれを実行できるとは思いません。しかし、あなたは間違いなく出力を1つのファイルにマージすることができます。次のようなシェルスクリプトでラップしないのはなぜですか。

mysqldump -u $1 -p$2 -d db > dump.sql && mysqldump -u $1 -p$2 db --ignore-table=db.table3 >> dump.sql

このスクリプトは、ユーザー名とパスワードの2つのパラメーターを使用して実行します。

0
stask