python实现对文件的全量、增量备份
#!/user/bin/env python
# @Time :2018/6/6 10:10
# @Author :PGIDYSQ
#@File :FileBackup2.py
import os
import filecmp
import shutil
import sys
import time,sched
'''定时任务备份,增量备份'''
schedule = sched.scheduler(time.time, time.sleep) def autoBackup(scrDir,dstDir):
if((not os.path.isdir(scrDir))or(not os.path.isdir(dstDir))or
(os.path.abspath(scrDir) != scrDir)or(os.path.abspath(dstDir) != dstDir)):
usage()
for item in os.listdir(scrDir):
scrItem = os.path.join(scrDir,item)
dstItem= scrItem.replace(scrDir,dstDir)
if os.path.isdir(scrItem):
#创建新增加的文件夹,保证目标文件夹结构与原始文件一致
if not os.path.exists(dstItem):
os.makedirs(dstItem)
print('make directory'+dstItem)
#递归调用自身函数
autoBackup(scrItem,dstItem)
elif os.path.isfile(scrItem):
#只复制新增或修改的文件
if((not os.path.exists(dstItem))or(not filecmp.cmp(scrItem,dstItem,shallow=False))):
shutil.copyfile(scrItem,dstItem)
print('file:'+scrItem+'==>'+dstItem,os.system('echo %time%'))
schedule.enter(10, 0, autoBackup, (scrDir, dstDir))
def usage():
print('Error')
print('For example:{0}'.format(sys.argv[0]))
sys.exit(0)
if __name__ == "__main__":
# if len(sys.argv) != 3:
# usage()
# scrDir,dstDir = sys.argv[1],sys.argv[2]
scrDir, dstDir = r'E:\PyCharm\WorkSpace\TestPkg\base\src',r'E:\PyCharm\WorkSpace\TestPkg\base\dest'
#定时周期执行备份任务
schedule.enter(10, 0, autoBackup, (scrDir,dstDir))
schedule.run() # 持续运行,直到计划时间队列变成空为止
#autoBackup(scrDir,dstDir)
#!/user/bin/env python
# @Time :2018/6/6 10:10
# @Author :PGIDYSQ
#@File :FileBackup.py
import time
import os
import tarfile
import shutil
import pickle as p
import hashlib
'''实现每周一全量备份,其余时间增量备份'''
def md5check(fname):
m = hashlib.md5()
with open(fname) as fobj:
while True:
data = fobj.read(4096)
if not data:
break
m.update(data.encode())#pay
return m.hexdigest() def full_backup(src_dir: object, dst_dir, md5file):
par_dir, base_dir = os.path.split(src_dir.rstrip('/'))
back_name = '%s_full_%s.tar.gz' % (base_dir, time.strftime('%Y%m%d'))
full_name = os.path.join(dst_dir, back_name)
md5dict = {} # tar = tarfile.open(full_name, 'w:gz')
# tar.add(src_dir)
# tar.close() if os.path.exists(dst_dir):
shutil.rmtree(dst_dir)
shutil.copytree(src_dir,dst_dir)#拷贝文件
#shutil.make_archive(dst_dir,'zip',src_dir)#将文件压缩,注:如果压缩tar,中文文件名有可能乱码
for path, folders, files in os.walk(src_dir):
for fname in files:
full_path = os.path.join(path, fname)
md5dict[full_path] = md5check(full_path) if os.path.exists(md5file):
with open(md5file, 'wb') as f0:
p.dump(md5dict, f0)
else:
with open(md5file,'xb') as f1:
p.dump(md5dict,f1) def incr_backup(src_dir, dst_dir, md5file):
par_dir, base_dir = os.path.split(src_dir.rstrip('/'))
back_name = '%s_incr_%s.tar.gz' % (base_dir, time.strftime('%Y%m%d'))
full_name = os.path.join(dst_dir, back_name)
md5new = {} for path, folders, files in os.walk(src_dir):
for fname in files:
full_path = os.path.join(path, fname)
md5new[full_path] = md5check(full_path) with open(md5file,'rb') as fobj:
md5old = p.load(fobj) with open(md5file, 'wb') as fobj:
p.dump(md5new, fobj) #tar = tarfile.open(full_name, 'w:gz')
for key in md5new:
if md5old[key] != md5new[key]:
#tar.add(key)
shutil.copyfile(key,dst_dir)
#tar.close() if __name__ == '__main__':
src_dir = 'base/src'
dst_dir = 'base/dest/backupfile'
md5file = 'base/md5.data'
full_backup(src_dir, dst_dir, md5file)
# if time.strftime('%a') == 'Mon':
# full_backup(src_dir, dst_dir, md5file)
# else:
# incr_backup(src_dir, dst_dir, md5file)
python实现对文件的全量、增量备份的更多相关文章
- Python实现目录文件的全量和增量备份
目标: 1.传入3个参数:源文件路径,目标文件路径,md5文件 2.每周一实现全量备份,其余时间增量备份 1.通过传入的路径,获取该路径下面的所有目录和文件(递归) 方法一:使用os.listdir ...
- Xtrabackup全量 增量备份详解
xtrabackup是Percona公司CTO Vadim参与开发的一款基于InnoDB的在线热备工具,具有开源,免费,支持在线热备,备份恢复速度快,占用磁盘空间小等特点,并且支持不同情况下的多种备份 ...
- mysql全量+增量备份脚本
cat xtrabackup_mysql.sh #!/bin/bash #title :xtrabackup_mysql.sh #description :backup mysql by using ...
- Mysql备份系列(2)--mysqldump备份(全量+增量)方案操作记录
在日常运维工作中,对mysql数据库的备份是万分重要的,以防在数据库表丢失或损坏情况出现,可以及时恢复数据. 线上数据库备份场景:每周日执行一次全量备份,然后每天下午1点执行MySQLdump增量备份 ...
- Mysql备份系列(4)--lvm-snapshot备份mysql数据(全量+增量)操作记录
Mysql最常用的三种备份工具分别是mysqldump.Xtrabackup(innobackupex工具).lvm-snapshot快照.前面分别介绍了:Mysql备份系列(1)--备份方案总结性梳 ...
- Elasticsearch 索引的全量/增量更新
Elasticsearch 索引的全量/增量更新 当你的es 索引数据从mysql 全量导入之后,如何根据其他客户端改变索引数据源带来的变动来更新 es 索引数据呢. 首先用 Python 全量生成 ...
- 【MySQL】全量+增量的备份/恢复
生产环境中,有时需要做MySQL的备份和恢复工作.因MySQL是在运行过程中的,做全量备份需要时间,全量备份完成后又有数据变动,此时需要增量备份辅助.如果想恢复数据到一个空库(例如数据迁移或者上云等更 ...
- MySQL自动化(全量+增量)备份脚本
文章转自:http://www.it-hack.cn/forum.php?mod=viewthread&tid=220&extra=page%3D1 一.MySQL的日常备份方案: 全 ...
- Mysql备份系列(3)--innobackupex备份mysql大数据(全量+增量)操作记录
在日常的linux运维工作中,大数据量备份与还原,始终是个难点.关于mysql的备份和恢复,比较传统的是用mysqldump工具,今天这里推荐另一个备份工具innobackupex.innobacku ...
随机推荐
- Android or Java的回调粗俗理解 这才是最通俗易懂的
FUCK,网上装逼者甚众矣! 网上一堆关于JAVA函数回调的见解文章,都说自己写的明白,但没几个我看的明白的. 不如自己写一个东西,回头自己看着舒服 回调函数:定义自己百度 干嘛的? 场景就是事务A执 ...
- 关于 Docker 镜像的操作,看完这篇就够啦 !(下)
紧接着上篇<关于 Docker 镜像的操作,看完这篇就够啦 !(上)>,奉上下篇 !!! 镜像作为 Docker 三大核心概念中最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌 ...
- python接口自动化(一)--什么是接口、接口优势、类型(详解)
简介 经常听别人说接口测试,接口测试自动化,但是你对接口,有多少了解和认识,知道什么是接口吗?它是用来做什么的,测试时候要注意什么?坦白的说,笔者之前也不是很清楚.接下来先看一下接口的定义. 定义 接 ...
- cAdvisor+Prometheus+Grafana监控docker
cAdvisor+Prometheus+Grafana监控docker 一.cAdvisor(需要监控的主机都要安装) 官方地址:https://github.com/google/cadvisor ...
- ZooKeeper 02 - ZooKeeper集群的节点为什么是奇数个
目录 1 关于节点个数的说明 2 ZooKeeper集群的容错数 3 ZooKeeper集群可用的标准 4 为什么不能是偶数个节点 4.1 防止由脑裂造成的集群不可用 4.2 奇数个节点更省资源 4. ...
- Flink中的Time
戳更多文章: 1-Flink入门 2-本地环境搭建&构建第一个Flink应用 3-DataSet API 4-DataSteam API 5-集群部署 6-分布式缓存 7-重启策略 8-Fli ...
- kubernetes系列10—存储卷详解
本文收录在容器技术学习系列文章总目录 1.认识存储卷 1.1 背景 默认情况下容器中的磁盘文件是非持久化的,容器中的磁盘的生命周期是短暂的,这就带来了一系列的问题:第一,当一个容器损坏之后,kubel ...
- Linux高级运维 第四章 文件的基本管理和XFS文件系统备份恢复
4.1 Linux系统目录结构和相对/绝对路径 4.1.1系统目录结构 在windows系统中,查看文件先进入相应的盘符,然后进入文件目录 在windows中,它是多根 c:\ d:\ e ...
- day08 Html
<del>我被删除了</del> <!--delete--> <b>我是粗体</b> <!-- bold --> <i&g ...
- 如何在Eclipse中彻底修改一个项目名称
在实际工作中,有时候为了赶时间,往往通过复制项目得到一个成型的框架.那么怎么才可以彻底修改项目名称呢? 1.web.xml 2.工作空间中找到当前项目下.project文件 3.工作空间中找到当前项目 ...