"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Python. Automatisation des sauvegardes de création de base de données MySQL.

Python. Automatisation des sauvegardes de création de base de données MySQL.

Publié le 2024-07-31
Parcourir:367

Python. Automating creation backups of MySQL database.

Ce script automatise la création de sauvegardes de bases de données MySQL, leur restauration et la gestion de la création de bases de données et d'utilisateurs sur le serveur MySQL de destination.

import subprocess
import datetime
import sys
import os

def check_and_create_database(host, port, username, password, database):
    # Command to check if the database exists
    check_database_command = f"mysql -sN --host={host} --port={port} --user={username} --password={password} -e \"SELECT EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '{database}')\" 2>/dev/null"

    # Execute the command
    output = subprocess.check_output(check_database_command, shell=True)

    # If the output contains b'1', the database exists
    if b'1' in output:
        subprocess.run(check_database_command, shell=True, check=True)
        print(f"Database '{database}' already exists.")
        sys.exit(1)
    else:
        # If the command fails, the database does not exist
        print(f"Database '{database}' does not exist. Creating...")

        # Command to create the database
        create_database_command = f"mysql --host={host} --port={port} --user={username} --password={password} -e 'CREATE DATABASE {database}' 2>/dev/null"
        subprocess.run(create_database_command, shell=True)

def check_and_create_user(host, port, username, password, database, new_username, new_password):
    # Command to check if the user exists
    check_user_command = f"mysql -sN --host={host} --port={port} --user={username} --password={password} -e \"SELECT EXISTS(SELECT 1 FROM mysql.user WHERE user = '{new_username}')\" 2>/dev/null"

    # Execute the command
    output = subprocess.check_output(check_user_command, shell=True)

    # If the output contains b'1', the user exists
    if b'1' in output:
        print(f"User '{new_username}' already exists.")
        sys.exit(1)
    else:
        # The user does not exist, create it
        print(f"User '{new_username}' does not exist. Creating...")

        # Command to create the user and grant privileges
        create_user_command = f"mysql --host={host} --port={port} --user={username} --password={password} -e \"CREATE USER '{new_username}'@'%' IDENTIFIED BY '{new_password}'; GRANT ALL PRIVILEGES ON {database}.* TO '{new_username}'@'%'; FLUSH PRIVILEGES;\" 2>/dev/null"
        subprocess.run(create_user_command, shell=True)

def backup_mysql_database(host, port, username, password, database, backup_path):

    # Check if the backup directory exists
    if not os.path.exists(backup_path):
        print(f"Error: Backup directory '{backup_path}' does not exist.")
        sys.exit(1)

    # Create a filename for the backup with the current date and time
    timestamp = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
    backup_file = f"{backup_path}/{database}_{timestamp}.sql"

    # Command to create a database backup using mysqldump
    dump_command = f"mysqldump --no-tablespaces --host={host} --port={port} --user={username} --password={password} {database} > {backup_file} 2>/dev/null"

    # Execute the mysqldump command
    subprocess.run(dump_command, shell=True)

    return backup_file

def restore_mysql_database(host, port, username, password, database, backup_file):
    # Command to restore a database from a backup using mysql
    restore_command = f"mysql --host={host} --port={port} --user={username} --password={password} {database} /dev/null"

    # Execute the mysql command
    subprocess.run(restore_command, shell=True)

def main():
    # Connection parameters to the source MySQL database
    source_host = "127.0.0.1"
    source_port = "3309"
    source_username = "my_user"
    source_password = "my_password"
    source_database = "my_database"

    # Connection parameters to the target MySQL database
    target_host = "127.0.0.1"
    target_port = "3309"
    new_username = "new_username"
    new_password = "new_password"
    target_database = "my_database_two"

    target_username = "root"
    target_password = "root_password"

    # Path to save the backup locally
    backup_path = "my_dbs_dumps"

    # Check if source_database is different from target_database
    if source_database == target_database:
        print("Error: Source database should be different from target database.")
        sys.exit(1)

    # Check and create the target database if it does not exist
    check_and_create_database(target_host, target_port, target_username, target_password, target_database)

    # Check and create the target user if it does not exist
    check_and_create_user(target_host, target_port, target_username, target_password, target_database, new_username, new_password)

    # Create a backup of the MySQL database
    backup_file = backup_mysql_database(source_host, source_port, source_username, source_password, source_database, backup_path)
    print(f"Database backup created: {backup_file}")

    # Restore the database on the target server from the backup
    restore_mysql_database(target_host, target_port, target_username, target_password, target_database, backup_file)
    print("Database backup restored on the target server.")

if __name__ == "__main__":
    main()

check_and_create_database :
Cette fonction vérifie si une base de données existe sur un serveur MySQL. Si la base de données n'existe pas, il la crée. Il faut des paramètres tels que l'hôte, le port, le nom d'utilisateur, le mot de passe et le nom de la base de données pour vérifier ou créer.

check_and_create_user :
Comme la fonction base de données, cette fonction vérifie si un utilisateur existe sur le serveur MySQL. Si l'utilisateur n'existe pas, il le crée et accorde des privilèges à une base de données spécifique. Il prend également des paramètres tels que l'hôte, le port, le nom d'utilisateur, le mot de passe, le nom de la base de données, le nouveau nom d'utilisateur et le nouveau mot de passe.

backup_mysql_database :
Cette fonction effectue une sauvegarde d'une base de données MySQL à l'aide de mysqldump. Il prend des paramètres tels que l'hôte, le port, le nom d'utilisateur, le mot de passe, le nom de la base de données et le chemin pour enregistrer le fichier de sauvegarde.

restore_mysql_database :
Cette fonction restaure une base de données MySQL à partir d'un fichier de sauvegarde. Il prend des paramètres tels que l'hôte, le port, le nom d'utilisateur, le mot de passe, le nom de la base de données et le chemin d'accès au fichier de sauvegarde.

principal:
C'est la fonction principale du script. Il configure les paramètres des bases de données MySQL source et cible, y compris les détails de connexion, les noms de bases de données et les chemins de sauvegarde. Il effectue ensuite des vérifications pour s'assurer que les bases de données source et cible sont différentes, crée la base de données cible et l'utilisateur s'ils n'existent pas, crée une sauvegarde de la base de données source et enfin restaure la sauvegarde sur la base de données cible.

De plus, le script utilise le module de sous-processus pour exécuter des commandes shell pour les opérations MySQL (mysql, mysqldump) et effectue la gestion des erreurs et la redirection de sortie (2>/dev/null) pour supprimer les sorties inutiles.

Si vous travaillez avec des bases de données MySQL et souhaitez créer une automatisation, ce code vous aidera.

Ce code représente un bon modèle de départ pour créer des scripts d'automatisation pour la gestion des bases de données MySQL.

dmi@dmi-laptop:~/my_python$ python3 mysql_backup_restore.py 
Database 'my_database_two' does not exist. Creating...
User 'new_username' does not exist. Creating...
Database backup created: my_dbs_dumps/my_database_2024-05-13_20-05-24.sql
Database backup restored on the target server.
dmi@dmi-laptop:~/my_python$ 

[email protected]

Déclaration de sortie Cet article est reproduit sur : https://dev.to/dm8ry/python-automating-creation-backups-of-mysql-database-2goa?1 En cas de violation, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3