С точки зрения ответа на этот вопрос, olliiiver ' answer - лучший способ сделать это напрямую. В качестве ответа я постараюсь встроить это в комплексное решение для полного резервного копирования и восстановления.
С помощью других ответов на этот вопрос и нескольких других ресурсов я придумал этот сценарий для простой замены базы данных на моем сервере разработки оперативной копией с рабочего сервера по требованию. Он работает на одной базе данных за раз, а не на всех базах данных. Хотя у меня есть отдельный скрипт для этого, здесь небезопасно делиться, так как он в основном отбрасывает и воссоздает все, кроме нескольких избранных баз данных, и ваша среда может отличаться.
Сценарий предполагает наличие корневой системы и пользователя 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 answer , чтобы сначала мы удалили все таблицы или представления с точными именами действительных представления в базе данных, в которую мы импортируем, если они существуют, затем импортируются все таблицы, которые могут ошибочно создавать эти представления в виде таблиц, а затем удалять эти таблицы и правильно определять эти представления.
Вот как это работает:
- проверить существование базы данных, указанной вами в командной строке
- использовать MYSQLDUMP для создания файла дампа
- SCP файл дампа с производства на указанный тестовый сервер
- выдает команды импорта на указанном тестовом сервере через SSH и возвращает результат
- удалить файл дампа с обоих серверов после завершения
- выдает разумный вывод для большинства шагов по пути