袋鼠云技术团队 + 关注
手机版

Oracle RMAN备份上传到阿里云OSS脚本

  1. 云栖社区>
  2. 袋鼠云技术团队>
  3. 博客>
  4. 正文

Oracle RMAN备份上传到阿里云OSS脚本

powdba 发布时间:2018-04-26 10:58:22 浏览2131 评论0

摘要: DBA都知道,备份对于数据库的重要性是不言而喻的。特别是在误删数据的情况,救命用的最多的可能就是备份了。有个客户的环境也比较复杂,单个服务器有三个Oracle实例,而且是部署在不同用户下的。现在的需求是要把不同用户下的Oracle实例全量物理备份上传到阿里云的OSS上,保证备份文件的安全性阿里云OSS了解下:https://help.

DBA都知道,备份对于数据库的重要性是不言而喻的。特别是在误删数据的情况,救命用的最多的可能就是备份了。
有个客户的环境也比较复杂,单个服务器有三个Oracle实例,而且是部署在不同用户下的。现在的需求是要把不同用户下的Oracle实例全量物理备份上传到阿里云的OSS上,保证备份文件的安全性
阿里云OSS了解下:https://help.aliyun.com/product/31815.html?spm=a2c4g.11186623.6.90.OAsRt8
作为阿里云最优秀服务商,自然也有更加强大的云上数据库运维管控平台:https://easydb.dtstack.com

Oracle物理备份的方式自然是使用RMAN,那么脚本在网上随便就可以找得到的。那么怎么保证备份的文件夹能够上传到阿里云的OSS上呢?
那么就需要借助OSS的工具:ossutil
下载和安装的方法不再赘述,参考这个网址即可:https://help.aliyun.com/document_detail/50452.html?spm=a2c4g.11186623.6.1057.D3lBFJ

使用前必须配置bucket的配置文件,具体操作选项:

$./ossutil -h
Usage of ossutil:
Options:
-s --short-format 显示精简格式,如果未指定该选项,默认显示长格式。
--snapshot-path= 该选项用于在某些场景下加速增量上传批量文件(目前,下载和拷贝不支持该选项)。在cp上传文件时使用该选项,ossutil在指定的目录下生成文件记录文件上传的快照信息,在下一次指定该选项上传时,ossutil会读取指定目录下的快照信息进行增量上传。用户指定的snapshot目录必须为本地文件系统上的可写目录,若该目录不存在,ossutil会创建该文件用于记录快照信息,如果该目录已存在,ossutil会读取里面的快照信息,根据快照信息进行增量上传(只上传上次未成功上传的文件和本地进行过修改的文件),并更新快照信息 。注意:因为该选项通过在本地记录成功上传的文件的本地lastModifiedTime,从而在下次上传时通过比较lastModifiedTime来决定是否跳过相同文件的上传,所以在使用该选项时,请确保两次上传期间没有其他用户更改了oss上的对应object。当不满足该场景时,如果想要增量上传批量文件,请使用--update选项。另外,ossutil不会主动删除snapshot-path下的快照信息,为了 避免快照信息过多,当用户确定快照信息无用时,请用户自行清理snapshot-path。
-j --jobs= 多文件操作时的并发任务数,默认值:5,取值范围:1-10000
-v --version 显示ossutil的版本(1.0.0.Beta2)并退出。
--output-dir= 指定输出文件所在的目录,输出文件目前包含:cp命令批量拷贝文件出错时所产生的report文件(关于report文件更多信息,请参考cp命令帮助)。默认值为 :当前目录下的ossutil_output目录。
--parallel= 单文件内部操作的并发任务数,取值范围:1-10000, 默认将由ossutil根据操作类型和文件大小自行决定。
-L --language= 设置ossutil工具的语言,默认值:CH,取值范围:CH/EN
-t --sts-token= 访问oss使用的STSToken(该选项值会覆盖配置文件中的相应设置),非必须设置项。
-m --multipart 指定操作的对象为bucket中未完成的Multipart事件,而非默认情况下的object。
-b --bucket 对bucket进行操作,该选项用于确认操作作用于bucket
--delete 删除操作
-e --endpoint= ossutil工具的基本endpoint配置(该选项值会覆盖配置文件中的相应设置),注意其必须为一个二级域名。
-k --access-key-secret= 访问oss使用的AccessKeySecret(该选项值会覆盖配置文件中的相应设置)。
--bigfile-threshold= 开启大文件断点续传的文件大小阈值,默认值:100M,取值范围:0B-9223372036854775807B
--retry-times= 当错误发生时的重试次数,默认值:3,取值范围:1-500
-a --all-type 指定操作的对象为bucket中的object和未完成的Multipart事件。
-r --recursive 递归进行操作。对于支持该选项的命令,当指定该选项时,命令会对bucket下所有符合条件的objects进行操作,否则只对url中指定的单个object进行操作。
-f --force 强制操作,不进行询问提示。
-u --update 更新操作
-c --config-file= ossutil工具的配置文件路径,ossutil启动时从配置文件读取配置,在config命令中,ossutil将配置写入该文件。
-i --access-key-id= 访问oss使用的AccessKeyID(该选项值会覆盖配置文件中的相应设置)。
--acl= acl信息的配置。
-d --directory 返回当前目录下的文件和子目录,而非递归显示所有子目录下的所有object。
--checkpoint-dir= checkpoint目录的路径(默认值为:.ossutil_checkpoint),断点续传时,操作失败ossutil会自动创建该目录,并在该目录下记录checkpoint信息,操作成功会删除该目录。如果指定了该选项,请确保所指定的目录可以被删除。
--type= 计算的类型, 默认值:crc64, 取值范围: crc64/md5
-h --help Show usage message

执行步骤如下:
1.配置文件
$ /app/ossutil64 config -e endpoint -i access-key-id -k access-key-secret -L ch -c 配置文件存储路径和命名(如:/u01/a.txt)

2.验证是否配置成功
$ /app/ossutil64 --config-file=/u01/a.txt ls oss://bucket

3.建立bucket
$ /app/ossutil64 --config-file=/u01/a.txt mb oss://bucket

4.上传文件到bucket
$ /app/ossutil64 --config-file=/u01/a.txt cp -r /u01/backup/data oss://bucket

性能调优:
在cp命令中,通过--jobs项和--parallel项控制并发数。--jobs项控制多个文件上传/下载/拷贝时,文件间启动的并发数。--parallel制分片上传/下载/拷贝一个大文件时,每一个大文件启动的并发数。
默认情况下,ossutil会根据文件大小来计算parallel个数(该选项对于小文件不起作用,进行分片上传/下载/拷贝的大文件文件阈值可由--bigfile-threshold选项来控制),当进行批量大文件的上传/下载/拷贝时,实际的并发数为jobs个数乘以parallel个数。该两个选项可由用户调整,当ossutil自行设置的默认并发达不到用户的性能需求时,用户可以自行调 整该两个选项来升降性能。

注意:
1.如果并发数调得太大,由于线程间资源切换及抢夺等,ossutil上传/下载/拷贝性能可能会下降,所以请根据实际的机器情况调整这两个选项的数值,如果要进行压测,可以一开始将两个数值调低,慢慢调大寻找最优值。
2.如果--jobs选项和--parallel选项值太大,在机器资源有限的情况下,可能会因为网络传输太慢,产生EOF错误,这个时候请适当降低--jobs选项和--parallel选项值。

最后把脚本贴出来,请多多指正:

#!/bin/bash
. $HOME/.bash_profile
BKDIR="/u01/backup"
DATE="`date '+%Y%m%d'`"
JOB_BEGIN="`date '+%Y%m%d_%H%M'`"
LOGFILE=$BKDIR/log/${JOB_BEGIN}_rmanbak.log
RMANLOGFILE=$BKDIR/log/${JOB_BEGIN}_rmanbak_rman.log
OSSLOG=$BKDIR/oss.log
SYSTEM=""$HOSTNAME"_"$ORACLE_SID"_"$JOB_BEGIN""

echo "$JOB_BEGIN Rman Backup start" >> $LOGFILE
echo "" >> $LOGFILE
echo "$ORACLE_HOME/bin/rman cmdfile=$BKDIR/rman.rcv log=$RMANLOGFILE "  >> $LOGFILE

mkdir -p /u01/backup/data/$JOB_BEGIN
$ORACLE_HOME/bin/rman log=$RMANLOGFILE >>$LOGFILE <<EOF  
connect target /
run {
allocate channel d1 type disk;
allocate channel d2 type disk;
allocate channel d3 type disk;
allocate channel d4 type disk;
backup as compressed backupset incremental level 0 database format '/u01/backup/data/$JOB_BEGIN/DB_level0_%d_%T_%s_%p_%u.bak'tag='level 0' include current controlfile;
sql 'alter system archive log current';
backup as compressed backupset archivelog all format '/u01/backup/data/$JOB_BEGIN/ARCHIVE_Log_%d_%T_%s_%p_%u.bak' delete all input;
release channel d1;
release channel d2;
release channel d3;
release channel d4;
}
crosscheck backup;
delete noprompt expired backup;
delete noprompt obsolete;
exit;
EOF

echo "Done @`date '+%Y%m%d_%H%M'`" >> $LOGFILE
echo "" >> $LOGFILE

JOB_END="`date '+%Y%m%d_%H%M'`"
echo "$JOB_END Rman Backup end." >> $RMANLOGFILE

#/app/ossutil64 config -e  -i  -k  -L ch -c /u01/a.txt
/app/ossutil64 --config-file=/u01/a.txt mb oss://test-yuelei/$SYSTEM >> $OSSLOG
/app/ossutil64 --config-file=/u01/a.txt cp -r /u01/backup/data/$JOB_BEGIN oss://test-yuelei/$SYSTEM >> $OSSLOG
echo "/app/ossutil64 --config-file=/u01/a.txt cp -r /u01/backup/data/$JOB_BEGIN oss://test-yuelei/$SYSTEM" >> $LOGFILE

OSS_END="`date '+%Y%m%d_%H%M'`"
echo "$OSS_END OSS Backup end." >> $OSSLOG
echo "" >> $OSSLOG
【云栖快讯】云栖专辑 | 阿里开发者们的20个感悟,一通百通  详情请点击

网友评论