web-dev-qa-db-ja.com

Mysql Dumpを使用したビューのバックアップ

Mysqldumpでビューのみをバックアップしたい。

これは可能ですか?

もしそうなら、どうですか?

26
Charles Faiga

注: Ken からのこの回答は、提案された編集から独自の回答に移動しました。

上記のバリアントを使用した完全なコマンドラインの例を次に示します

 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をわかりやすくするために必要です。ビューが多い場合、このコマンドラインは長くなりすぎる可能性があります。その場合は、選択に何らかのフィルタを追加する必要があります(たとえば、特定の文字で始まるすべてのビューを探します)。

24
Andomar

私は Andomarの素晴らしい答え を変更して、データベース(およびその他の設定)を1回だけ指定できるようにしました。

#!/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
16
Ross Smith II

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'
9
olliiiver

バックアップとは、データなしの定義を意味するものと想定しています。

現在、mysqldumpはVIEWとTABLEを区別していないようです。おそらく、最善の方法は、mysqldumpのコマンドラインでVIEWを明示的に指定するか、mysqldumpの前にこのリストを動的に把握して、mysqldumpを以前のように渡すことです。 。

次のクエリを使用して、特定のデータベースのすべてのVIEWを取得できます。

SHOW FULL TABLES WHERE table_type='view';

3

INFORMATION-SCHEMAからの単純なクエリでは再構築できないビューに関する多くの情報が含まれているため、OPが尋ねるようにmysqldumpの出力にできるだけ近づけます。

これは、ソースデータベースから配置ビュースクリプトを作成する方法です。

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
0
gerrit_hoekstra

この質問に答えるという点では、 olliiiveranswer がこれを直接行うのに最適です。私の答えとして、それを包括的な完全バックアップおよび復元ソリューションに組み込むことを試みます。

この質問の他の回答と他のいくつかのリソースを活用して、開発サーバーのデータベースをオンデマンドで運用サーバーのライブコピーに簡単に置き換えるためのこのスクリプトを思い付きました。すべてのデータベースではなく、一度に1つのデータベースで動作します。私はそのための個別のスクリプトを用意していますが、選択したいくつかのデータベースを除いて基本的にすべてを削除して再作成するため、ここで共有することは安全ではありません。

このスクリプトは、両方のマシンでrootシステムとMySQLユーザー(変更可能です)を想定しており、サーバー間でパスワードなしのSSHが機能し、各マシンのMySQLパスワードファイル/root/mysqlroot.cnfに依存しています。

[client]
password=YourPasswordHere

ファイル:synctestdb.sh、使いやすさのためにオプションで/ usr/sbin/synctestdbにシンボリックリンク

Usage: synctestdb DBNAME DESTSERVER

本番サーバーから実行します。

ここにあります:

#!/bin/bash

if [ "${1}" != "" ] && [ "${1}" != "--help" ] && [ "${2}" != "" ] ; then

    DBNAME=${1}
    DESTSERVER=${2}
    BKDATE=$( date "+%Y-%m-%d" );
    SRCHOSTNAME=$( /bin/hostname )
    EXPORTPATH=/tmp
    EXPORTFILE=/tmp/${SRCHOSTNAME}_sql_${BKDATE}_devsync.sql
    CREDSFILE=/root/mysqlroot.cnf
    SSHUSER=root

    DBEXISTS=$( echo "SHOW DATABASES LIKE '${DBNAME}'" \
      | mysql --defaults-extra-file=${CREDSFILE} -NB INFORMATION_SCHEMA )

    if [ "${DBEXISTS}" == "${DBNAME}" ] ; then
        echo Preparing --ignore-tables parameters for all relevant views
        echo
        #build --ignore-table parameters list from list of all views in
        #relevant database - as mysqldump likes to recreate views as tables
        #we pair this with an export of the view definitions later below
        SKIPVIEWS=$(mysql --defaults-extra-file=${CREDSFILE} \
          -NB \
          -e "SELECT \
            CONCAT( '--ignore-table=', TABLE_SCHEMA, '.', TABLE_NAME ) AS q \
            FROM INFORMATION_SCHEMA.VIEWS \
            WHERE TABLE_SCHEMA = '${DBNAME}';" )

        if [ "$?" == "0" ] ; then

            echo Exporting database ${DBNAME}
            echo
            mysqldump --defaults-extra-file=${CREDSFILE} ${SKIPVIEWS}  \
              --add-locks --extended-insert --flush-privileges --no-autocommit \
              --routines --triggers --single-transaction --master-data=2 \
              --flush-logs --events --quick --databases ${DBNAME} > ${EXPORTFILE} \
              || echo -e "\n\nERROR: ${SRCHOSTNAME} failed to mysqldump ${DBNAME}"
            echo Exporting view definitions
            echo
            mysql --defaults-extra-file=${CREDSFILE} \
              --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, '; ') AS TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS \
                WHERE TABLE_SCHEMA = '${DBNAME}';" >> ${EXPORTFILE} \
              || echo -e "\n\nERROR: ${SRCHOSTNAME} failed to mysqldump view definitions"
            echo Export complete, preparing to transfer export file and import
            echo
            STATUSMSG="SUCCESS: database ${DBNAME} synced from ${SRCHOSTNAME} to ${DESTSERVER}"
            scp \
              ${EXPORTFILE} \
              ${SSHUSER}@${DESTSERVER}:${EXPORTPATH}/ \
              || STATUSMSG="ERROR: Failed to SCP file to remote server ${DESTSERVER}"
            ssh ${SSHUSER}@${DESTSERVER} \
              "mysql --defaults-extra-file=${CREDSFILE} < ${EXPORTFILE}" \
              || STATUSMSG="ERROR: Failed to update remote server ${DESTSERVER}"
            ssh ${SSHUSER}@${DESTSERVER} \
              "rm ${EXPORTFILE}" \
              || STATUSMSG="ERROR: Failed to remove import file from remote server ${DESTSERVER}"
            rm ${EXPORTFILE}
            echo ${STATUSMSG}

        else
            echo "ERROR: could not obtain list of views from INFORMATION_SCHEMA"
        fi

    else
        echo "ERROR: specified database not found, or SQL credentials file not found"
    fi

else
    echo -e "Usage: synctestdb DBNAME DESTSERVER \nPlease only run this script from the live production server\n"
fi

これまでのところそれは機能しているように見えますが、目的に合わせて調整することもできます。資格情報ファイルがどこにあっても、安全なアクセス権が設定されていることを確認してください。これにより、権限のないユーザーはファイルを読み取ることができません。

ビューを適切にエクスポートするのは難しいようですので、 olliiiver 's answer を適用して、最初に有効なビューの正確な名前のテーブルまたはビューを削除するようにしました存在する場合にインポート先のデータベースで、すべてのテーブルをインポートします。これにより、これらのビューが誤ってテーブルとして作成され、それらのテーブルが削除されて、それらのビューが適切に定義されます。

基本的には、次のように機能します。

  • コマンドラインで指定したデータベースの存在を確認する
  • mYSQLDUMPを使用してダンプファイルを作成する
  • ダンプファイルを本番から指定されたテストサーバーにSCPします。
  • sSHを介して指定されたテストサーバーでインポートコマンドを発行し、出力を返す
  • 完了後、両方のサーバーからダンプファイルを削除する
  • 途中のほとんどのステップで、適切な出力を発行します
0
RedScourge