」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Python。自動建立 MySQL 資料庫的備份。

Python。自動建立 MySQL 資料庫的備份。

發佈於2024-07-31
瀏覽:835

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:
此函数使用 mysqldump 执行 MySQL 数据库的备份。它接受主机、端口、用户名、密码、数据库名称和保存备份文件的路径等参数。

restore_mysql_database:
此函数从备份文件恢复 MySQL 数据库。它接受主机、端口、用户名、密码、数据库名称和备份文件路径等参数。

主要的:
这是脚本的主要功能。它为源和目标 MySQL 数据库设置参数,包括连接详细信息、数据库名称和备份路径。然后,它执行检查以确保源数据库和目标数据库不同,如果目标数据库和用户不存在,则创建目标数据库和用户,创建源数据库的备份,最后将备份恢复到目标数据库。

此外,该脚本使用 subprocess 模块执行 MySQL 操作(mysql、mysqldump)的 shell 命令,并执行错误处理和输出重定向(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]刪除
最新教學 更多>
  • HTML 格式標籤
    HTML 格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2024-12-23
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-12-23
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-12-23
  • 為什麼我在 Laravel 收到「Session store not set on request」錯誤?
    為什麼我在 Laravel 收到「Session store not set on request」錯誤?
    Laravel:解決「Session store not set on request」錯誤簡介使用Laravel 時,遇到「未根據請求設定會話儲存」錯誤可能會令人沮喪。本文旨在提供對該問題的清晰解釋和逐步解決方案。 錯誤是什麼? “Session store not set on” request...
    程式設計 發佈於2024-12-23
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段:action=''而非:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST陣列:表單提交後使用 var_dump 檢查 $_POST 陣列的內容...
    程式設計 發佈於2024-12-23
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-12-23
  • 如何在同一目錄中組織一個庫和 CLI 的 Go 專案?
    如何在同一目錄中組織一個庫和 CLI 的 Go 專案?
    在多包專案中組織程式碼在同時需要庫和命令列介面(CLI) 的Go 專案中,經常會遇到以下問題在同一目錄中有多個包。 這樣的專案架構:whatever.io/ myproject/ main.go myproject.go套件 main 和 func main ...
    程式設計 發佈於2024-12-23
  • 如何在 Android 中選擇後保持 ListView 項目突出顯示?
    如何在 Android 中選擇後保持 ListView 項目突出顯示?
    如何在Android 中選擇後保持ListView 項目突出顯示在Android 中,維護ListView 項目的選定狀態可以透過提供以下功能來增強使用者體驗:目前選擇的清晰視覺指示器。然而,有時開發人員會遇到這樣的問題:所選項目在某些事件(例如捲動或與 ListView 進一步互動)後失去突出顯示...
    程式設計 發佈於2024-12-23
  • 如何使用自訂 CSS 在 Bootstrap 3 中建立全高列?
    如何使用自訂 CSS 在 Bootstrap 3 中建立全高列?
    Bootstrap 3 全高列:自訂CSS 解決方案簡介:創建Twitter Bootstrap 3 的全高佈局可能具有挑戰性。雖然Bootstrap的原生類別不支援此功能,但可以使用自訂CSS來實現此效果。 自訂CSS方法:設定100% 高度:將body、container 和row 元素的高度設...
    程式設計 發佈於2024-12-23
  • 如何在不使用連結的情況下為 Span 元素添加工具提示?
    如何在不使用連結的情況下為 Span 元素添加工具提示?
    向不帶連結的Span 元素添加工具提示將滑鼠懸停在span 元素上時,通常需要向用戶提供附加資訊.這可以使用工具提示來實現,而不依賴連結。 解決方案:要使用內建HTML 屬性將工具提示新增至span 元素,只需如下使用title 屬性:<span title="My tip"...
    程式設計 發佈於2024-12-23
  • 為什麼我的 WebSocket 伺服器在 Docker 化後無法連線?
    為什麼我的 WebSocket 伺服器在 Docker 化後無法連線?
    Docker化 WebSocket 伺服器問題Docker化 WebSocket 伺服器問題開發人員在嘗試使用 Docker 容器化 WebSocket 伺服器時遇到問題。伺服器程式碼使用「connected」寫入新連接,並且在容器外運行良好,但當放置在Docker 容器內時,客戶端會因「連接重設」...
    程式設計 發佈於2024-12-23
  • Python中如何匯入同目錄或子目錄中的類別?
    Python中如何匯入同目錄或子目錄中的類別?
    在Python中從同一目錄或子目錄匯入類別在Python中,您可以透過下列方式從同一目錄或子目錄中的檔案導入類別利用__init__.py 檔案。該檔案是一個空佔位符,指示該目錄包含模組和套件。 從同一目錄匯入從與 main 相同的目錄中的檔案匯入類別.py,在該目錄中建立一個 __init__.p...
    程式設計 發佈於2024-12-23
  • 為什麼C90中函數名可以當函數指標?
    為什麼C90中函數名可以當函數指標?
    使用函數名稱作為函數指標C90 的基本原理文件深入了解了將函數名稱與函數指標等同的設計選擇。這種便利性簡化了在特定上下文中使用函數指標的過程。 函數宣告考慮宣告:int f(); int (*pf)();函數呼叫以下所有表示有效的函數呼叫:(&f)(); f(); (*f)(); (**f)...
    程式設計 發佈於2024-12-23
  • 如何在 Python 中使用多個單字邊界分隔符號將字串拆分為單字?
    如何在 Python 中使用多個單字邊界分隔符號將字串拆分為單字?
    使用多個單字邊界定界符將字串拆分為單字處理文字資料時,常見的任務是將字串拆分為單字。 Python 的 str.split() 方法提供了一個簡單的解決方案,但它僅支援單一分隔符號作為其參數。在處理包含多種類型的單字邊界(例如標點符號)的文字時,此限制可能會成為障礙。 Python re 模組提供了...
    程式設計 發佈於2024-12-23
  • 為什麼 Selenium 在 Chrome 中定位元素時會拋出“NoSuchElementException”?
    為什麼 Selenium 在 Chrome 中定位元素時會拋出“NoSuchElementException”?
    "NoSuchElementException" for Chrome with SeleniumIssue"NoSuchElementException" for Chrome with SeleniumIssueselenium.common.except...
    程式設計 發佈於2024-12-23

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3