将Docker或Kubernetes中的数据库备份到网盘

发布于 2022-12-19  1444 次阅读


为了数据安全,数据库应该经常备份到其他设备中,其中备份到网盘是一个方便的做法,这里使用Rclone挂载Onedrive并设置从Docker和Kubernetes中自动导出数据库并备份。

挂载远程目录

首先安装Rclone,使用包管理器或者安装脚本都可以,安装后执行配置命令:

rclone config

接下来会进入交互式界面:

No remotes found - make a new one
n) New remote
s) Set configuration password
q) Quit config
n/s/q> 

输入n创建新配置,然后输入配置名称,随意即可,接下来会返回网盘选择列表:

Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
 1 / 1Fichier
   \ "fichier"
 2 / Alias for an existing remote
   \ "alias"
 3 / Amazon Drive
   \ "amazon cloud drive"
⋮
22 / Microsoft OneDrive
   \ "onedrive"
⋮
35 / seafile
   \ "seafile"
Storage> 

这里看到OneDrive在第22位,所以输入22,由于不同版本中位置可能不同,请确认好数字再输入。

接下来要求输入OAuth Id和Secret,不用填写直接回车即可。然后询问是否进行高级配置,这里不需要,输入n跳过。现在会询问是否进行自动配置,如果是具有图形界面的设备,可以输入y,然后打开浏览器链接并登录账号;如果是没有图形界面的设备,则需要输入n,会要求使用另一台具有图形界面的设备运行返回的命令,例如rclone authorize "onedrive"。用另一台有浏览器的设备安装Rclone并执行该命令,则会返回浏览器地址,打开并登录,成功后终端会返回一串token,将其复制到原来的设备中,记得包含两边的{}

接下来会要求选择访问方式,由于使用的是普通的OneDrive,这里输入1,如果使用SharePoint等按需输入。输入后会返回可用的网盘列表,输入前面的数字。接下来会要求检查类型和地址,无误后输入y

最后会输出配置文件来要求最后的确认,无误后输入y保存。然后输入q退出配置编辑。

可以使用rclone move命令来将文件移动到网盘:

rclone move 源文件路径 网盘配置名:备份目录路径

也可以挂载远程文件夹,将网盘当作本地目录使用,:

rclone mount --daemon 配置文件名:网盘目录 本地目录 --copy-links --no-gzip-encoding --no-check-certificate --allow-other --allow-non-empty --umask 000

如果出错可以去掉--daemon来查看错误原因,例如fuse未安装或配置文件中最后一行未添加user_allow_other

导出数据库

在Docker容器内执行命令的方式为:

docker exec 容器名 命令

在Kubernetes容器内执行命令的方式为:

kubectl -n 命名空间 exec -it 工作负载类型/工作负载名称 -- 命令

其中一般常用的工作负载为Deployment,而数据库有持久储存的要求,使用的工作负载通常为StatefulSet,可以使用kubectl get 工作负载类型来查看。

而执行数据导出的命令不同数据库各不相同,这里以MySQL和PostgreSQL为例,MySQL为:

mysqldump -u 用户名 --password=密码 数据库名 > 备份文件.sql

如果要导出全部数据库,可以使用root的用户名和密码,然后将数据库名替换为--all-databases

PostgreSQL命令为:

pg_dump -U 用户名 -d 数据库名 > 备份文件.sql

如果要导出全部数据库则需使用pg_dumpall命令。

如果提示找不到命令可以使用容器内的绝对路径来执行。

将上述内容组合起来,并写成脚本,例如:

#!/bin/sh

docker exec database /usr/bin/mysqldump -u root --password 密码 --all-databases > mysql-all-backup.sql
wait
rclone move mysql-all-backup.sql OneDrive:/Backup/

由于导出数据库较大时可能用时较长,所以中间添加wait命令来等待导出完成。脚本创建使用chmod +x 脚本名.sh来赋予执行权限。完成后可以试用一下能否正常运行。

最后设置自动任务,使用crontab -e,在最后添加自动运行项目:

f1 f2 f3 f4 f5 用户名 执行的命令,这里填写脚本路径

其中前面f的位置分别代表分钟、小时、日期、月份、星期,可填写的内容如下:

*任意值,例如每分钟或每小时。
,指定值,例如小时设置为1,3,5为1时、3时、5时。
-范围,例如分钟设置为2-10则为2分至10分。
/间隔,可以和*和-混合使用,例如分钟设置为*/5为每5分中,1-20/5为1分至20分之间,每5分钟。
L表示最后,由于月份结尾并不固定,可以使用L表示每月最后一天。

例如:每5分钟为*/5 * * * *,每日0时0分为0 0 * * *,每月1日和15日0时0分为0 0 1,15 * *。要注意的是日期和星期为或的关系,如果都设置的话的两者都会触发。

执行时会输出命令的内容,如果不想要可以在命令后面添加 > /dev/null 2>&1,注意最前面有空格。设置完成后等到执行时间可以确认下是否执行成功。方便起见可以先设置短间隔,正常后在设置原本的间隔。