Mysql的逻辑备份之Python实现
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 备份数据有几种方式
的命令即可。