程序员的资源宝库

网站首页 > gitee 正文

Mysql的逻辑备份之Python实现 mysql备份命令

sanyeah 2024-03-29 17:47:43 gitee 5 ℃ 0 评论

Mysql的逻辑备份之Python实现

使用Python去实现备份数据库的原理是通过调用Mysqldump去实现,我们来看看一个简单的备份Mysql数据库的代码。

mysqldump备份某个库:

mysqldump -ubackup -p test > xx.sql

代码实现:

# coding:utf-8

import os

import time

#定义服务器,用户名、密码、数据库名称和备份的路径

DB_HOST = 'localhost'

DB_USER = 'backup'

DB_USER_PASSWD = '123456'

DB_NAME = 'test'

BACKUP_PATH = '/home/data/dbbackup/mysql/'

DATETIME = time.strftime('%Y%m%d-%H%M')

TODAYBACKUPPATH = BACKUP_PATH + DATETIME

print("开始创建备份文件夹,如果不存在就创建....")

#创建备份文件夹

if not os.path.exists(TODAYBACKUPPATH):

        os.makedirs(TODAYBACKUPPATH)

# 创建备份函数

def run_backup():

    dumpcmd = "mysqldump -u" + DB_USER + " -p" + DB_USER_PASSWD + " " + DB_NAME + " > " + TODAYBACKUPPATH + "/" + DB_NAME + ".sql"

    os.system(dumpcmd)

#执行压缩的函数

def run_tar():

        compress_file = TODAYBACKUPPATH + ".tar.gz"

        compress_cmd = "tar -czvf " +compress_file+" "+DATETIME

        os.chdir(BACKUP_PATH)

        os.system(compress_cmd)

        print("压缩已完成......")

        #删除备份文件夹

        remove_cmd = "rm -rf "+TODAYBACKUPPATH

        os.system(remove_cmd)

## 开始备份数据库

if __name__ == '__main__':

    run_backup()

    run_tar()

代码解析:

  • 1-2行,我们分别导入os模块和time模块,其中os模块用于后续代码实现调用shell命令的功能,time模块用于定义当前的日期和时间。

  • 5-9行,定义连接数据库的信息,包括用户名,密码,连接地址以及备份目录。我们不管是用shell写脚本或者用python写脚本的时候,在函数开始之前先把要定义的变量定义好,这是个很好的习惯。因为变量有了初始值之后,后续在使用变量的时候就可以方便地引用。而不需要重新去定义变量。当然你也可以后续再去定义变量。也许可以这样,你每次要用到的时候再去定义的话,会使得变量分布得比较分散。当程序代码多的时候。你可能要找半天。所以我一般建议在定义变量的时候写在代码的最前面。那样分布比较集中,好管理好查看。当然如果开发大型程序或者一个项目的时候,比如上面的代码的连接数据库的相关信息 我们一般都是 写在配置文件中。或者使用类似阿波罗(Apollo)配置中心进行配置。

  • 11-22行,DATETIME用于定义当前备份时间, 而TODAYBACKUPPATH 的值是备份目录+当前时间构成的(类似这样/home/data/dbbackup/mysql/20200428-1351)。time.strftime()的具体用法如下:

(1)strftime()方法语法:

    time.strftime(format[, t])

其中fomat是要格式化的字符串,t是而可选参数,可以是struct_time对象,python中常见的日期格式化符号有:

%y 两位数的年份表示(00-99)

%Y 四位数的年份表示(000-9999)

%m 月份(01-12)

%d 月内中的一天(0-31)

%H 24小时制小时数(0-23)

%I 12小时制小时数(01-12)

%M 分钟数(00=59)

%S 秒(00-59)

%a 本地简化星期名称

%A 本地完整星期名称

%b 本地简化的月份名称

%B 本地完整的月份名称

%c 本地相应的日期表示和时间表示

%j 年内的一天(001-366)

%p 本地A.M.或P.M.的等价符

%U 一年中的星期数(00-53)星期天为星期的开始

%w 星期(0-6),星期天为星期的开始

%W 一年中的星期数(00-53)星期一为星期的开始

%x 本地相应的日期表示

%X 本地相应的时间表示

%Z 当前时区的名称

%% %号本身

  • 16-17行,用于检测备份文件目录是否存在,如果不存在就创建。os.path.exists(path), 如果path存在则返回True,如果不存在则返回False。

  • 20-22行,定义函数run_backup()备份函数,dumpcmd对需要调用的mysqldump脚本进行拼接,拼接后的字符串命令为:mysqldump -ubackup -p123456 test >/home/data/dbbackup/mysql//20200428-1351/test.sql。最后我们调用系统命令os.system(dumpcmd) 进行备份操作。

  • 25-33行,当我们把执行mysqldump命令之后,其实具体的备份过程差不多已经完成了。但是我们更希望能对备份后的文件进行压缩。那样可以减少磁盘的空间使用率,同时压缩包也更加适合传输。于是我们创建了run_tar()函数用于来对已经备份好的sql语句进行打包。

当大家读到 compress_file = TODAYBACKUPPATH + ".tar.gz" 的时候,大家肯定会有疑问。为什么这个变量的定义不是定义在头部,而是函数中间去定义。对于这个问题,当然这个变量的定义我们可以在头部进行定义。当然这也是没关系的。但是笔者不推荐定义在头部,具有下面两个原因:

第一: compress_file 函数是局部变量,我们并不希望能在函数之外进行引用

第二: compress_file 是打包压缩相关的变量,和打包压缩的函数相关所以放在一个代码块中。

compress_file 用于定义压缩包的文件名, compress_cmd 用于定义压缩的命令。(其实这个命令就是我们在shell中使用tar -czfvf xxx.tar.gz xxx)。

os.chdir(BACKUP_PATH)用于切换到某个目录,也就是我们之前定义好的备份目录。os.system(compress_cmd),当我们切换到备份目录的时候,只需要通过os.system命令调用shell实现sql文件的打包压缩。

打包压缩之后 我们定义remove_cmd 删除命令,然后使用os.system命令调用删除即可删除原来的压缩包。

  • 36-38行,最后使用if __name__ == '__main__': 然后执行这两个函数,并且这两个函数是有顺序的。其中run_backup() 是用来通过Mysqldump进行逻辑备份。run_tar()函数用于把已经通过mysqldump逻辑备份好的数据进行打包压缩,然后删除原来的sql文件。

以上我们通过上面的代码实现了msyqldump备份mysql的一种方式,当然如果要备份表结构,备份指定表,备份所有数据库等等 都可以用上面的代码进行复用。我们只需要将 dumpcmd的值改成我们之前的mysqldump 备份数据有几种方式 的命令即可。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表