web-dev-qa-db-fra.com

Migration de la base de données MySQL de 300 Go d'un serveur à une autre proprement avec un temps d'arrêt minimum

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?

  • Ou y a-t-il une autre méthode pour le faire avec des temps d'arrêt très moins?
4
AJAY

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:

  • Le nom de la base de données est mydb
  • L'IP privée de Source DB Server est 10.20.30.40
  • La propriété intellectuelle de la cible du serveur DB est 10.20.30.50
  • L'utilisateur est root sur les serveurs DB de la source et de la cible
  • Le mot de passe est whatever sur les serveurs DB source et cible
  • Les journaux binaires sur les deux serveurs sont nommés mysql-bin

Voici vos pas

Étape 01: Créer un utilisateur de réplication

Sur le maître en direct, courez ce qui suit

CREATE USER repluser@'%' IDENTIFIED BY 'replpass';
GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO repluser@'%';

Étape 02: Configurer la réplication

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;

Étape 03: Créez un script pour effectuer Live MySqldump et Load

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

Étape 04: Exécutez le script shell

chmod +x live_dump_and_load.sh
Nohup ./live_dump_and_load.sh &

Étape 05: Surveillez le journal de course

watch cat live_dump_and_load.runlog

Étape 06: Démarrer la réplication

Lorsque le décharge est chargé sur le serveur cible, accédez au serveur cible et exécutez

START SLAVE;

ESSAIE !!!

5
RolandoMySQLDBA

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:

  • Utilisez la fonction de sauvegarde à chaud pour éliminer les temps d'arrêt pendant la création de sauvegarde réelle.
  • Lorsque la sauvegarde est terminée (ou juste avant), arrêtez tout écrit au maître d'origine.
  • Transférer le répertoire/des fichiers de sauvegarde (doit être similaire au répertoire de DB principal) le plus rapidement possible à la nouvelle esclave simultanément, à l'aide de rsync ou LFTP ou quelque chose Comme ça ( Bittorent serait le plus rapide le plus rapide mais probablement nécessaire si le nouvel esclave est géographiquement éloigné de l'original).
  • Déposer le nouvel esclave aussi vite que possible. Toutes les configurations, la configuration, etc. doivent être déjà en place.
  • Réactiver les écrivies sur le maître d'origine avec une réplication activée.

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

0
MarCPlusPlus

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.

0
jgnoss