影刀RPA进阶教程:数据备份自动化定时备份Excel数据库与配置文件的完整方案
你花了两个月搭建的RPA流程,突然有一天电脑蓝屏了。
重启之后,配置文件坏了,SQLite数据库损坏了,Excel模板被覆盖成空文件了。
你盯着屏幕,心里只有一个念头:为什么没有备份?
数据备份——开发者最容易忽略、但出问题时最后悔没做的事。
RPA项目需要备份什么
不是所有文件都需要备份,但以下三类必须备份:
第一类:数据库文件
- SQLite .db 文件
- 本地Access .mdb文件
- 任何存了业务数据的文件
丢失后果:历史数据全没,业务方会找你"算账"。
第二类:配置文件
账号密码表(Excel)
Cookie/Token文件
API密钥配置
流程参数表
丢失后果:所有流程跑不起来,挨个重新配置。
第三类:流程文件本身
- .flow 影刀流程文件
- 自定义Python脚本
- 影刀应用备份
丢失后果:白写了。虽然影刀有云端存储,但本地备份更安心。
拼多多店群自动化报活动上架!
方案一:Python脚本定时备份
最灵活、最可控的方案。
基础备份脚本
importshutilimportosfromdatetimeimportdatetimeimportzipfileclassBackupManager:def__init__(self,backup_root):self.backup_root=backup_root self.today=datetime.now().strftime('%Y-%m-%d')self.backup_dir=os.path.join(backup_root,self.today)defprepare_dir(self):"""创建每日备份目录"""os.makedirs(self.backup_dir,exist_ok=True)defbackup_file(self,file_path,prefix=''):"""备份单个文件,带时间戳"""ifnotos.path.exists(file_path):print(f'⚠ 文件不存在,跳过:{file_path}')returnFalsefilename=os.path.basename(file_path)timestamp=datetime.now().strftime('%H%M%S')backup_name=f"{prefix}{timestamp}_{filename}"dest=os.path.join(self.backup_dir,backup_name)shutil.copy2(file_path,dest)print(f'✓ 已备份:{filename}→{backup_name}')returnTruedefbackup_folder(self,folder_path):"""备份整个文件夹为zip"""ifnotos.path.exists(folder_path):print(f'⚠ 文件夹不存在,跳过:{folder_path}')returnFalsefolder_name=os.path.basename(folder_path)timestamp=datetime.now().strftime('%H%M%S')zip_name=f"{timestamp}_{folder_name}.zip"zip_path=os.path.join(self.backup_dir,zip_name)withzipfile.ZipFile(zip_path,'w',zipfile.ZIP_DEFLATED)aszf:forroot,dirs,filesinos.walk(folder_path):forfileinfiles:file_path=os.path.join(root,file)arcname=os.path.relpath(file_path,folder_path)zf.write(file_path,arcname)print(f'✓ 已打包:{folder_name}→{zip_name}')returnTruedefcleanup_old(self,keep_days=30):"""清理超过N天的备份"""cutoff=datetime.now().timestamp()-keep_days*86400forfolder_nameinos.listdir(self.backup_root):folder_path=os.path.join(self.backup_root,folder_name)ifos.path.isdir(folder_path):folder_time=os.path.getmtime(folder_path)iffolder_time<cutoff:shutil.rmtree(folder_path)print(f'🗑 已清理过期备份:{folder_name}')# 使用bm=BackupManager('D:/RPA_Backups')bm.prepare_dir()bm.backup_file('D:/RPA/data.db','db_')bm.backup_file('D:/RPA/accounts.xlsx','config_')bm.backup_folder('D:/RPA/scripts')bm.cleanup_old(keep_days=30)print('备份完成!')为什么用日期文件夹而不是全堆一起
D:/RPA_Backups/ ├── 2024-01-14/ │ ├── 083000_data.db │ ├── 083001_accounts.xlsx │ └── 083002_scripts.zip ├── 2024-01-15/ │ └── ...日期文件夹结构清晰,找历史备份一目了然。回滚时直接定位到日期。
方案二:备份逻辑强化版
基础备份够用,但有几个问题:
- 万一备份过程中源文件正在被写入,备份出来的文件可能损坏
- 备份文件越来越多,磁盘满了没人管
- 备份失败了没人知道
增强版:安全复制+大小检查+告警
importhashlibimporttimedefsafe_backup(src_path,dest_path):"""安全备份:先复制到临时文件,校验后再改名"""tmp_path=dest_path+'.tmp'try:# 1. 复制到临时文件shutil.copy2(src_path,tmp_path)# 2. 等待1秒确保写入完成time.sleep(1)# 3. 校验文件大小src_size=os.path.getsize(src_path)tmp_size=os.path.getsize(tmp_path)ifsrc_size!=tmp_size:raiseException(f'文件大小不一致:{src_size}vs{tmp_size}')# 4. 校验MD5(可选,大文件耗时)# src_md5 = hashlib.md5(open(src_path,'rb').read()).hexdigest()# tmp_md5 = hashlib.md5(open(tmp_path,'rb').read()).hexdigest()# if src_md5 != tmp_md5:# raise Exception('MD5不一致')# 5. 重命名(原子操作)os.replace(tmp_path,dest_path)returnTrueexceptExceptionase:# 清理临时文件ifos.path.exists(tmp_path):os.remove(tmp_path)print(f'❌ 备份失败:{src_path}→{e}')returnFalse增强版:磁盘空间监控
importshutildefcheck_disk_space(backup_root,min_free_gb=5):"""检查磁盘剩余空间"""usage=shutil.disk_usage(backup_root)free_gb=usage.free/(1024**3)iffree_gb<min_free_gb:print(f'⚠ 磁盘空间不足!剩余{free_gb:.1f}GB')# 触发清理或告警returnFalsereturnTrue方案三:数据库专用备份
SQLite文件的备份不能用简单的文件复制——因为有写入锁的问题。
importsqlite3defbackup_sqlite(db_path,backup_path):"""使用SQLite的backup API安全备份"""src=sqlite3.connect(db_path)dst=sqlite3.connect(backup_path)try:src.backup(dst)print(f'✓ 数据库备份完成:{backup_path}')finally:dst.close()src.close()SQLite的.backup()方法会处理写入锁的问题,即使在数据库被写入时也能安全备份。
在影刀中集成
定时备份流程
影刀备份流程(每天凌晨2:00运行): 1. 关闭所有正在写入数据库的流程(防锁冲突) 2. Python代码块:执行备份脚本 - 备份data.db(使用SQLite backup API) - 备份accounts.xlsx - 打包scripts文件夹 3. 检查备份结果: - 所有文件备份成功 → 记录日志 - 任一备份失败 → 发送企微告警 4. 清理30天前的旧备份 5. (可选)备份文件上传到云盘/对象存储触发方式
影刀"计划任务"设置为每天凌晨2:00运行,避开业务高峰。
备份策略最佳实践
3-2-1原则
- 3份副本:除了原始数据,至少2个备份
- 2种介质:本地硬盘一份,云存储/U盘/另一台机器一份
- 1份异地:至少有一份备份不在同一位置
对个人RPA项目,"本地硬盘+云盘"就符合3-2-1。
保留策略
| 备份类型 | 保留天数 | 原因 |
|---|---|---|
| 数据库每日备份 | 30天 | 数据变化频繁,需要找回历史 |
| 配置文件 | 90天 | 配置不常变,多留一些 |
| 流程脚本 | 永久 | 代码是无价的 |
测试恢复
很多人做了备份但从没测试过恢复——真正要用的时候发现备份文件是坏的。
TEMU店群矩阵自动化运营核价报活动
每月1号做一次恢复演练:随便选一个几天前的备份,恢复到临时目录,验证数据完整性。
避坑清单
坑1:备份了正在写入的文件
影刀流程正在写Excel,你的备份脚本同时去复制——复制出来的文件大概率不完整。
解决:备份时间安排在流程空闲时段(凌晨),或先检查文件是否被占用。
坑2:备份目录和源文件在同一块硬盘
硬盘坏了,备份也一起没了。
解决:备份到不同硬盘、移动硬盘或云存储。
坑3:备份脚本本身丢了
备份脚本应该放在独立的位置(比如云盘/Git仓库),不能和业务流程放在一起。
总结
备份这件事,平时想不起来,出事的时候才追悔莫及。
投入半小时写的备份脚本+影刀定时任务,可能在未来某天救你一命。
记住三个数字:3份副本、2种介质、1份异地。每天自动跑一次,每月手动恢复测试一次。
你的数据比你的流程更值钱。
内容标签:#影刀RPA #数据安全 #备份 #SQLite #运维
作者:林焱
系列:影刀RPA进阶教程系列——把自动化流程当作工程来维护