Qual é a maneira mais rápida de clonar uma tabela INNODB dentro do mesmo servidor?

1

Nosso servidor de desenvolvimento é um escravo de replicação do nosso servidor de produção. Temos um script que os desenvolvedores usam se quiserem executar seus aplicativos / correções de bugs em relação a dados novos. Esse script é assim:

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}

Todas essas operações são, como eu mencionei, dentro do mesmo servidor. Existe uma maneira mais rápida de clonar as tabelas que não estou vendo? Todas são tabelas INNODB.

Obrigado!

    
por Vic 12.06.2012 / 07:16

1 resposta

1

No seu script

echo "SET autocommit=0" | mysql ${conn}
echo "SET unique_checks=0" | mysql ${conn}
echo "SET foreign_key_checks=0" | mysql ${conn}

Cada vez que um comando é executado, ele é imediatamente desfeito porque a conexão com o banco de dados é encerrada. Se você tivesse colocado todos os seus comandos em um único arquivo e executado o arquivo único, todas as opções que você está desabilitando ficariam desligadas durante a sessão.

Eu reescrevi o script para colocar todos os comandos em um único arquivo, assim como um mysqldump teria. Eu também mudei a forma como as tabelas são escritas como comandos. Então, eu rodaria o arquivo único:

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}

Experimente!

    
por 12.06.2012 / 23:19

Tags