Mysqldumpでビューのみをバックアップしたい。
これは可能ですか?
もしそうなら、どうですか?
注: 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をわかりやすくするために必要です。ビューが多い場合、このコマンドラインは長くなりすぎる可能性があります。その場合は、選択に何らかのフィルタを追加する必要があります(たとえば、特定の文字で始まるすべてのビューを探します)。
私は 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
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'
バックアップとは、データなしの定義を意味するものと想定しています。
現在、mysqldumpはVIEWとTABLEを区別していないようです。おそらく、最善の方法は、mysqldumpのコマンドラインでVIEWを明示的に指定するか、mysqldumpの前にこのリストを動的に把握して、mysqldumpを以前のように渡すことです。 。
次のクエリを使用して、特定のデータベースのすべてのVIEWを取得できます。
SHOW FULL TABLES WHERE table_type='view';
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
この質問に答えるという点では、 olliiiver の answer がこれを直接行うのに最適です。私の答えとして、それを包括的な完全バックアップおよび復元ソリューションに組み込むことを試みます。
この質問の他の回答と他のいくつかのリソースを活用して、開発サーバーのデータベースをオンデマンドで運用サーバーのライブコピーに簡単に置き換えるためのこのスクリプトを思い付きました。すべてのデータベースではなく、一度に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 を適用して、最初に有効なビューの正確な名前のテーブルまたはビューを削除するようにしました存在する場合にインポート先のデータベースで、すべてのテーブルをインポートします。これにより、これらのビューが誤ってテーブルとして作成され、それらのテーブルが削除されて、それらのビューが適切に定義されます。
基本的には、次のように機能します。