首页 > 数据库 >python实现数据库备份与恢复

python实现数据库备份与恢复

时间:2023-05-17 15:14:30浏览次数:56  
标签:python 备份 sql mkdir mysqldump MySQL docker 数据库

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

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

标签:python,备份,sql,mkdir,mysqldump,MySQL,docker,数据库
From: https://www.cnblogs.com/beijie/p/17408791.html

相关文章

  • CentOS6 基于 Python 安装 Sentry
    概述Sentry是一款可用于Production环境的错误跟踪工具,可实时通知Production环境中用户由于一些不可预料行为(或者程序写的有问题)导致程序Crash或Exception,Sentry可以通过Integration如HipChat来发送通知,并且可以通过JIRAIntegration来快速创建Issue,然后开发者......
  • Scala中实现和Python一致的整数除法和整数求余
    \[\color{black}{\text{Inscala,it'sweirdtomimic`%``//`ofpython}}\]/*Python's%operatorreturnsaresultwiththesamesignasthedivisor,and//roundstowardsnegativeinfinity.InScala,%and/don'tbehavethesameway.......
  • python:ERROR: Could not build wheels for wordcloud, which is required to install
    pycharm里无法下载,在下面下载出现问题 需要下载error里的文件https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud这个网站找。输入Python,看自己电脑是怎样的 下载文件后,放到对应位置,下载成功 ......
  • Python枚举类型enum
    为什么需要枚举枚举(Enum)是一种数据类型,也是一种特别的类,是绑定到唯一值的符号表示,可以使用它来创建用于变量和属性的常量集枚举类可以看成是一个下拉菜单,给出特定的选项且这些选项不可修改,更贴近自然语言的方式表达数据,可以让代码更容易阅读、维护,减少转换或者错误值引......
  • 48024 python 代码分析
    ComputerScience220SC(2023)Assignment3(Basicgraphalgorithmsandtraversals)SeeCanvasforduedateThisassignmentrequiresyoutosubmitprogramsinPythonthatyouhavewrittenyourselftotheautomarker,https://www.automarker.cs.auckland.ac.nz.Yo......
  • 玩转MYSQL数据库之--视图详解
    前言从今天开始本系列文章就带各位小伙伴学习数据库技术。数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深, 全面讲解数据库体系。 非常适合零基础的小伙伴来学习。全文大约【1297】字,不说废话,只讲可以让你学到技术、明白原理的纯......
  • 【Python】Centos7安装dirsearch
    一、升级Openssl1.1.1 1、官网下载源码:https://www.openssl.org/2、安装#./config--prefix=/datas/soft/openssl-1.1.1no-zlib#make#makeinstall3、新版配置#ln-s/datas/soft/openssl-1.1.1/include/openssl/usr/include/openssl#ln-s/datas/soft/openss......
  • < Python全景系列-3 > Python控制流程盘点及高级用法、神秘技巧大揭秘!
    欢迎来到我们的系列博客《Python全景系列》!在这个系列中,我们将带领你从Python的基础知识开始,一步步深入到高级话题,帮助你掌握这门强大而灵活的编程语法。无论你是编程新手,还是有一定基础的开发者,这个系列都将提供你需要的知识和技能。 这是系列第三篇,在这篇文章中我们将全面深......
  • 关于使用Serilog配置MySql数据库和appsettings的问题
    1、项目使用dtonet6WebApi。2、Nuget包:用来访问mysql数据库Pomelo.EntityFrameworkCore.MySqlSerilog日志Serilog配合dotnetSerilog.AspNetCore读取环境变量配置Serilog.Settings.ConfigurationSerilog读取MySqlSerilog.Sinks.MySQL输出到控制台中Serilog.Sinks.Co......
  • python 使用企业微信发邮件加加图形化界面
    importsysfromPyQt5.QtWidgetsimportQApplication,QWidget,QLabel,QLineEdit,QTextEdit,QPushButtonimportrequests,base64,hashlibimportsmtplibimportosimportglobfromemail.mime.textimportMIMETextfromemail.mime.multipartimportMIMEMultipa......