记录openGauss数据库定时备份数据的过程

锦囊妙计失效,我定时备份数据的任务为啥不执行?

三国演义中有好几处锦囊妙计的情节,目前下发的命令并不会立即执行,而是在之后的某个时间点,或者某种条件满足后,触发执行。典型的有赵云保护刘备去江东招亲前,诸葛亮给的三个锦囊,以及曹操给守合肥的李典,乐进,张辽等的"贼来乃发"纸条。

说起来绝大多数是事件触发的锦囊,包括诸葛亮借东风后,让赵云一见东南风起,就去接他,时间触发的一时竟未想到。

闲言少叙,言归正传,数据库运营过程中也会有很多后续执行命令的场景,比如定时的数据加载,抽取转换,数据清理等。本文所总结的则是定时备份数据库中数据的过程。由于目前我们的项目已经有好些人在试用了,为了保证数据安全,在数据库宕机后数据不(全部)丢失,我尝试通过定期执行gs_dump命令的方式来备份全量数据。

  • OS:OpenEuler 20.03 LTS

  • OG: openGauss 5.0.0 LTS

1. 执行gs_dump的命令

这步相对较为简单,之前经常手动对数据库进行逻辑备份,比如开发库到测试库迁移,测试库到"生产库"迁移等。命令如下:

gs_dump -U omm -f /opt/software/openGauss/databak/clob20240611.tar -p 26000 clouddb_rc -F t

执行后,在对应文件夹下生成了备份文件,如图:

关于gs_dump命令的参数,仅作简单介绍:

-U 数据库用户名;

-f 生成的备份文件路径及文件名,注意omm用户对于所在路径要有写权限

-p 数据库端口号

cl**ec需要备份的数据库名称,根据实际名称修改

-F 生成备份文件的格式,其中t表示.tar文件,c表示.sql文件

2. 完成可生成根据当前日期时间命名的备份文件的shell文件

可通过vim或vi命令编辑sh文件,也可以在windows环境编辑好后再上传至服务器,如先在window环境编辑,则保存时需选择支持unix的编码格式,否则会报错。

shell文件如下:

#!/bin/bash

BACKUP_DIR="/opt/software/openGauss/databak"

DB_NAME="cl**ec"

TIMESTAMP=$(date +\%F-\%H-\%M-\%S)

BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}-${TIMESTAMP}.sql"

#切换用户为omm

su - omm <<EOF

#执行gs_dump命令

gs_dump -U omm -f ${BACKUP_FILE} 2>> ${BACKUP_DIR}/backup.log -p 26000 ${DB_NAME} -F c

if [ $? -eq 0 ]; then

echo "Backup succeeded: ${BACKUP_FILE}"

else

echo "Backup failed" >&2

fi

如图:

shell文件大意为:首先定义备份文件的路径及文件名为:

  • 数据库名称+日期时间戳.sql;

  • 切换用户为数据库用户(本文为omm,根据实际情况修改);

  • 执行gs_dump命令。

    shell脚本文件完成后,注意需要通过chmod +x *.sh的命令,增加执行权限。

完成后执行shell:

sh /opt/software/openGauss/databak/dump_data.sh

备份文件生成:

3 . 编辑操作系统crontab

执行crontab -e,输入如下命令

其中*前面依次为:

分钟 (0 - 59)

小时 (0 - 23)

日 (1 - 31)

月 (1 - 12)

星期几 (0 - 7)(0 和 7 都表示星期日)

我们仅约束了分钟和小时,如下设置表示每天的20:10执行。

后面为需要执行的命令,注意命令的路径要写绝对路径。编辑完成后,和vi一样保存退出,如果没有错误,会有如下提示:

说明定时执行的任务创建成功了。

等时间过了20:10后再查看,就会发现数据备份文件已经生成。

查看crontab日志:

也会发现cron命令执行成功了。

很顺利是不是?

曲折的过程,看到最后的结果无疑是很开心的,然而不能忽略的是中间经历的定时任务他不执行的困惑:

日志中写道:未找到gs_dump命令。

这个问题,是怎么解决的呢?

首先怀疑是环境变量的问题,于是在crontab中加环境变量,在crontab中加source命令,shell脚本的路径又改为绝对路径,gs_dump命令的路径也改为绝对路径等,尝试了不下10来中方法,然而还是没能搞定。

后来我歪打歪撞意识到gs_dump是omm用户的命令,我用root用户尝试执行该命令,报的也是找不到命令,

那么定时执行时,是不是需要切换下用户呢?于是在shell脚本中增加了su-omm的命令。

"Bang~~!"大功告成!

本文作者: 本文内容来自于数据库领域资深技术专家赵锋老师,希望我们的文章正好能解决你的问题。

欢迎技术交流~

相关推荐
打鱼又晒网13 分钟前
【MySQL】数据库精细化讲解:内置函数知识穿透与深度学习解析
数据库·mysql
王小小鸭17 分钟前
【开发小技巧11】用经典报表实现badge list效果,根据回显内容用颜色加以区分
oracle·oracle apex
大白要努力!18 分钟前
android 使用SQLiteOpenHelper 如何优化数据库的性能
android·数据库·oracle
tatasix1 小时前
MySQL UPDATE语句执行链路解析
数据库·mysql
南城花随雪。1 小时前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了1 小时前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度1 小时前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮1 小时前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9992 小时前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️2 小时前
华为ASP与CSP是什么?
服务器·前端·数据库