此腳本自動創(chuàng)建 MySQL 數(shù)據(jù)庫的備份、恢復它們以及管理目標 MySQL 服務器上的數(shù)據(jù)庫和用戶創(chuàng)建。
導入子流程 導入日期時間 導入系統(tǒng) 導入操作系統(tǒng) def check_and_create_database(主機、端口、用戶名、密碼、數(shù)據(jù)庫): # 檢查數(shù)據(jù)庫是否存在的命令 check_database_command = f"mysql -sN --host={主機} --port={端口} --user={用戶名} --password={密碼} -e "SELECT EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '{數(shù)據(jù)庫}')" 2>/dev/null" # 執(zhí)行命令 輸出 = subprocess.check_output(check_database_command, shell=True) # 如果輸出包含b'1',則數(shù)據(jù)庫存在 如果輸出中有 b'1': subprocess.run(check_database_command, shell=True, check=True) print(f"數(shù)據(jù)庫'{database}'已經(jīng)存在。") 系統(tǒng)退出(1) 別的: # 如果命令失敗,則數(shù)據(jù)庫不存在 print(f"數(shù)據(jù)庫 '{database}' 不存在。正在創(chuàng)建...") # 創(chuàng)建數(shù)據(jù)庫的命令 create_database_command = f"mysql --host={主機} --port={端口} --user={用戶名} --password={密碼} -e '創(chuàng)建數(shù)據(jù)庫 {數(shù)據(jù)庫}' 2>/dev/null" subprocess.run(create_database_command, shell=True) def check_and_create_user(主機、端口、用戶名、密碼、數(shù)據(jù)庫、新用戶名、新密碼): # 檢查用戶是否存在的命令 check_user_command = f"mysql -sN --host={主機} --port={端口} --user={用戶名} --password={密碼} -e "SELECT EXISTS(SELECT 1 FROM mysql.user WHERE user = '{new_username}')" 2>/dev/null" # 執(zhí)行命令 輸出 = subprocess.check_output(check_user_command, shell=True) # 如果輸出包含b'1',則用戶存在 如果輸出中有 b'1': print(f"用戶'{new_username}'已經(jīng)存在。") 系統(tǒng)退出(1) 別的: # 用戶不存在,創(chuàng)建 print(f"用戶 '{new_username}' 不存在。正在創(chuàng)建...") # 創(chuàng)建用戶并授予權限的命令 create_user_command = f"mysql --host={主機} --port={端口} --user={用戶名} --password={密碼} -e "創(chuàng)建用戶'{new_username}'@'%' 識別者' {新密碼}';將 {database}.* 上的所有權限授予 '{new_username}'@'%';刷新權限;“2>/dev/null” subprocess.run(create_user_command, shell=True) def backup_mysql_database(主機、端口、用戶名、密碼、數(shù)據(jù)庫、備份路徑): # 檢查備份目錄是否存在 如果不是 os.path.exists(backup_path): print(f"錯誤:備份目錄'{backup_path}'不存在。") 系統(tǒng)退出(1) # 使用當前日期和時間為備份創(chuàng)建文件名 時間戳 = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S") backup_file = f"{備份路徑}/{數(shù)據(jù)庫}_{時間戳}.sql" # 使用mysqldump創(chuàng)建數(shù)據(jù)庫備份的命令 dump_command = f"mysqldump --no-tablespaces --host={主機} --port={端口} --user={用戶名} --password={密碼} {數(shù)據(jù)庫} > {備份文件} 2>/dev/無效的” # 執(zhí)行mysqldump命令 subprocess.run(dump_command, shell=True) 返回備份文件 def Restore_mysql_database(主機、端口、用戶名、密碼、數(shù)據(jù)庫、備份文件): # 使用 mysql 從備份恢復數(shù)據(jù)庫的命令 Restore_command = f"mysql --host={主機} --port={端口} --user={用戶名} --password={密碼} {數(shù)據(jù)庫} /dev/null" # 執(zhí)行mysql命令 subprocess.run(restore_command, shell=True) def main(): # 源MySQL數(shù)據(jù)庫的連接參數(shù) 源主機=“127.0.0.1” 源端口=“3309” 源用戶名=“我的用戶” 源密碼=“我的密碼” 源數(shù)據(jù)庫=“我的數(shù)據(jù)庫” # 目標MySQL數(shù)據(jù)庫的連接參數(shù) 目標主機=“127.0.0.1” 目標端口=“3309” 新用戶名 = "新用戶名" 新密碼 = "新密碼" target_database =“my_database_two” 目標用戶名=“root” 目標密碼=“根密碼” # 本地保存?zhèn)浞莸穆窂? backup_path =“my_dbs_dumps” # 檢查source_database與target_database是否不同 如果源數(shù)據(jù)庫==目標數(shù)據(jù)庫: print("錯誤:源數(shù)據(jù)庫應該與目標數(shù)據(jù)庫不同。") 系統(tǒng)退出(1) # 檢查目標數(shù)據(jù)庫,如果不存在則創(chuàng)建 check_and_create_database(目標主機、目標端口、目標用戶名、目標密碼、目標數(shù)據(jù)庫) # 檢查目標用戶,如果不存在則創(chuàng)建 check_and_create_user(目標主機、目標端口、目標用戶名、目標密碼、目標數(shù)據(jù)庫、新用戶名、新密碼) # 創(chuàng)建MySQL數(shù)據(jù)庫的備份 backup_file = backup_mysql_database(源主機、源端口、源用戶名、源密碼、源數(shù)據(jù)庫、備份路徑) print(f"已創(chuàng)建數(shù)據(jù)庫備份:{backup_file}") # 從備份中恢復目標服務器上的數(shù)據(jù)庫 Restore_mysql_database(目標主機、目標端口、目標用戶名、目標密碼、目標數(shù)據(jù)庫、備份文件) print("數(shù)據(jù)庫備份已在目標服務器上恢復。") 如果 __name__ == "__main__": 主要的()
登錄后復制
檢查并創(chuàng)建_數(shù)據(jù)庫:
此函數(shù)檢查 MySQL 服務器上是否存在數(shù)據(jù)庫。如果數(shù)據(jù)庫不存在,則會創(chuàng)建它。它需要主機、端口、用戶名、密碼和數(shù)據(jù)庫名稱等參數(shù)來檢查或創(chuàng)建。
檢查并創(chuàng)建_用戶:
與數(shù)據(jù)庫函數(shù)一樣,該函數(shù)檢查 MySQL 服務器上是否存在用戶。如果用戶不存在,它將創(chuàng)建用戶并授予特定數(shù)據(jù)庫的權限。它還接受主機、端口、用戶名、密碼、數(shù)據(jù)庫名稱、新用戶名和新密碼等參數(shù)。
backup_mysql_database:
此函數(shù)使用 mysqldump 執(zhí)行 MySQL 數(shù)據(jù)庫的備份。它需要主機、端口、用戶名、密碼、數(shù)據(jù)庫名稱和保存?zhèn)浞菸募穆窂降葏?shù)。
restore_mysql_database:
此函數(shù)從備份文件恢復 MySQL 數(shù)據(jù)庫。它接受主機、端口、用戶名、密碼、數(shù)據(jù)庫名稱和備份文件路徑等參數(shù)。
主要:
這是該腳本的主要功能。它為源和目標 MySQL 數(shù)據(jù)庫設置參數(shù),包括連接詳細信息、數(shù)據(jù)庫名稱和備份路徑。然后,它執(zhí)行檢查以確保源數(shù)據(jù)庫和目標數(shù)據(jù)庫不同,如果目標數(shù)據(jù)庫和用戶不存在,則創(chuàng)建目標數(shù)據(jù)庫和用戶,創(chuàng)建源數(shù)據(jù)庫的備份,最后將備份恢復到目標數(shù)據(jù)庫。
此外,該腳本使用 subprocess 模塊執(zhí)行 MySQL 操作的 shell 命令(mysql、mysqldump),并執(zhí)行錯誤處理和輸出重定向(2>/dev/null)以抑制不必要的輸出。
如果您正在使用 MySQL 數(shù)據(jù)庫并想要創(chuàng)建自動化,此代碼將為您提供幫助。
這段代碼是一個很好的起始模板,用于創(chuàng)建管理 MySQL 數(shù)據(jù)庫的自動化腳本。
dmi@dmi-laptop:~/my_python$ python3 mysql_backup_restore.py 數(shù)據(jù)庫“my_database_two”不存在。創(chuàng)造... 用戶“new_username”不存在。創(chuàng)造... 創(chuàng)建數(shù)據(jù)庫備份:my_dbs_dumps/my_database_2024-05-13_20-05-24.sql 數(shù)據(jù)庫備份恢復到目標服務器上。 dmi@dmi-laptop:~/my_python$
登錄后復制