欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Python編寫MySQL數(shù)據(jù)庫備份腳本

 更新時間:2025年06月06日 10:31:39   作者:運維_攻城獅  
這篇文章主要為大家詳細介紹了一個使用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)文章

最新評論