Come devo migrare un grande database MySQL su RDS?


8

Ho già esaminato un po 'questo. Mi rendo conto che ci sono domande simili su Stack Overflow e Amazon stesso ha un documento utile che fornisce consigli qui:

http://aws.amazon.com/articles/2933

Le mie preoccupazioni sono le seguenti:

Amazon consiglia di utilizzare mysqldumpsolo per "piccole quantità di dati", che definiscono meno di 1 GB. Il database che intendo migrare è di oltre 20 GB.

Una cosa interessante mysqldump, tuttavia, è che ha il --single-transactionflag, che mi consente di garantire uno stato DB coerente con un singolo punto nel tempo.

Per grandi quantità di dati, la raccomandazione di Amazon è di esportare il database in file flat (ad es. CSV) e quindi utilizzarli mysqlimportper importarli in RDS. Il modo migliore che conosco come fare questo , però, è attraverso il SELECT ... INTO OUTFILEcomando, che opera solo una tabella alla volta. L'aspetto negativo di questo, ovviamente, è che non fornisce la garanzia di coerenza di --single-transaction.

Suppongo di poter garantire la coerenza eliminando temporaneamente l'intero DB; ma vorrei evitarlo, se possibile.

  1. Qual è il modo migliore per ottenere il mio database di grandi dimensioni (> 20 GB) in file flat in modo da poterlo utilizzare mysqlimport?
  2. Se è davvero il SELECT ... INTO OUTFILEcomando, come posso esportare tutte le tabelle nel database (preferibilmente senza doverne fare una alla volta)?
  3. Esiste un buon modo per garantire coerenza in tutto ciò?

1
Questo è probabilmente un adattamento migliore per ServerFault; votato a migrare

1
Ci hai provato - ti stai solo chiedendo? L'altro giorno ho avuto a che fare con un database 40G usando mysqldump - ci vuole solo un po 'di tempo. Ma --optè l'impostazione predefinita, che accelera le cose. Penso che abbiamo impiegato 6 ore per ricaricare su un server potente, ma le transizioni sono transizioni ... :)
gahooa

@gahooa: bella domanda. Non l' ho ancora provato, principalmente perché dalla documentazione di Amazon sembrava non essere raccomandato. Ma posso solo andare avanti e farlo.

Risposte:


5

Di recente ho trascorso molto tempo a cercare di capire una transizione da 15 GB a RDS. Alla fine ho trovato una sceneggiatura su uno dei forum di Amazon che ho modificato per i miei usi e sembra funzionare bene. Non sono sicuro che sia possibile eseguire un'unica transazione, ma il dump stesso è molto rapido rispetto al trasferimento effettivo. Penso che 15 GB mi abbiano impiegato solo 12 minuti per il dump, quindi anche se non ha una singola opzione di transazione non penso che avresti un lasso di tempo molto lungo perché si verifichino incoerenze. Non sono sicuro che sia abbastanza buono per te, ma ho trovato la soluzione molto più elegante del metodo del file flat.

#!/bin/bash

declare -a dbs=(dbname1 dbname2 dbname3 dbname4);

j=0
while [ $j -lt 4 ];
#4 is the number of dbs
do

echo "Dumping ${dbs[$j]} DB"
time mysqldump --order-by-primary --host=sourcehost --user=sourceuser --password=sourcepass `echo ${dbs[$j]}` > /tmp/`echo ${dbs[$j]}`.sql
echo "Adding optimizations to ${dbs[$j]}"
awk 'NR==1{$0="SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0;\n"$0}1' /tmp/`echo ${dbs[$j]}`.sql >> /tmp/`echo ${dbs[$j]}`X.sql
mv /tmp/`echo ${dbs[$j]}`X.sql /tmp/`echo ${dbs[$j]}`.sql
echo "SET unique_checks=1; SET foreign_key_checks=1; COMMIT;" >> /tmp/`echo ${dbs[$j]}`.sql
echo "Copy ${dbs[$j]} into RDS"
time mysql --host=yourrds.rds.amazonaws.com --user=rdsuser --password=rdspassword `echo ${dbs[$j]}` < /tmp/`echo ${dbs[$j]}`.sql &

j=$(($j+1))
done 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.