SiriBlog

siriyang的个人博客


  • 首页

  • 排行榜

  • 标签111

  • 分类33

  • 归档285

  • 关于

  • 搜索

个人数据中心:数据备份模块

发表于 2022-12-20 更新于 2023-01-30 分类于 计算机 , 技术 , Python 阅读次数: Valine:
本文字数: 4.5k 阅读时长 ≈ 4 分钟

  本文承接个人数据中心解决方案,补全系统架构中的最后一个重要模块——数据备份模块。

  即使再稳定的服务器也难免会遇到出问题的时候,所以异地容灾备份不可或缺。我的备份方案是每天将数据库中的重要数据表全量导出,然后备份到坚果云上。同样的思路也可以备份到不同的云盘或本地设备。

graph LR;
    A(MySQL)--数据备份脚本-->B(本地磁盘);
    B--webdav-->C(坚果云);
    B--相应的数据接口-->D(其他云盘或服务器);

数据导出

  导出MySQL中的数据表可以直接使用系统提供的mysqldump工具,该工具在mysql的系统文件夹下。但是考虑到我可能在别的服务器上执行备份操作,所以还是选择以网络传输的方式进行数据读取。

siridw_data_backup.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import time
import os
import re
from datetime import datetime,timedelta
import pandas as pd
from sqlalchemy import create_engine,types
import pymysql

db_user="your_user_name" # 用于连接数据库的用户名
db_passwd="your_password" # 用于连接数据库的用户密码
db_dbname="your_database_name" # 数据库中待连接的库名
db_hostname="your_hostname" # 数据库主机地址

def siridw_data_backup():
bt=time.time()
print_with_time("开始数据备份")

# 想要备份的数据表
table_name=["dwd_book_read_record",
"dim_notiondb_book_list_info",
"dim_notiondb_video_list_info",
# ...
]

# 生产环境 本地存储备份数据的文件夹
backup_root_dir="/your_path/siridw_backup" #你的数据备份文件夹

# 开发环境
# backup_root_dir="./data"

backup_dir=os.path.join(backup_root_dir,datetime.now().strftime("%Y-%m-%d"))

os.makedirs(backup_dir, exist_ok=True)

for name in table_name:
dump_table(name,backup_dir)

clear_old_data(backup_root_dir,30)
print_with_time("数据备份完成,用时:"+str(time.time()-bt))

def dump_table(table_name,backup_dir):
bt=time.time()

con_engine = create_engine('mysql+pymysql://'+db_user+':'+db_passwd+'@'+db_hostname+':3306/'+db_dbname+'?charset=utf8')

sql = "select * from "+table_name

df=pd.read_sql(sql,con=con_engine)

df.to_csv(os.path.join(backup_dir,table_name+".csv"),index=False)

print_with_time("备份完成:"+table_name+"\t\t备份数据量:"+str(len(df))+"\t\t用时:"+str(time.time()-bt))

def clear_old_data(backup_root_dir,life_time):
dirs=os.listdir(backup_root_dir)

for d in dirs:
if(re.match('\d{4}-\d{2}-\d{2}',d)!=None and (datetime.now()-datetime.strptime(d,"%Y-%m-%d")).days>life_time):
res=os.popen("rm -rf "+os.path.join(backup_root_dir,d)).read()
print_with_time("清除过期备份:"+os.path.join(backup_root_dir,d))

def print_with_time(msg):
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S")+"\t"+str(msg))

if __name__ == "__main__" :
siridw_data_backup()

  首先将我想要备份的数据表登记到table_name这个列表中;
  之后程序会逐张以CSV的形式备份到本地文件夹backup_root_dir中,在这个文件夹中将会以日期创建自文件夹,存放当天到备份数据;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.
├── 2022-12-18
│   ├── dim_notiondb_book_list_info.csv
│   ├── dwd_book_read_record.csv
│   ├── dim_notiondb_video_list_info.csv
│   ├── ...
│   └── ...
└── 2022-12-19
│   ├── dim_notiondb_book_list_info.csv
│   ├── dwd_book_read_record.csv
│   ├── dim_notiondb_video_list_info.csv
│   ├── ...
│   └── ...
└── ...

  然后clear_old_data()函数会每天检查并清理超过30天的备份数据,你可以通过life_time参数进行设置,单位为天。

坚果云备份

挂载坚果云文件夹

  要将数据通过webdav同步到坚果云上,首先在坚果云上创建应用并获取应用密码

  然后在服务器上还需要安装davfs2这个dav文件系统

1
yum install davfs2 -y

直接命令行挂载

  挂载文件夹到webdav有多种方式,这里我直接选用命令进行手动挂载,缺点是一旦服务器重启需要重新进行挂载。
  如果使用root账户进行挂载,仅root用户有文件夹的读写权限,如果使用其他用户访问需要授权。
  这里我直接挂载并指定文件夹访问用户为siriyang

1
2
3
4
5
6
7
8
(base) [siriyang@VM-16-17-centos ~]$ sudo mount -o uid="siriyang",gid="siriyang" -t davfs https://dav.jianguoyun.com/dav/siridw_backup/ /home/siriyang/data_ware_house/siridw_backup/
[sudo] siriyang 的密码:
Please enter the username to authenticate with server
https://dav.jianguoyun.com/dav/siridw_backup/ or hit enter for none.
Username: www.yangxinruei@qq.com
Please enter the password to authenticate user www.yangxinruei@qq.com with server
https://dav.jianguoyun.com/dav/siridw_backup/ or hit enter for none.
Password:

  其中,https://dav.jianguoyun.com/dav/siridw_backup/的siridw_backup为我们在坚果云上自己创建的子文件夹。

遇到报错:

1
/sbin/mount.davfs: mounting failed; the server does not support WebDAV

解决方案:

修改配置文件 /etc/davfs2/davfs2.conf

1
ignore_dav_header 1

参考资料:

  • linux挂载坚果云webdav并解决遇到的问题
  • davfs2 挂载WebDAV 提示server does not support WebDAV错误

卸载webdav文件夹

1
sudo umount /home/siriyang/data_ware_house/siridw_backup/

遇到报错:

1
umount: /home/siriyang/data_ware_house/siridw_backup: target is busy.

解决方案:

1
2
3
4
(base) [siriyang@VM-16-17-centos data_ware_house]$ lsof /home/siriyang/data_ware_house/siridw_backup
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 615260 siriyang cwd DIR 0,70 112 1 /home/siriyang/data_ware_house/siridw_backup
(base) [siriyang@VM-16-17-centos data_ware_house]$ kill -9 615260

参考资料:

  • umount卸载磁盘提示target is busy. (目标忙) 的问题解决方案

  相关代码已托管于GitHub,欢迎Star!

-------- 本文结束 感谢阅读 --------
相关文章
  • 个人数据中心:获取Switch游戏记录
  • 个人数据中心:获取Steam游戏记录
  • 个人数据中心:阅读记录模块开发
  • 个人数据中心:微信机器人接入及后端开发
  • 个人数据中心:数据采集模块设计与实现
觉得文章写的不错的话,请我喝瓶怡宝吧!😀
SiriYang 微信支付

微信支付

SiriYang 支付宝

支付宝

  • 本文标题: 个人数据中心:数据备份模块
  • 本文作者: SiriYang
  • 创建时间: 2022年12月20日 - 10时12分
  • 修改时间: 2023年01月30日 - 16时01分
  • 本文链接: https://blog.siriyang.cn/posts/20221220104953id.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
效率 知识管理 Python
2022年度数据报告
个人数据中心:阅读记录模块开发
  • 文章目录
  • 站点概览
SiriYang

SiriYang

大数据研究生
285 日志
32 分类
86 标签
RSS
GitHub E-Mail
Creative Commons
Links
  • 友情链接
  • 打赏记录
  • 作品商铺

  1. 数据导出
  2. 坚果云备份
    1. 挂载坚果云文件夹
    2. 直接命令行挂载
    3. 卸载webdav文件夹
蜀ICP备19008337号 © 2019 – 2023 SiriYang | 1.6m | 23:34
0%