Если у вас есть следующие условия
- Доступ к Live DB можно получить по общедоступному IP-адресу
- Все необходимые таблицы имеют InnoDB
Вы можете выполнитьmysqldump отдельных таблиц
Вот как использование сценария оболочки может выполнить это при запуске с локального компьютера:
LIVEDB_IP=192.168.1.10
MYSQL_SRCUSER=whateverusername
MYSQL_SRCPASS=whateverpassword
MYSQL_SRCCONN="-h${LIVEDB_IP} -u${MYSQL_SRCUSER} -p${MYSQL_SRCPASS}"
SOURCE_DB=mydb_source
MYSQL_TGTUSER=whateverusername2
MYSQL_TGTPASS=whateverpassword2
MYSQL_TGTCONN="-h127.0.0.1 -u${MYSQL_TGTUSER} -p${MYSQL_TGTPASS}"
TARGET_DB=mydb_target
TBLLIST="tb1 tb2 tb3"
for TB in `echo "${TBLLIST}"`
do
mysqldump ${MYSQL_SRCCONN} --single-transaction ${SOURCE_DB} ${TB} | mysql ${MYSQL_TGTCONN} -A -D${TARGET_DB} &
done
wait
Опция --single-transaction
вызывает моментальный снимок временитаблица должна выполняться, но в то же время разрешать операции INSERT, UPDATE и DELETE в исходной базе данных.
Если таблицы довольно большие, могут возникнуть проблемы с тайм-аутом.Вместо этого попробуйте этот скрипт:
LIVEDB_IP=192.168.1.10
MYSQL_SRCUSER=whateverusername
MYSQL_SRCPASS=whateverpassword
MYSQL_SRCCONN="-h${LIVEDB_IP} -u${MYSQL_SRCUSER} -p${MYSQL_SRCPASS}"
SOURCE_DB=mydb_source
MYSQL_TGTUSER=whateverusername2
MYSQL_TGTPASS=whateverpassword2
MYSQL_TGTCONN="-h127.0.0.1 -u${MYSQL_TGTUSER} -p${MYSQL_TGTPASS}"
TARGET_DB=mydb_target
TBLLIST="tb1 tb2 tb3"
for TB in `echo "${TBLLIST}"`
do
mysqldump ${MYSQL_SRCCONN} --single-transaction ${SOURCE_DB} ${TB} | gzip > ${TB}.sql.gz &
done
wait
for TB in `echo "${TBLLIST}"`
do
gzip -d < ${TB}.sql.gz | mysql ${MYSQL_TGTCONN} -A -D${TARGET_DB} &
done
wait
Попробуйте! !!!
CAVEAT
Если нужны таблицы MyISAM, просто удалите --single-transaction
из mysqldump.Это может привести к зависанию запросов в исходной базе данных до тех пор, пока mysqldump не завершит работу с таблицами, которые нужны запросам.В этом случае просто выполните этот сценарий в часы с низким трафиком.