Наш сервер разработки является подчиненным репликации нашего производственного сервера. У нас есть сценарий, который разработчики используют, если хотят запускать свои приложения / исправлять ошибки на свежих данных. Этот сценарий выглядит так:
dbs=( analytics auth logs users )
server=localhost
conn="-h ${server} -u ${username} --password=${password}"
# Stop the replication client so we don't encounter weird data.
echo "STOP SLAVE" | mysql ${conn}
# Bunch of bulk insert optimizations
echo "SET autocommit=0" | mysql ${conn}
echo "SET unique_checks=0" | mysql ${conn}
echo "SET foreign_key_checks=0" | mysql ${conn}
# Restore all databases and tables.
for sourcedb in ${dbs[*]}
do
destdb=${prefix}${sourcedb}
echo "Dropping database ${destdb}..."
echo "DROP DATABASE IF EXISTS ${destdb}" | mysql ${conn}
echo "CREATE DATABASE ${destdb}" | mysql ${conn}
# First, all the tables.
for table in `echo "SHOW FULL TABLES WHERE Table_type <> 'VIEW'" | mysql $conn $sourcedb | tail -n +2`;
do
if [[ "${table}" != 'BASE' && "${table}" != 'TABLE' && "${table}" != 'VIEW' ]] ; then
createTable=`echo "SHOW CREATE TABLE ${table}"|mysql -B -r $conn $sourcedb|tail -n +2|cut -f 2-`
echo "Restoring ${destdb}/${table}..."
echo "$createTable ;" | mysql $conn $destdb
insertData="INSERT INTO ${destdb}.${table} SELECT * FROM ${sourcedb}.${table}"
echo "$insertData" | mysql $conn $destdb
fi
fi
done
done
echo "SET foreign_key_checks=1" | mysql ${conn}
echo "SET unique_checks=1" | mysql ${conn}
echo "COMMIT" | mysql ${conn}
# Restart the replication client
echo "START SLAVE" | mysql ${conn}
Все эти операции, как я уже упоминал, выполняются на одном сервере. Есть ли более быстрый способ клонировать таблицы, которых я не вижу? Это все таблицы INNODB.
Спасибо!
В вашем сценарии
echo "SET autocommit=0" | mysql ${conn}
echo "SET unique_checks=0" | mysql ${conn}
echo "SET foreign_key_checks=0" | mysql ${conn}
Каждый раз, когда выполняется команда, она немедленно отменяется, поскольку соединение с БД разрывается. Если бы вы поместили все свои команды в один файл и выполнили один файл, все параметры, которые вы отключаете, останутся отключенными в течение сеанса.
Я переписал сценарий, чтобы поместить все команды в один файл, как это сделал бы mysqldump. Я также изменил способ записи таблиц в виде команд. Затем я бы запустил один файл:
dbs=( analytics auth logs users )
server=localhost
conn="-h ${server} -u ${username} --password=${password}"
PREFIX=whatever
DUMPFILE=MySQLDataToClone.sql
echo "STOP SLAVE;" > ${DUMPFILE}
echo "SET autocommit=0;" >> ${DUMPFILE}
echo "SET unique_checks=0;" >> ${DUMPFILE}
echo "SET foreign_key_checks=0;" >> ${DUMPFILE}
for SRCDB in ${dbs[*]}
do
echo "DROP DATABASE IF EXISTS ${PREFIX}${SRCDB};" >> ${DUMPFILE}
echo "CREATE DATABASE ${PREFIX}${SRCDB};" >> ${DUMPFILE}
done
for SRCDB in ${dbs[*]}
do
SQLTOGETTABLES="SELECT CONCAT('CREATE TABLE ${PREFIX}',dbtb,' LIKE ',dbtb,'; INSERT INTO ${PREFIX}',dbtb,' SELECT * FROM dbtb;') FROM (SELECT CONCAT(table_schema,'.',table_name) dbtb FROM information_schema.tables WHERE table_schema='${SRCDB}' AND engine IS NOT NULL) A;"
mysql $conn -ANe"${SQLTOGETTABLES}" >> ${DUMPFILE}
done
echo "START SLAVE;" >> ${DUMPFILE}
mysql ${conn} < ${DUMPFILE}
Попробуйте !!!