docker容器下mysql备份

这里简单介绍一下导出命令:
docker exec -it {container_name} mysqldump -u{db_user} -p{db_password} {database} > {file_path}

container_name:容器名称,此处也可填容器ID。
db_user:数据库账号。
db_password:数据库密码。
database:要备份的数据库。
file_path:备份出来的文件名。
因此,如果我们要备份多个数据库,比如test1和test2,则循环执行上面的命令,替换database即可。

让我们用Python3来执行下面这个脚本:
#!/usr/bin/env python

encoding: utf-8

import datetime
import os
import shutil
import subprocess
import time
import zipfile

数据库用户名

db_user = “root”

数据库密码

db_password = “123456”

备份目录

backup_dir = “/var/test_backup”

backup_prefix和backup_suffix分别为备份文件的前缀和后缀,如test_backup_2019-09-19-11则代表该文件是在2019年9月19日的11点时备份的

backup_prefix = “test_backup”
backup_suffix = “%Y-%m-%d-%H”

备份数据库列表

backup_databases = [
“test1”,
“test2”,
]

容器名

container_name = “mysql-test”

过期小时,定期删除5个小时前的备份文件

expire_hour = 5

获取备份文件名

def get_backup_filename():
t = time.strftime(backup_suffix, time.localtime())
return “%s_%s” % (backup_prefix, t)

def get_backup_path():
return “%s%s%s” % (backup_dir, os.sep, get_backup_filename())

获取过期时间戳

def get_expire_time():
t = datetime.datetime.now() - datetime.timedelta(hours=expire_hour)
return int(time.mktime(t.timetuple()))

def create_dir(dir_path):
# 如果目录存在则退出
if os.path.exists(dir_path):
return
os.mkdir(dir_path)

cmd_template = “docker exec -it {container_name} mysqldump -u{db_user} -p{db_password} {database} > {file_path}”

备份指定数据库

def backup_database(backup_path, database):
file_path = os.sep.join([backup_path, “%s.sql” % database])
d = {
“container_name”: container_name,
“db_user”: db_user,
“db_password”: db_password,
“database”: database,
“file_path”: file_path,
}
cmd = cmd_template.format(**d)
subprocess.call(cmd, shell=True)

def zip_dir(dir_path):
file_path = ‘.’.join([dir_path, “zip”])
if os.path.exists(file_path):
os.remove(file_path)
z = zipfile.ZipFile(file_path, ‘w’, zipfile.ZIP_DEFLATED)
for root, directories, files in os.walk(dir_path):
fpath = root.replace(dir_path, ‘’)
fpath = fpath and fpath + os.sep or ‘’
for filename in files:
z.write(os.path.join(root, filename), fpath + filename)
z.close()

备份数据库

def backup():
backup_path = get_backup_path()
try:
create_dir(backup_path)
for database in backup_databases:
backup_database(backup_path, database)
zip_dir(backup_path)
finally:
shutil.rmtree(backup_path)

清理过期备份文件

def clean():
expire_time = get_expire_time()
for root, directories, files in os.walk(backup_dir):
for file in files:
if not file.startswith(backup_prefix):
continue
if not file.endswith(".zip"):
continue
file_path = os.sep.join([root, file])
t = os.path.getctime(file_path)
if t < expire_time:
os.remove(file_path)

if name == “main”:
try:
backup()
finally:
clean()

执行完毕后,我们会发现备份目录下多了一个zip文件,我们可以用unzip命令来查看下zip文件的内容:
➜ ~ python36 backup.py
➜ ~ ll /var/test_backup
total 4.0K
-rw-r–r-- 1 root root 1.8K Oct 12 09:55 test_backup_2019-10-12-09.zip
➜ ~ unzip -v /var/test_backup/test_backup_2019-10-12-09.zip
Archive: /var/test_backup/test_backup_2019-10-12-09.zip
Length Method Size Cmpr Date Time CRC-32 Name


2085  Defl:N      784  62% 10-12-2019 09:55 e42329a0  test1.sql
2104  Defl:N      801  62% 10-12-2019 09:55 046297a6  test2.sql

4189             1585  62%                            2 files

测试脚本可以正常备份Docker上的MySQL实例的多个数据库,我们就可以用Linux自带的crontab命令来自动执行脚本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值