mysqldump でビューのみをバックアップしたい。
これは可能ですか?
もしそうなら、どのように?
注:ケンからのこの回答は、提案された編集から独自の回答に移動しました。
上記のバリアントを使用した完全なコマンドラインの例を次に示します
mysql -u username INFORMATION_SCHEMA
--skip-column-names --batch
-e "select table_name from tables where table_type = 'VIEW'
and table_schema = 'database'"
| xargs mysqldump -u username database
> views.sql
これは、INFORMATION_SCHEMA データベースへのクエリを介してすべてのビュー名を抽出し、それらを xargs にパイプして mysqldump コマンドを作成します。--skip-column-names と --batch は、出力を xargs に適したものにするために必要です。多くのビューがある場合、このコマンド ラインが長くなりすぎる可能性があります。その場合、何らかのフィルタを選択に追加する必要があります (たとえば、特定の文字で始まるすべてのビューを検索します)。
複数のデータベースにまたがるビューのバックアップは、information_schema を使用するだけで実行できます。
mysql --skip-column-names --batch -e 'select CONCAT("DROP TABLE IF EXISTS ", TABLE_SCHEMA, ".", TABLE_NAME, "; CREATE OR REPLACE VIEW ", TABLE_SCHEMA, ".", TABLE_NAME, " AS ", VIEW_DEFINITION, "; ") table_name from information_schema.views'
データベース(およびその他の設定)を1回だけ指定できるように、Andomarの優れた回答を変更しました。
#!/bin/bash -e
mysql --skip-column-names --batch -e \
"select table_name from information_schema.views \
where table_schema = database()" $* |
xargs --max-args 1 mysqldump $*
これを次のように保存し、次のmysql-dump-views.sh
方法で呼び出します。
$ mysql-dump-views.sh -u user -ppassword databasename >dumpfile.sql
バックアップとは、データを含まない定義だけを意味していると思います。
現在、mysqldumpはVIEWとTABLEを区別していないようです。したがって、おそらく最善の方法は、コマンドラインでVIEWをmysqldumpに明示的に指定するか、mysqldumpの前にこのリストを動的に把握してから前のように渡すことです。 。
このクエリを使用して、特定のデータベース内のすべてのビューを取得できます。
SHOW FULL TABLES WHERE table_type='view';
mysqldumpの出力には、INFORMATION_SCHEMA からの単純なクエリでは再構築できないビューに関する多数の情報が含まれているため、OP が要求したようにできるだけ厳密に固執します。
これは、ソース データベースから配置ビュー スクリプトを作成する方法です。
SOURCEDB="my_source_db"
mysql $SOURCEDB --skip-column-names -B -e \
"show full tables where table_type = 'view'" \
| awk '{print $1}' \
| xargs -I {} mysqldump $SOURCEDB {} > views.sql