Назад | Перейти на главную страницу

Каков самый быстрый способ клонировать таблицу INNODB на одном сервере?

Наш сервер разработки является подчиненным репликации нашего производственного сервера. У нас есть сценарий, который разработчики используют, если хотят запускать свои приложения / исправлять ошибки на свежих данных. Этот сценарий выглядит так:

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}

Попробуйте !!!