有客户需要对MOGDB/openGauss进行每天逻辑备份。如下脚本分享给大家。当然专业的备份工具也可以了解一下云和恩墨的BRM备份工具。
一、备份脚本
1.脚本
c.sh (可以改名字)
# database dump shell
# you should change the GAUSSHOME GAUSSPORT GAUSSDATA DUMP_USER DUMP_PASSWORD
#!/bin/bash
source /etc/profile
source /home/omm/.bash_profile
export GAUSSHOME=/opt/gaussdb/app
export GAUSSPORT=26000
export GAUSSDATA=/gaussdb/data/dn1
export PATH=$PGHOME/bin:$PATH
DUMP_USER=ysla
DUMP_PASSWORD='1qaz@WSX'
CUR_DATE=`date "+%Y-%m-%d-%H%M"`
dbnamelist=`cat oo.txt`
#Loading DBLIST
gsql -p ${GAUSSPORT} postgres -c "select datname from pg_database where datname not in ('template1','template0','postgres')" -t | grep -v '^$' >oo.txt
#save directory
SAVE_BASE_DIR="/gaussdb/dump_dir"
DAT_FILE_DIR="${SAVE_BASE_DIR}/${CUR_DATE}"
if [ -d ${DAT_FILE_DIR} ]
then :
else
mkdir -p ${DAT_FILE_DIR}
fi
# The real backup step!
echo "`date "+%Y-%m-%d-%H%M"` begin backup db "
for dbname in ${dbnamelist}
do
gs_dump -E UTF8 ${dbname} -U ${DUMP_USER} -W ${DUMP_PASSWORD} -p ${GAUSSPORT} -F p -f ${DAT_FILE_DIR}/${dbname}_${CUR_DATE}.sql
gs_dumpall -l postgres -U ${DUMP_USER} -W ${DUMP_PASSWORD} -p ${GAUSSPORT} -g -f ${DAT_FILE_DIR}/global_data_${dbname}_${CUR_DATE}.sql
done
tar -cjvf ${DAT_FILE_DIR}.tar.gz /${DAT_FILE_DIR} --remove-files
echo "`date "+%Y-%m-%d-%H%M"` end backup db "
这个脚本需要修改GAUSSHOME GAUSSPORT GAUSSDATA DUMP_USER DUMP_PASSWORD这几个(数据库家目录,端口,数据目录,做dump的用户,以及密码),之后直接执行就可以。脚本会自动查询数据库,并把’template1’,'template0’和’postgres’数据库排除掉,然后把其他数据库的数据和全局对象各自备份一份,最后把备份的.sql文件进行压缩。
2,脚本执行
执行结果如下:
去备份保存的目录下
解压一个文件
如下数据库的数据保存的文件名格式为(数据库名_日期时间.sql)
全局对象保存的文件名格式为(global_data_数据库名_日期时间.sql)
查看数据库对应的数据备份
[omm@node1 2022-01-07-1634]$ vim ysla_2022-01-07-1634.sql
查看数据库对应的全局对象备份
[omm@node1 2022-01-07-1634]$ vim global_data_ysla_2022-01-07-1634.sql
二、备份脚本加到crontab
将如下一行加入crontab,让脚本每天凌晨12:30执行,这里的flock是为了防止一个脚本没执行完就到了这个脚本下一次执行的周期,可能会导致并发问题,严重时会导致出现脏数据性能瓶颈等恶性循环,所以使用flock建立排它锁
-x 独占锁 -n 直接失败 如发现被锁如就失败不等待,除非解锁
30 00 * * * /usr/bin/flock -xn /tmp/test.lock -c 'sh /home/omm/c.sh >> c.log'
三、备份保留,清理
每天都进行备份,如果备份天数过多不清理,可能使目录打满,因此需要添加备份清理策略,我这里用的是crontab的方式,每天凌晨3:30清理过期数据。
如下一行加入到crontab里边,也是用了flock,这一行命令会找备份目录下的文件,排除掉隐藏文件,并把30天之前的.tar.gz文件删除。
30 03 * * * /usr/bin/flock -xn /tmp/test1.lock -c "find /gaussdb/dump_dir -not -path '*/\.*' -mtime +30 -type f -name *.tar.gz -exec rm -rf {} \;"
四、改良版本(一)
#!/bin/bash
#database dump shell
#you should change the GAUSSHOME GAUSSPORT GAUSSDATA DUMP_USER DUMP_PASSWORD dbnamelist SAVE_BASE_DIR DBLIST_BASE_DIR
source /etc/profile
source /home/ptk1/.bash_profile
export GAUSSHOME=/opt/ptk1/mogdb/app
export GAUSSPORT=27000
export GAUSSDATA=/opt/ptk1/mogdb/data
export PATH=$PGHOME/bin:$PATH
DUMP_USER=ysla
DUMP_PASSWORD='1qaz!QAZ'
#CUR_DATE=`date "+%Y-%m-%d"`
CUR_DATE=`date "+%Y-%m-%d-%H%M-%S"`
dbnamelist=`cat /home/ptk1/ysl_dump/dumpdir/mogdb-baklist.txt`
SAVE_BASE_DIR="/home/ptk1/ysl_dump/dumpdir"
DBLIST_BASE_DIR="/home/ptk1/ysl_dump/dumpdir/mogdb-baklist.txt"
DAT_FILE_DIR="${SAVE_BASE_DIR}/${CUR_DATE}"
#Loading DBLIST
gsql -p ${GAUSSPORT} postgres -c "select datname from pg_database where datname not in ('template1','template0','postgres')" -t | grep -v '^$' >${DBLIST_BASE_DIR}
#save directory
if [ -d ${DAT_FILE_DIR} ]
then :
else
mkdir -p ${DAT_FILE_DIR}
fi
# The real backup step!
echo "`date "+%Y-%m-%d-%H%M"` (1/6) begin backup "
for dbname in ${dbnamelist}
do
echo "`date "+%Y-%m-%d-%H%M"` (2/6) begin backup db data "
gs_dump -E UTF8 ${dbname} -U ${DUMP_USER} -W ${DUMP_PASSWORD} -p ${GAUSSPORT} -F p -f ${DAT_FILE_DIR}/${dbname}_${CUR_DATE}.sql
gs_dumpall -l postgres -U ${DUMP_USER} -W ${DUMP_PASSWORD} -p ${GAUSSPORT} -g -f ${DAT_FILE_DIR}/global_data_${CUR_DATE}.sql
done
tar -cjvPf ${DAT_FILE_DIR}.tar.gz ${DAT_FILE_DIR} --remove-files
echo "`date "+%Y-%m-%d-%H%M"` (3/6) end backup db "
echo "`date "+%Y-%m-%d-%H%M"` (4/6) clean the Invalid backup "
find ${SAVE_BASE_DIR} -not -path '*/\.*' -mtime +8 -type f -name '*'.tar.gz -exec du -sh {} \;
find ${SAVE_BASE_DIR} -not -path '*/\.*' -mtime +8 -type f -name '*'.tar.gz -exec rm -rf {} \;
backup_num=`find ${SAVE_BASE_DIR} -not -path '*/\.*' -mtime -1 -type f -name '*'.tar.gz | wc -l`
echo "`date "+%Y-%m-%d-%H%M"` (5/6) The number of backups remaining is " ${backup_num}
ls -l ${SAVE_BASE_DIR}/*.tar.gz
echo "`date "+%Y-%m-%d-%H%M"` (6/6) backup has been finished "
五、改良版本(二)
#!/bin/bash
#database dump shell
#you should change the GAUSSHOME GAUSSPORT GAUSSDATA DUMP_USER DUMP_PASSWORD dbnamelist SAVE_BASE_DIR DBLIST_BASE_DIR
source /etc/profile
source /home/ptk1/.bash_profile
export GAUSSHOME=/opt/ptk1/mogdb/app
export GAUSSPORT=27000
export GAUSSDATA=/opt/ptk1/mogdb/data
export PATH=$PGHOME/bin:$PATH
DUMP_USER=ysla
DUMP_PASSWORD='1qaz!QAZ'
#CUR_DATE=`date "+%Y-%m-%d"`
CUR_DATE=`date "+%Y-%m-%d-%H%M-%S"`
SAVE_BASE_DIR="/home/ptk1/ysl_dump/dumpdir"
DBLIST_BASE_DIR="/home/ptk1/ysl_dump/dumpdir/mogdb-baklist.txt"
DAT_FILE_DIR="${SAVE_BASE_DIR}/${CUR_DATE}"
#Loading DBLIST
if [ -d ${DAT_FILE_DIR} ]
then :
else
mkdir -p ${DAT_FILE_DIR}
fi
if [ -f ${DBLIST_BASE_DIR} ]
then :
else
touch ${DBLIST_BASE_DIR}
fi
dbnamelist=`cat /home/ptk1/ysl_dump/dumpdir/mogdb-baklist.txt`
gsql -p ${GAUSSPORT} postgres -c "select datname from pg_database where datname not in ('template1','template0','postgres')" -t | grep -v '^$' >${DBLIST_BASE_DIR}
# The real backup step!
echo "`date "+%Y-%m-%d-%H%M"` (1/6) begin backup "
for dbname in ${dbnamelist}
do
echo "`date "+%Y-%m-%d-%H%M"` (2/6) begin backup db data "
gs_dump -E UTF8 ${dbname} -U ${DUMP_USER} -W ${DUMP_PASSWORD} -p ${GAUSSPORT} -F p -f ${DAT_FILE_DIR}/${dbname}_${CUR_DATE}.sql
gs_dumpall -l postgres -U ${DUMP_USER} -W ${DUMP_PASSWORD} -p ${GAUSSPORT} -g -f ${DAT_FILE_DIR}/global_data_${CUR_DATE}.sql
done
tar -cjvPf ${DAT_FILE_DIR}.tar.gz ${DAT_FILE_DIR} --remove-files
echo "`date "+%Y-%m-%d-%H%M"` (3/6) end backup db "
echo "`date "+%Y-%m-%d-%H%M"` (4/6) clean the Invalid backup "
find ${SAVE_BASE_DIR} -not -path '*/\.*' -mtime +8 -type f -name '*'.tar.gz -exec du -sh {} \;
find ${SAVE_BASE_DIR} -not -path '*/\.*' -mtime +8 -type f -name '*'.tar.gz -exec rm -rf {} \;
backup_num=`find ${SAVE_BASE_DIR} -not -path '*/\.*' -mtime -1 -type f -name '*'.tar.gz | wc -l`
echo "`date "+%Y-%m-%d-%H%M"` (5/6) The number of backups remaining is " ${backup_num}
ls -l ${SAVE_BASE_DIR}/*.tar.gz
echo "`date "+%Y-%m-%d-%H%M"` (6/6) backup has been finished "
最后修改时间:2023-03-09 13:30:54
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。