基于Python編寫MySQL數(shù)據(jù)庫備份腳本
前言
以下是一個(gè)使用Python編寫的MySQL數(shù)據(jù)庫備份腳本,包含壓縮、日志記錄和自動(dòng)清理舊備份功能:
腳本內(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")功能說明:
- 自動(dòng)壓縮:使用gzip壓縮備份文件,節(jié)省存儲(chǔ)空間
- 日志記錄:同時(shí)輸出到文件和控制臺(tái)
- 舊備份清理:自動(dòng)刪除超過指定天數(shù)的舊備份
- 事務(wù)備份:使用–single-transaction保證備份一致性
- 存儲(chǔ)過程/觸發(fā)器:包含–routines和–triggers參數(shù)
- 錯(cuò)誤處理:完善的異常捕獲和錯(cuò)誤日志記錄
使用方式
bash
python mysql_backup.py \
--host=localhost \
--user=root \
--password=your_password \
--database=your_database \
--backup-dir=/path/to/backups \
--retain-days=7
建議改進(jìn)方向:
- 添加郵件通知功能
- 支持遠(yuǎn)程備份到云存儲(chǔ)
- 添加備份驗(yàn)證功能
- 支持多數(shù)據(jù)庫并行備份
- 添加備份恢復(fù)功能
注意:需要提前安裝MySQL客戶端工具(包含mysqldump),建議在服務(wù)器上直接運(yùn)行。
方法補(bǔ)充
下面小編整理了一些其他Python備份mysql數(shù)據(jù)庫的方法,希望對(duì)大家有所幫助
Python定時(shí)按日期備份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 自動(dòng)備份 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_ 開頭的文件才會(huì)被刪除
if os.path.isfile(filename) :
lastmodifytime = os.path.getmtime(filename)
# 設(shè)置刪除多久之前的文件
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)用當(dāng)前函數(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天以前的文件會(huì)被刪掉
deleteOldFile(databackup_dir_path,15)
#逐個(gè)數(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用python實(shí)現(xiàn)爬取奧特曼圖片實(shí)例
大家好,本篇文章主要講的是用python實(shí)現(xiàn)爬取奧特曼圖片實(shí)例,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02
Python實(shí)現(xiàn)Windows端口監(jiān)聽程序
這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)Windows端口監(jiān)聽程序,從而打印出對(duì)本機(jī)處于監(jiān)聽狀態(tài)的端口,進(jìn)程ID和程序名稱,感興趣的可以了解下2025-05-05
pandas快速處理Excel,替換Nan,轉(zhuǎn)字典的操作
這篇文章主要介紹了pandas快速處理Excel,替換Nan,轉(zhuǎn)字典的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03
Python Pandas describe()函數(shù)的使用詳解
pandas庫中的describe()函數(shù)為我們提供了這樣的功能,它可以快速生成數(shù)據(jù)集的描述性統(tǒng)計(jì)信息,這篇文章主要介紹了Python Pandas describe()函數(shù)的使用介紹,需要的朋友可以參考下2024-05-05
python?中的np.zeros()和np.ones()函數(shù)詳解
這篇文章主要介紹了python?中的np.zeros()和np.ones()函數(shù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
python出現(xiàn)更新庫失敗A?new?release?of?pip?is?available:?23.0.
學(xué)習(xí)了Python我們知道它自帶了很多的庫,同時(shí)我們還需要對(duì)某個(gè)庫進(jìn)行升級(jí),這篇文章主要給大家介紹了關(guān)于python出現(xiàn)更新庫失敗A?new?release?of?pip?is?available:?23.0.1?->?23.3的解決辦法,需要的朋友可以參考下2024-03-03
python在linux系統(tǒng)下獲取系統(tǒng)內(nèi)存使用情況的方法
這篇文章主要介紹了python在linux系統(tǒng)下獲取系統(tǒng)內(nèi)存使用情況的方法,涉及Python在Linux平臺(tái)下獲取系統(tǒng)硬件信息的相關(guān)技巧,需要的朋友可以參考下2015-05-05

