"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > بايثون. أتمتة إنشاء النسخ الاحتياطية لقاعدة بيانات MySQL.

بايثون. أتمتة إنشاء النسخ الاحتياطية لقاعدة بيانات MySQL.

تم النشر بتاريخ 2024-07-31
تصفح:758

Python. Automating creation backups of MySQL database.

يقوم هذا البرنامج النصي بأتمتة إنشاء نسخ احتياطية من قواعد بيانات MySQL، واستعادتها، وإدارة قاعدة البيانات وإنشاء المستخدم على خادم MySQL الوجهة.

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:
تتحقق هذه الوظيفة من وجود قاعدة بيانات على خادم MySQL. إذا كانت قاعدة البيانات غير موجودة، فإنه يقوم بإنشائها. يستغرق الأمر معلمات مثل المضيف والمنفذ واسم المستخدم وكلمة المرور واسم قاعدة البيانات للتحقق أو الإنشاء.

check_and_create_user:
مثل وظيفة قاعدة البيانات، تتحقق هذه الوظيفة من وجود مستخدم على خادم MySQL. إذا كان المستخدم غير موجود، فإنه يقوم بإنشاء المستخدم ويمنح امتيازات لقاعدة بيانات محددة. كما أنه يأخذ معلمات مثل المضيف والمنفذ واسم المستخدم وكلمة المرور واسم قاعدة البيانات واسم المستخدم الجديد وكلمة المرور الجديدة.

backup_mysql_database:
تقوم هذه الوظيفة بإجراء نسخة احتياطية لقاعدة بيانات MySQL باستخدام mysqldump. يستغرق الأمر معلمات مثل المضيف والمنفذ واسم المستخدم وكلمة المرور واسم قاعدة البيانات والمسار لحفظ ملف النسخة الاحتياطية.

restore_mysql_database:
تقوم هذه الوظيفة باستعادة قاعدة بيانات MySQL من ملف النسخ الاحتياطي. يستغرق الأمر معلمات مثل المضيف والمنفذ واسم المستخدم وكلمة المرور واسم قاعدة البيانات والمسار إلى ملف النسخ الاحتياطي.

رئيسي:
هذه هي الوظيفة الرئيسية للبرنامج النصي. يقوم بإعداد المعلمات لقواعد بيانات MySQL المصدر والهدف، بما في ذلك تفاصيل الاتصال وأسماء قواعد البيانات ومسارات النسخ الاحتياطي. ثم يقوم بعد ذلك بإجراء عمليات التحقق للتأكد من اختلاف قاعدتي البيانات المصدر والهدف، وإنشاء قاعدة البيانات الهدف والمستخدم في حالة عدم وجودهما، وإنشاء نسخة احتياطية من قاعدة البيانات المصدر، وأخيرًا استعادة النسخة الاحتياطية إلى قاعدة البيانات الهدف.

بالإضافة إلى ذلك، يستخدم البرنامج النصي وحدة العمليات الفرعية لتنفيذ أوامر shell لعمليات MySQL (mysql، mysqldump) ويقوم بمعالجة الأخطاء وإعادة توجيه الإخراج (2>/dev/null) لمنع الإخراج غير الضروري.

إذا كنت تعمل مع قواعد بيانات MySQL وترغب في إنشاء أتمتة، فإن هذا الرمز سيساعدك.

يمثل هذا الكود نموذج بداية جيد لإنشاء نصوص برمجية تلقائية لإدارة قواعد بيانات 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]

بيان الافراج تم إعادة إنتاج هذه المقالة على: https://dev.to/dm8ry/python-automating-creation-backups-of-mysql-database-2goa?1 إذا كان هناك أي انتهاك، فيرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3