环境准备
linux下安装oracle 请看
oracle12c单节点部署
系统版本:
CentOS 7
软件版本:
Oracle12c
备份策略与实现方法
此次备份依赖Oracle自带命令exp与linux下crontab命令(定时任务)
exp
Oracle中exp命令是一个用于导出数据库数据和对象的非常有用的工具。可以将整个数据库导出为一个文件,也可以只导出一部分数据或对象。使用exp命令可以帮助我们备份整个数据库,并将其转移到另一个服务器或重新加载到同一台服务器上的不同实例中。相较于rman 来说对于单用户的备份更加方便且具有较好的移植性。
exp命令参数:
userid:指定访问数据库的用户名和密码。
file:指定导出的文件名(可以包含完整的路径)。
tables:指定要导出的表的列表。可以以逗号分隔,如表1,表2,表3。如果你不指定表名,则导出整个数据库。
owner:指定要导出的所有属主的名称。
rows:指定是否导出表中的行。默认情况下,也就是rows=y,它将导出表中的所有行。
compress:指定是否使用压缩来减小导出文件的大小。默认情况下,也就是compress=n,它不进行压缩。
constrnts:指定是否导出表中的限制。默认情况下,也就是constrnts=y,它将导出表的所有限制。如果你不希望导出表的限制,则设置constrnts=n。
indexes:指定是否导出表中的索引。默认情况下,也就是indexes=y,它将导出表的所有索引。如果你不希望导出表的索引,则设置indexes=n。
triggers:指定是否导出表中的触发器。默认情况下,也就是triggers=y,它将导出表的所有触发器。如果你不希望导出表的触发器,则设置triggers=n。
feedback:指定导出进度的显示方式。默认情况下,也就是feedback=100,每处理100个行就显示一次进度。
buffer:指定通过网络传输的缓冲区的大小。默认情况下,也就是buffer=4096。
corntab
crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
参数:
-e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
-r : 删除目前的时程表
-l : 列出目前的时程表
备份策略:
每天凌晨2点备份一次(具体备份时间视情况而定–选择业务低峰期)
备份文件保留自定义天数(如果磁盘空间充足建议保留2周左右)
创建本地存放备份文件的目录
mkdir /dbbakz/data
创建存放备份脚本的目录
mkdir /dbbakz/scripts
创建远端服务器备份文件存放目录
mkdir /dbbakz/data/对应ip
#例如本地服务器地址为 192.168.10.21 远端服务器地址为172.16.2.101
#则登录172.16.2.101 创建文件夹 /dbbakz/data/192.168.10.21
需对远端服务器提前配置好ssh免密登录 可参照
SSH免密登录
备份
备份脚本:
vi /dbbakz/scripts/oraclebackup.sh
#!/bin/bash
#Create by:zhangyongze
#为什么不问问神奇的海螺呢丶
#oracle备份至远端服务器(本地不保留、远端保留60天)
export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1
export ORACLE_SID=orcl
hostip=`ip addr | grep inet | grep -v 127 | grep -v inet6 |awk '{print $2}'| grep -Eo "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}"|head -n 1`
oracleport=1521 #oracle端口
backNode=172.16.2.101 #远端备份服务器地址需提前配置好免密
lbackPath=/dbbakz/data/ #本地备份文件存放路径
sbackPath=/dbbakz/data/$hostip/ #服务端备份文件存放路径
date=$(date +%Y%m%d%M%H%S) # 获取系统当前日期时间
days=60 #保留时常
orowner=byyy #备份此用户下面的数据
bakuser=byyy #用此用户来执行备份,必须要有备份操作的权限
bakpass=123456 #执行备注的用户密码
bakdata=$ORACLE_SID_$orowner_$date.dmp #备份文件名称
baklog=$ORACLE_SID_$orowner_$date.log #日志文件名称
baktar=$ORACLE_SID_$orowner_$date.tar.gz #压缩后备份文件
echo "------------使用exp开始备份Oracle数据库---------------"
$ORACLE_HOME/bin/exp $bakuser/$bakpass@$hostip:$oracleport/$ORACLE_SID grants=y owner=$orowner file=$lbackPath/$bakdata log=$lbackPath/$baklog #执行备份
echo "------------备份数据库完成---------------"
cd $lbackPath
tar -zcvf $baktar $bakdata $baklog #压缩备份文件和日志文件
echo "------------备份文件已打包---------------"
#传入备份服务器
scp $lbackPath/$baktar $backNode:$sbackPath
echo "------------备份文件已传入备份服务器---------------"
find $lbackPath -type f -name \*.dmp -exec rm {} \; #删除备份文件
find $lbackPath -type f -name \*.log -exec rm {} \; #删除日志文件
find $lbackPath -type f -name \*.tar.gz -daystart -mtime +$days -exec rm -rf {} \; #删除60天前的备份(注意:{} \中间有空格)
echo "------------本地备份文件已删除()---------------"
#删除60天之前的数据库备份文件
ssh $backNode "find $sbackPath -type f -name '*.tar.gz' -daystart -mtime +$days -exec rm -rf {} \;"
echo "------------远端备份文件保留60天备份完成---------------"
定时任务脚本:
#将备份操作加入到定时任务(每天凌晨2点定时执行)
crontab -e
00 2 * * * /dbbakz/scripts/oraclebackup.sh
脚本中调用命令$ORACLE_HOME/bin/exp 是因为使用root用户操作、 同时兼顾备份-打包-传输-删除
可使用
whereis exp
寻找当前服务器命令绝对路径