私のデータベースには、table1、table2、table3の3つのテーブルがあります。
このデータベースで次の条件でmysqldumpを実行したいと思います。
現在、私は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コマンドに組み合わせる方法はありますか?
これらを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つだけ実行する場合は必要ありません。
私が行ったように、ファイルにリダイレクトして次のコマンドでそのファイルに追加するのではなく、出力を別のコマンドにパイプしたい場合は、次のことを試すことができます(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呼び出しに結合することもできませんでした。
実際には非常に単純です。データが不要なテーブルで--where句を使用し、常にfalseの条件を指定します。たとえば、fooとgahにデータをロードし、barにスキーマのみをロードします。
mysqldump -u ... -p... myDatabase foo bar --where='1=2' gah > myfile.sql
そうです、これは1行で実行できます。
INSERT INTO ...
部分を削除できます。
mysqldump \
--opt \
-u ${DB_USER} -p${DB_PASS} \
${DB_NAME} \
| grep -v 'INSERT INTO `table3`' \
| grep -v 'INSERT INTO `table4`'
1つのコマンドでそれを実行できるとは思いません。しかし、あなたは間違いなく出力を1つのファイルにマージすることができます。次のようなシェルスクリプトでラップしないのはなぜですか。
mysqldump -u $1 -p$2 -d db > dump.sql && mysqldump -u $1 -p$2 db --ignore-table=db.table3 >> dump.sql
このスクリプトは、ユーザー名とパスワードの2つのパラメーターを使用して実行します。