J'ai une base de données MySQL de 300 Go que je souhaite migrer vers un autre serveur afin de configurer la réplication Master-Master entre les deux et mon objectif principal est de le réaliser avec le moins de temps d'arrêt possible.
Ma base de données n'a qu'une seule table d'environ 30 Go où des inserts se produisent autour de l'horloge. Toutes les autres tables sont des tables d'histoire (statique).
1) Quel sera le meilleur moyen d'aller de l'avant dans ce cas?
Prenant MySqldump de toute la base de données et transférer le dépotoir à un autre serveur et l'importer sur le nouveau serveur fera le travail que je souhaite réaliser, mais prendra beaucoup de temps d'arrêt (peut-être plus de 14 heures) qui n'est pas autorisée.
Ou puis-je prendre des décharges de table individuelles pour les tables statiques sans arrêter MySQL et l'importer sur le nouveau serveur, et après tout cela se passe, prenez des temps d'arrêt pour la seule table active de sorte qu'aucun nouveau insertions ne se produise et que mes deux bases de données seront synchronisées. ? Tout d'abord, est-il possible de faire une telle chose? Et si possible, quels problèmes il pourrait présenter lors de la mise en place d'une réplication principale-maître?
Cette solution peut être faite avec MySQLDUMP, mais avec un peu de risque
Par souci de cet exemple, supposons que vous ayez ce qui suit:
mydb
10.20.30.40
10.20.30.50
root
sur les serveurs DB de la source et de la ciblewhatever
sur les serveurs DB source et ciblemysql-bin
Voici vos pas
Sur le maître en direct, courez ce qui suit
CREATE USER repluser@'%' IDENTIFIED BY 'replpass';
GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO repluser@'%';
Sur le serveur de DB cible, exécutez ce qui suit:
Si vous avez activé GTID sur les serveurs source et cible, faites ceci:
CHANGE MASTER TO
master_Host='10.20.30.40',
master_port=3306,
master_user='repluser',
master_password='replpass',
master_auto_position=1;
Si vous n'avez pas de GTID activé sur les serveurs source et cibles, procédez comme suit:
CHANGE MASTER TO
master_Host='10.20.30.40',
master_port=3306,
master_user='repluser',
master_password='replpass',
master_log_file='mysql-bin.000001',
master_log_pos=4;
Créez un script shell appelé live_dump_and_load.sh
Mettre les lignes suivantes en elle
MYSQL_USER=root
MYSQL_PASS=whatever
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
DB_TO_DUMP=mydb
MYSQLDUMP_OPTIONS="--routines --triggers"
MYSQLDUMP_OPTIONS="${MYSQLDUMP_OPTIONS} --master-data=1"
MYSQLDUMP_OPTIONS="${MYSQLDUMP_OPTIONS} --single_transaction"
MYSQLDUMP_OPTIONS="${MYSQLDUMP_OPTIONS} -B ${DB_TO_DUMP}"
date > live_dump_and_load.runlog
mysqldump ${MYSQL_CONN} ${MYSQLDUMP_OPTIONS} | mysql -h10.20.30.50 ${MYSQL_CONN}
date >> live_dump_and_load.runlog
chmod +x live_dump_and_load.sh
Nohup ./live_dump_and_load.sh &
watch cat live_dump_and_load.runlog
Lorsque le décharge est chargé sur le serveur cible, accédez au serveur cible et exécutez
START SLAVE;
xtrabackup
J'ai déjà été dans des situations similaires et cela rend vraiment cela tellement plus facile. Quant à la manière dont vous l'utiliserez pour minimiser les temps d'arrêt, vous devez décider, mais un scénario possible pourrait être:
Vous pouvez probablement éliminer les temps d'arrêt en n'arrimant pas les inserts et simplement comparer la nouvelle table de 30 Go sur le nouveau serveur à sa contrepartie sur le serveur d'origine, puis simplement la mettre à jour en fonction d'un décalage d'identification ou d'une similaire. Ceci est désordonné cependant et dans la raison pour laquelle je préférerais le temps d'arrêt.
Edit: Vous pouvez également éliminer entièrement les temps d'arrêt à l'aide de la position logfile répertoriée dans le fichier xtrabackup_binlog_info
voir le lien suivant: https://www.percona.com/doc/percona-xtrabackup/latest/howtos/setting_up_replication.html
J'ai fait quelque chose de similaire il y a une semaine et je suis d'accord avec Marcplusplus, Xtrabackup est la voie à suivre.
Cependant, j'ai quelques modifications à sa procédure.
-Quand la sauvegarde est terminé (ou juste avant) arrête tout écrit au maître d'origine.
Cela dépend du nombre de transactions/secondes dans votre base de données d'origine. Dans mon cas, je suis sur une base de données innoDb avec GTID's et j'ai environ 5 000 transactions/s sur une table de 260 Go. La serrure à la fin de la sauvegarde était d'environ 30 ans. Tous les clients ont récupéré très vite en utilisant les 3 cœurs de rechange que mon CPU a. Les clients n'ont rien remarqué.
La copie des données d'un à un autre hôte est la grosse affaire. Cela prend son temps et après le démarrage de la nouvelle machine, vous obtiendrez une longue période pour que la nouvelle machine soit rattrape avec Maître.
Pour accélérer cette utilisation de rattrapage slave_parallel_workers
.
mettre
slave_parallel_type = LOGICAL_CLOCK
slave_parallel_workers = 4
dans votre nouveau fichier de configuration MySQL
Dans mon cas, la réplication a entraîné 10 heures de retard dans une demi-journée.