基于Python編寫MySQL數(shù)據(jù)庫備份腳本
前言
以下是一個使用Python編寫的MySQL數(shù)據(jù)庫備份腳本,包含壓縮、日志記錄和自動清理舊備份功能:
腳本內(nèi)容:
import subprocess import gzip import os import logging import argparse from datetime import datetime, timedelta # 配置日志記錄 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler('db_backup.log'), logging.StreamHandler() ] ) def backup_mysql(host, user, password, database, backup_dir, retain_days): try: # 創(chuàng)建備份目錄 os.makedirs(backup_dir, exist_ok=True) # 生成備份文件名 timestamp = datetime.now().strftime('%Y%m%d%H%M%S') backup_file = os.path.join(backup_dir, f"{database}_{timestamp}.sql") compressed_file = f"{backup_file}.gz" # 執(zhí)行mysqldump命令 logging.info(f"Starting backup for database: {database}") with open(backup_file, 'w') as f: cmd = [ 'mysqldump', f'-h{host}', f'-u{user}', f'-p{password}', '--single-transaction', '--routines', '--triggers', database ] result = subprocess.run(cmd, stdout=f, stderr=subprocess.PIPE, text=True) if result.returncode != 0: raise Exception(f"mysqldump failed: {result.stderr}") # 壓縮備份文件 with open(backup_file, 'rb') as f_in: with gzip.open(compressed_file, 'wb') as f_out: f_out.writelines(f_in) os.remove(backup_file) logging.info(f"Backup compressed: {compressed_file}") # 清理舊備份 cutoff = datetime.now() - timedelta(days=retain_days) for filename in os.listdir(backup_dir): filepath = os.path.join(backup_dir, filename) if os.path.isfile(filepath) and filename.endswith('.sql.gz'): file_time = datetime.fromtimestamp(os.path.getmtime(filepath)) if file_time < cutoff: os.remove(filepath) logging.info(f"Deleted old backup: {filename}") except Exception as e: logging.error(f"Backup failed: {str(e)}") raise if __name__ == "__main__": parser = argparse.ArgumentParser(description='MySQL Database Backup Tool') parser.add_argument('--host', required=True, help='MySQL host') parser.add_argument('--user', required=True, help='MySQL username') parser.add_argument('--password', required=True, help='MySQL password') parser.add_argument('--database', required=True, help='Database name') parser.add_argument('--backup-dir', default='./backups', help='Backup directory') parser.add_argument('--retain-days', type=int, default=7, help='Number of days to retain backups') args = parser.parse_args() try: backup_mysql( args.host, args.user, args.password, args.database, args.backup_dir, args.retain_days ) logging.info("Backup completed successfully") except: logging.error("Backup process terminated with errors")
功能說明:
- 自動壓縮:使用gzip壓縮備份文件,節(jié)省存儲空間
- 日志記錄:同時輸出到文件和控制臺
- 舊備份清理:自動刪除超過指定天數(shù)的舊備份
- 事務備份:使用–single-transaction保證備份一致性
- 存儲過程/觸發(fā)器:包含–routines和–triggers參數(shù)
- 錯誤處理:完善的異常捕獲和錯誤日志記錄
使用方式
bash
python mysql_backup.py \
--host=localhost \
--user=root \
--password=your_password \
--database=your_database \
--backup-dir=/path/to/backups \
--retain-days=7
建議改進方向:
- 添加郵件通知功能
- 支持遠程備份到云存儲
- 添加備份驗證功能
- 支持多數(shù)據(jù)庫并行備份
- 添加備份恢復功能
注意:需要提前安裝MySQL客戶端工具(包含mysqldump),建議在服務器上直接運行。
方法補充
下面小編整理了一些其他Python備份mysql數(shù)據(jù)庫的方法,希望對大家有所幫助
Python定時按日期備份MySQL數(shù)據(jù)并壓縮
#-*- coding:utf-8 -*- import os import time import tarfile import zipfile ''' mysqldump Usage: mysqldump [OPTIONS] database [tables] OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] OR mysqldump [OPTIONS] --all-databases [OPTIONS] For more options, use mysqldump --help ''' db_host="localhost" db_user="root" db_passwd="root" db_name="crm" db_charset="utf8" db_backup_name=r"c:\crm_%s.sql" %(time.strftime("%Y%m%d%H%M")) zip_src = db_backup_name zip_dest = zip_src + ".zip" def zip_files(): f = zipfile.ZipFile(zip_dest, 'w' ,zipfile.ZIP_DEFLATED) f.write(zip_src) f.close() if __name__ == "__main__": print("begin to dump mysql database crm..."); os.system("mysqldump -h%s -u%s -p%s %s --default_character-set=%s > %s" %(db_host, db_user, db_passwd, db_name, db_charset, db_backup_name)) print("begin zip files...") zip_files() print("done, pyhon is great!")
python 自動備份 mysql數(shù)據(jù)庫
import os import sys # import glob import filecmp import time import datetime import subprocess import sys databackup_dir_path = r'E:\databackup' mysqldump_path = r'E:\Program Files\MariaDB 10.5\bin\mysqldump' mysql_ip = '127.0.0.1' mysql_username='root' mysql_password='root' mysql_port=3306 backDatabaseNames = ["kwjl5","kwjl5c2","kwjl5ga" ] def deleteOldFile(path,day): for eachfile in os.listdir(path): filename = os.path.join(path, eachfile) # backup_ 開頭的文件才會被刪除 if os.path.isfile(filename) : lastmodifytime = os.path.getmtime(filename) # 設置刪除多久之前的文件 endfiletime = time.time() - 3600 * 24 * day if endfiletime > lastmodifytime: if filename[0:7] == "backup_" and filename[-4:] == ".sql": os.remove(filename) print ("刪除文件 %s 成功" % filename) # 如果是目錄則遞歸調(diào)用當前函數(shù) elif os.path.isdir(filename): deleteOldFile(filename,day) def backupmysql(dbname): time1_str = datetime.datetime.now().strftime('%Y_%m_%d') cmd =[] cmd.append("\"" + mysqldump_path + "\"") cmd.append("--opt") cmd.append("--single-transaction=TRUE") cmd.append("--user="+ mysql_username) cmd.append("--password="+ mysql_password) cmd.append("--host="+ mysql_ip) cmd.append("--protocol=tcp") cmd.append("--port="+ str(mysql_port)) cmd.append("--default-character-set=utf8") cmd.append("--single-transaction=TRUE") cmd.append("--routines") cmd.append("--events \"%s\" > \"%s\\backup_%s_%s.sql\" " % (dbname, databackup_dir_path, dbname,time1_str) ) #cmd.append(" \n pause") strcmd = str.join(" ",cmd ) print("cmd=>" + strcmd) # os.system(strcmd) try: retcode = subprocess.call(strcmd, shell=True) if retcode < 0: print(sys.stderr, "Child was terminated by signal", -retcode ) else: print(sys.stderr, "Child returned", retcode ) except OSError as e: print(sys.stderr, "Execution failed:", e ) # 刪除老文件 15天以前的文件會被刪掉 deleteOldFile(databackup_dir_path,15) #逐個數(shù)據(jù)庫備份 for f in backDatabaseNames: backupmysql(f) print("執(zhí)行完成")
腳本簡單易懂, 就幾句話. 改改參數(shù)即可.
到此這篇關(guān)于基于Python編寫MySQL數(shù)據(jù)庫備份腳本的文章就介紹到這了,更多相關(guān)Python備份MySQL數(shù)據(jù)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實現(xiàn)Windows端口監(jiān)聽程序
這篇文章主要為大家詳細介紹了如何使用Python實現(xiàn)Windows端口監(jiān)聽程序,從而打印出對本機處于監(jiān)聽狀態(tài)的端口,進程ID和程序名稱,感興趣的可以了解下2025-05-05pandas快速處理Excel,替換Nan,轉(zhuǎn)字典的操作
這篇文章主要介紹了pandas快速處理Excel,替換Nan,轉(zhuǎn)字典的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03Python Pandas describe()函數(shù)的使用詳解
pandas庫中的describe()函數(shù)為我們提供了這樣的功能,它可以快速生成數(shù)據(jù)集的描述性統(tǒng)計信息,這篇文章主要介紹了Python Pandas describe()函數(shù)的使用介紹,需要的朋友可以參考下2024-05-05python?中的np.zeros()和np.ones()函數(shù)詳解
這篇文章主要介紹了python?中的np.zeros()和np.ones()函數(shù),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04python出現(xiàn)更新庫失敗A?new?release?of?pip?is?available:?23.0.
學習了Python我們知道它自帶了很多的庫,同時我們還需要對某個庫進行升級,這篇文章主要給大家介紹了關(guān)于python出現(xiàn)更新庫失敗A?new?release?of?pip?is?available:?23.0.1?->?23.3的解決辦法,需要的朋友可以參考下2024-03-03python在linux系統(tǒng)下獲取系統(tǒng)內(nèi)存使用情況的方法
這篇文章主要介紹了python在linux系統(tǒng)下獲取系統(tǒng)內(nèi)存使用情況的方法,涉及Python在Linux平臺下獲取系統(tǒng)硬件信息的相關(guān)技巧,需要的朋友可以參考下2015-05-05