Aller au contenu

POWERSHELL : Dump + restore + rétablissement réplication

Created with AIPRM Prompt « production engineer »

Dans le monde des bases de données, la réplication est un processus crucial qui assure la disponibilité et la durabilité des données. C’est particulièrement vrai pour les bases de données MySQL, où la réplication peut être utilisée à des fins diverses, comme le partage de la charge de travail, la sauvegarde des données et la récupération après sinistre.

Dans cet article, je vais partager un script PowerShell amélioré pour la réplication MySQL. L’objectif est de minimiser l’impact sur les applications actives tout en assurant une réplication correcte.

Dans le script, nous utilisons la commande mysqldump pour créer un dump de la base de données sur le master. Les options --hex-blob, --single-transaction, et --skip-lock-tables sont utilisées pour assurer la cohérence des données et minimiser les blocages.

# Définir les détails de la connexion
$MASTER = "machineMaster
$SLAVE = "machineSlave"
$DATABASE = "snowrappr"
$MYSQL_PATH = "D:\project\mysql\MySQL\Server8.0\bin\mysql.exe"
$MYSQLDUMP_PATH = "D:\project\mysql\MySQL\Server8.0\bin\mysqldump.exe"
$DUMP_FILE = "D:\project\mysql\dump.sql"
$NEW_DUMP_FILE = "D:\project\mysql\dump_new.sql" # Nouveau fichier dump pour éviter la collision
$CONFIG_FILE = "D:\project\mysql\MySQL\Server8.0\bin\restoreReplication.cnf" 
$USER = "user"
$PASSWORD = 'password'

try {
     # Dump de la base de données
    $DUMP_COMMAND = "& '$MYSQLDUMP_PATH' --defaults-file='$CONFIG_FILE' --hex-blob --single-transaction --skip-lock-tables -h $MASTER $DATABASE > $DUMP_FILE"
    Write-Host "Exécution de la commande : $DUMP_COMMAND"
    Invoke-Expression -Command:$DUMP_COMMAND

    # Créer un StreamReader pour lire le fichier
    $reader = [System.IO.StreamReader]::new($DUMP_FILE)
    # Créer un StreamWriter pour écrire le nouveau fichier
    $writer = New-Object System.IO.StreamWriter($NEW_DUMP_FILE, $false, [System.Text.Encoding]::UTF8)

    # Lire le fichier ligne par ligne
    while (($line = $reader.ReadLine()) -ne $null) {
        # Écrire chaque ligne dans le nouveau fichier
        $writer.WriteLine($line)
    }
    
    # Fermer le StreamReader et le StreamWriter
    $reader.Close()
    $writer.Close()

    # Restaurer la sauvegarde sur l'esclave
    $RESTORE_COMMAND = "cmd.exe /c '$MYSQL_PATH --binary-mode=1 -u $USER -p$PASSWORD -h $SLAVE $DATABASE < $NEW_DUMP_FILE'"
    Write-Host "Exécution de la commande : $RESTORE_COMMAND"
    Invoke-Expression -Command:$RESTORE_COMMAND

    # Obtenir les informations de l'état de réplication du master
    $MASTER_COMMAND = "& '$MYSQL_PATH' --defaults-file='$CONFIG_FILE' -h $MASTER -e 'SHOW MASTER STATUS\G'"
    Write-Host "Exécution de la commande : $MASTER_COMMAND"
    $MASTER_STATUS = Invoke-Expression -Command:$MASTER_COMMAND
    Write-Host "Master Status : $MASTER_STATUS"
    
    # Extraire les valeurs File et Position
    $LOG_FILE = ($MASTER_STATUS | Where-Object { $_ -match 'File' }).Split(':')[1].Trim()
    $LOG_POS = ($MASTER_STATUS | Where-Object { $_ -match 'Position' }).Split(':')[1].Trim()

    Write-Host "Log File : $LOG_FILE, Log Position : $LOG_POS"
    
    # Arrêter le thread IO esclave
    $STOP_SLAVE_IO_THREAD_COMMAND = "& '$MYSQL_PATH' --defaults-file='$CONFIG_FILE' -h $SLAVE -e 'STOP SLAVE IO_THREAD;'"
    Write-Host "Exécution de la commande : $STOP_SLAVE_IO_THREAD_COMMAND"
    Invoke-Expression -Command:$STOP_SLAVE_IO_THREAD_COMMAND

    # Définir le slave pour utiliser le master
    $CHANGE_MASTER_COMMAND = "& '$MYSQL_PATH' --defaults-file='$CONFIG_FILE' -h $SLAVE -e 'CHANGE MASTER TO MASTER_HOST=''$MASTER'',MASTER_LOG_FILE=''$LOG_FILE'',MASTER_LOG_POS=$LOG_POS'"
    Write-Host "Exécution de la commande : $CHANGE_MASTER_COMMAND"
    Invoke-Expression -Command:$CHANGE_MASTER_COMMAND

    # Redémarrer le thread IO esclave
    $START_SLAVE_IO_THREAD_COMMAND = "& '$MYSQL_PATH' --defaults-file='$CONFIG_FILE' -h $SLAVE -e 'START SLAVE IO_THREAD;'"
    Write-Host "Exécution de la commande : $START_SLAVE_IO_THREAD_COMMAND"
    Invoke-Expression -Command:$START_SLAVE_IO_THREAD_COMMAND

    # Démarrer la réplication sur le slave
    $START_SLAVE_COMMAND = "& '$MYSQL_PATH' --defaults-file='$CONFIG_FILE' -h $SLAVE -e 'START SLAVE'"
    Write-Host "Exécution de la commande : $START_SLAVE_COMMAND"
    Invoke-Expression -Command:$START_SLAVE_COMMAND
} catch {
    Write-Host "Une erreur s'est produite pendant la réplication: $_"
}

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *