Rumah  >  Artikel  >  pangkalan data  >  Ular sawa. Mengautomasikan sandaran penciptaan pangkalan data MySQL.

Ular sawa. Mengautomasikan sandaran penciptaan pangkalan data MySQL.

王林
王林asal
2024-07-18 21:53:21968semak imbas

Python. Automating creation backups of MySQL database.

Skrip ini mengautomasikan mencipta sandaran pangkalan data MySQL, memulihkannya dan mengurus pangkalan data dan penciptaan pengguna pada pelayan MySQL destinasi.

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} < {backup_file} 2>/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()

semak_dan_buat_pangkalan data:
Fungsi ini menyemak sama ada pangkalan data wujud pada pelayan MySQL. Jika pangkalan data tidak wujud, ia menciptanya. Ia memerlukan parameter seperti hos, port, nama pengguna, kata laluan dan nama pangkalan data untuk menyemak atau mencipta.

semak_dan_buat_pengguna:
Seperti fungsi pangkalan data, fungsi ini menyemak sama ada pengguna wujud pada pelayan MySQL. Jika pengguna tidak wujud, ia mencipta pengguna dan memberikan keistimewaan kepada pangkalan data tertentu. Ia juga mengambil parameter seperti hos, port, nama pengguna, kata laluan, nama pangkalan data, nama pengguna baharu dan kata laluan baharu.

backup_mysql_database:
Fungsi ini melakukan sandaran pangkalan data MySQL menggunakan mysqldump. Ia memerlukan parameter seperti hos, port, nama pengguna, kata laluan, nama pangkalan data dan laluan untuk menyimpan fail sandaran.

pulihkan pangkalan data_mysql:
Fungsi ini memulihkan pangkalan data MySQL daripada fail sandaran. Ia memerlukan parameter seperti hos, port, nama pengguna, kata laluan, nama pangkalan data dan laluan ke fail sandaran.

utama:
Ini adalah fungsi utama skrip. Ia menyediakan parameter untuk pangkalan data MySQL sumber dan sasaran, termasuk butiran sambungan, nama pangkalan data dan laluan sandaran. Ia kemudian melakukan semakan untuk memastikan bahawa pangkalan data sumber dan sasaran adalah berbeza, mencipta pangkalan data sasaran dan pengguna jika ia tidak wujud, mencipta sandaran pangkalan data sumber dan akhirnya memulihkan sandaran kepada pangkalan data sasaran.

Selain itu, skrip menggunakan modul subproses untuk melaksanakan perintah shell untuk operasi MySQL (mysql, mysqldump) dan melaksanakan pengendalian ralat dan pengalihan semula output (2>/dev/null) untuk menyekat output yang tidak diperlukan.

Jika anda bekerja dengan pangkalan data MySQL dan ingin mencipta automasi, kod ini akan membantu anda.

Kod ini mewakili templat permulaan yang baik untuk mencipta skrip automasi untuk mengurus pangkalan data 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$ 

ask_dima@yahoo.com

Atas ialah kandungan terperinci Ular sawa. Mengautomasikan sandaran penciptaan pangkalan data MySQL.. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:[Docker] Laravel, Nginx MySQLArtikel seterusnya:[Docker] Laravel, Nginx MySQL