MST

星途 面试题库

面试题:Python实现MySQL数据库定时自动化备份及优化

要求使用Python编写一个程序,实现对MySQL数据库的定时自动化备份。备份策略为每天凌晨2点进行全量备份,备份文件以日期命名存储在指定目录下。同时,要考虑数据库连接的优化,比如合理设置连接池。请阐述实现思路并编写关键代码。
50.2万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 数据库连接:使用pymysql库连接MySQL数据库,并通过DBUtils库实现连接池,优化数据库连接,避免频繁创建和销毁连接带来的性能开销。
  2. 备份逻辑:利用mysqldump命令进行全量备份。在Python中通过subprocess模块调用系统命令执行备份操作。
  3. 定时任务:使用schedule库来设置定时任务,每天凌晨2点执行备份操作。
  4. 文件命名:以当天日期命名备份文件,并存储在指定目录下。

关键代码

import pymysql
from dbutils.pooled_db import PooledDB
import subprocess
import schedule
import time
from datetime import datetime

# 数据库连接池配置
POOL = PooledDB(
    creator=pymysql,
    host='your_host',
    port=3306,
    user='your_user',
    password='your_password',
    database='your_database',
    autocommit=True,
    maxconnections=10
)


def backup_database():
    # 获取当前日期作为文件名
    date_str = datetime.now().strftime('%Y%m%d')
    backup_file = f'/path/to/backup/{date_str}.sql'

    # 从连接池获取连接
    conn = POOL.connection()
    try:
        with conn.cursor() as cursor:
            cursor.execute('SELECT VERSION()')
            version = cursor.fetchone()[0]
            print(f"Database version: {version}")

        # 构建mysqldump命令
        command = f'mysqldump -u your_user -pyour_password your_database > {backup_file}'
        subprocess.run(command, shell=True, check=True)
        print(f"Database backup successful: {backup_file}")
    except subprocess.CalledProcessError as e:
        print(f"Backup failed: {e}")
    finally:
        # 归还连接到连接池
        conn.close()


# 设置定时任务,每天凌晨2点执行备份
schedule.every().day.at("02:00").do(backup_database)

while True:
    schedule.run_pending()
    time.sleep(1)

请将your_hostyour_useryour_passwordyour_database/path/to/backup替换为实际的数据库主机、用户名、密码、数据库名以及备份文件存储路径。