python实现数据库备份与恢复

发布时间 2023-05-17 15:05:52作者: ꧁ʚ星月天空ɞ꧂

1. 概述

首先,数据库的备份理论上只是一句命令的事,但是也可以通过循环遍历数据库的表实现备份,但是无疑那样会使代码量提升很多,不过就是用SQL语句,原理倒是非常简单。当然,现在市面上用的最多的还是用命令的,这条命令如果手动操作应该是在命令窗口就可以实现的,用代码的话不过是拼接下字符串,生成命令,然后运行一下罢了

2. 数据库备份

def database_backup(request):
    ''' 定义变量 '''
    databases = 'huayang_2th_mao'  # 定义要备份的数据库名
    sql_host = '192.168.110.200'
    sql_user = 'root'  # 数据库登陆用户
    sql_pwd = '123456'  # 数据库登陆密码
    root_path = r'\database_backup\\'  # 存放sql文件的地址
    sql_port = '3306'  # 存放sql文件的地址

    ''' 创建存放备份文件的文件夹 '''
    mkdir_dir = root_path + time.strftime('%Y%m%d') + "/"  # 在/home/work/目录下用当天时间的格式创建目录
    if not os.path.exists(mkdir_dir):  # 判断如果没有当天时间目录
        os.mkdir(mkdir_dir)  # 创建
    print('创建文件夹成功:', os.path.abspath(mkdir_dir))  # 打印创建成功
    # sys.setrecursionlimit(3000)
    ''' 开始备份到指定文件夹 '''
    os.chdir(mkdir_dir)
    # for database_name in databases:  # 循环huayang_2th_mao数据库
    today_sql = databases + '_' + time.strftime('%Y%m%d') + '.sql'  # 定义数据库文件名变量
    # 编写cmd语句
    # sql_comm = "mysqldump -u%s -p%s %s > %s --default_character-set=utf8" % (
    sql_comm ="mysqldump -u%s -h%s -p%s -P %s %s > %s --default_character-set=utf8" % (
        sql_user, sql_host, sql_pwd, sql_port, databases, today_sql)  # 定义备份数据库变量
    if os.system(sql_comm) == 0:  # 如果上一条执行结果等于0,表示成功
        print(databases, 'is backup successfully!')  # 打印成功信息
        print('备份文件地址:', os.path.abspath('./') + today_sql)
    else:  # 备份失败
        print(databases, 'is backup fail!')  # 打印成功信息
    return HttpResponse()

值得注意的是,这里的mysqldump命令是MySQL中自带的插件,也就是说你的电脑上要有mysql,然后还要在MySQL的bin下运行mysqldump命令才会有反应(如果你配置了MySQL全局变量,那么应该是任何地方mysqldump都是可以的)

例如(我配置了MySQL全局变量):
image

这里我就遇到了一个问题:MySQL安装在docker内部,但是django项目在docker外部,怎么使用docker内部MySQL的musqldump插件呢?

当时是有两种解决方案的:1、将docker内部MySQL挂载出来 2、将docker内部MySQL停止,在docker外再安装一个MySQL

结果:挂载太麻烦,整完了感觉没什么用,外面安装MySQL的话,由于服务器不是自己的,好多权限受限制,2种方案自己都没有行通。。。。。。。。。。。。。。。。。

巧合之下看到了下面这篇文章:

https://www.saoniuhuo.com/question/detail-2064035.html

其实他说的这种方法我之前有想过,毕竟我只要mysqldump能够使用,不需要MySQL数据库,完全可以只将与mysqldump相关的文件复制出来用啊

可是首先我不知道哪些文件与mysqldump相关,其次我将自己电脑上的mysqldump复制到服务器,系统不一样,无法用,这篇文章证实了我这种想法是对的

但是需要复制一份linux系统的mysqldump到项目下,mysqldump就可以用了

从docker容器内复制一份:

sudo docker cp mysql2:/usr/bin/mysqldump docker/mysql

mysql2:容器名
/usr/bin/mysqldump:容器内mysqldump位置
docker/mysql:docker外部存放位置

将复制出来的mysqldump放进项目根目录下就可以用了

3. 导入生成的.sql文件到test数据库

"""恢复数据库,前提该数据库存在"""


def database_restore(request):
    ''' 定义变量 '''
    old_databases = 'huayang_2th_mao'
    new_databases = 'test'  # 定义要备份的数据库名
    sql_host = '192.168.110.200'
    sql_user = 'root'  # 数据库登陆用户
    sql_pwd = '123456'  # 数据库登陆密码
    root_path = r'\database_backup\\'  # 存放sql文件的地址

    mkdir_dir = root_path + time.strftime('%Y%m%d') + "/"  # 在/home/work/目录下用当天时间的格式创建目录
    print(mkdir_dir)
    if os.path.exists(mkdir_dir):
        print("文件夹存在")
        os.chdir(mkdir_dir)
        string_sql = old_databases + '_' + time.strftime('%Y%m%d') + '.sql'
        sql_comm = "mysql -h%s -u%s -p%s  %s < %s --force --default_character-set=utf8" % (
            sql_host, sql_user, sql_pwd, new_databases, string_sql)
        os.system(sql_comm)
        print("导入成功")
    else:
        print("导入失败")
    return HttpResponse()

mysqldump命令解析:

https://blog.csdn.net/Wyongkang/article/details/123558313?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168429678416800215047084%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168429678416800215047084&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-5-123558313-null-null.142v87control,239v2insert_chatgpt&utm_term=mysqldump%E5%91%BD%E4%BB%A4%E8%AF%A6%E8%A7%A3&spm=1018.2226.3001.4187

到此数据库备份与恢复圆满结束