Проблема: мне нужно сделать резервную копию баз данных нескольких серверов (иногда одну таблицу, иногда все таблицы в базе данных), а также в одном случае реплицировать базу данных каждую ночь.
Итак, это копирование базы данных в базу данных. Вы можете сказать, используйте репликацию mysql, однако я пытаюсь добиться этого без использования репликации mysql, поскольку у меня не всегда есть доступ для настройки этого на удаленных серверах.
Чтобы уточнить, это серверы в разных местах, а не в одном и том же месте. Я знаю много решений, когда таблицы существуют в базах данных на одном сервере, но варианты кажутся гораздо более ограниченными, когда это не так.
Мне нужно, чтобы это работало по расписанию, которое я могу настроить, скажем, один раз в день полностью автоматически, копируя и перезаписывая целевые таблицы данными из источника.
Я знаю из проведенного мной исследования коммерческого продукта Windows, который может это сделать (SQLyog), но я хотел узнать, знает ли кто-нибудь об альтернативах и, возможно, для Linux, а также для Windows.
1) Создайте этот backupdb.sh
скрипт, который копирует удаленную базу данных MySQL в вашу локальную базу данных:
#!/bin/bash
DBUSER=$1
DBPASSWORD=$2
DBSNAME=$3
DBNAME=$4
DBSERVER=$5
LOCALDBUSER=$6
LOCALDBPASSWORD=$7
LOCALDBSERVER=$8
fCreateTable=""
fInsertData=""
echo "Copying database ... (may take a while ...)"
DBCONN="-h ${DBSERVER} -u ${DBUSER} --password=${DBPASSWORD}"
LOCALDBCONN="-h ${LOCALDBSERVER} -u ${LOCALDBUSER} --password=${LOCALDBPASSWORD}"
echo "DROP DATABASE IF EXISTS ${DBNAME}" | mysql ${LOCALDBCONN}
echo "CREATE DATABASE ${DBNAME}" | mysql ${LOCALDBCONN}
for TABLE in `echo "SHOW TABLES" | mysql $DBCONN $DBSNAME | tail -n +2`; do
createTable=`echo "SHOW CREATE TABLE ${TABLE}"|mysql -B -r $DBCONN $DBSNAME|tail -n +2|cut -f 2-`
fCreateTable="${fCreateTable} ; ${createTable}"
insertData="INSERT INTO ${LOCALDBNAME}.${TABLE} SELECT * FROM ${DBSNAME}.${TABLE}"
fInsertData="${fInsertData} ; ${insertData}"
done;
echo "$fCreateTable ; $fInsertData" | mysql $LOCALDBCONN $DBNAME
( написано jozjan и изменено )
2) Напишите скрипт backupalldbs.sh
для его вызова для каждой базы данных, которую вы хотите создать резервную копию, например:
#!/bin/bash
backupdb.sh adam iwg74e9R thedb thedb server.example.com localuser localpassword localserver
backupdb.sh nico of2D9872 adb adb server.example.org localuser localpassword localserver
...
3) Наконец, вызовите этот скрипт с помощью cron
планировщика Linux.
Написан для Linux, но заставить его работать в Windows не должно быть слишком сложно после установки bash для Windows.
Николя Рауль
Адам Джонс