linux下oracle数据库定时备份
linux下oracle数据库定时备份
这里以oradatabak.sh(里面的内容要根据实际修改)脚本放在/home/oracle/app/oracle下为例:
1.创建shell脚本
#!/bin/sh
#:本脚本自动备份1天的数据库,每次备份完成后,删除4天之前的数据。
#加载oracle的相关参数
#如果oracle参数不明确,请使用命令查看
# su - oracle
# echo $ORACLE_HOME
echo "备份脚本开始启动..." #打印备份进度
export ORACLE_SID=orcl
export ORACLE_BASE=/home/oracle/app/oracle
export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/db_1
export PATH=$ORACLE_HOME/bin:$PATH:$HOME/bin
#oracle字符集
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
#ORACLE_HOME
ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_1
#以上代码为Oracle数据库运行账号oracle的系统环境变量设置,必须添加,否则crontab任务计划不能执行。
#oracle info
dateTime=`date +%Y_%m_%d` #当前系统时间
days=4 #删除4天前的备份数据
orsid='10.107.128.12:1521/orcl'
#oralce连接信息
orowner=xxcredit
# 备份此用户下面的数据
bakuser=gc_credit
#用此用户来执行备份,必须要有备份操作的权限
bakpass=credit
#执行备注的用户密码
directory=bakdir
bakdir=/home/oracle/app/oracle/datapump
#备份文件路径,已创建完毕
bakdata=$orowner"_"$dateTime.dmp
#备份数据库名称
baklog=$orowner"_"$dateTime.log
#备份执行时候生成的日志文件名称
ordatabak=$orowner"_"$dateTime.tar.gz
#最后保存的Oracle数据库备份文件
cd $bakdir
echo "现在开始进行数据备份..."
#执行备份
$ORACLE_HOME/bin/expdp $bakuser/$bakpass@10.107.128.12/orcl directory=$directory dumpfile=$bakdata logfile=$baklog
echo "数据备份结束..."
echo "现在开始进行压缩备份数据..."
tar -zcvf $ordatabak $bakdata $baklog
#压缩备份文件和日志文件
echo "压缩备份数据结束..."
echo "删除备份数据开始..."
find $bakdir/ -type f -name "*.log" -exec rm {} \;
#删除备份文件
find $bakdir/ -type f -name "*.dmp" -exec rm {} \;
#删除日志文件
find $bakdir/ -type f -name "*.tar.gz" -mtime +$days -exec rm -rf {} \;
#删除4天前的备份(注意:{} \中间有空格)
echo "删除备份数据结束..."
echo "备份执行完毕..."
2.添加脚本执行权限
chmod +x /home/oracle/app/oracle/oradatabak.sh
bash /home/oracle/app/oracle/oradatabak.sh
出现问题
执行脚本测试中出现问题情况:出现如下情况后
ORA-39002: invalid operation
ORA-39070: Unable to open the log file.
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
原因为之前脚本中,我创建的备份文件夹为bakdir=/home/oracle/app/oracle/datapump
需要先创建备份路径:
创建物理文件夹的时候权限为root权限,oracle无法进行读写,所以需要将文件夹的权限分配给oracle
# 将file的所有者修改为oracle
$ sudo chown oracle /home/oracle/app/oracle/datapump
# 将file的所属组修改为oinstall
$ sudo chgrp oinstall /home/oracle/app/oracle/datapump
3.在oracle用户下添加定时任务
每天晚上23点,以oracle用户执行oradatabak.sh备份文件
#进入oracle 用户下
su - oracle
#执行进入调度
crontab -e
# 添加调度任务
00 23 * * * /home/oracle/app/oracle/oradatabak.sh
出现问题
执行脚本测试中出现问题情况:出现如下情况后
linux crontab报以下错误解决
[root@china ~]# crontab -e
拒绝权限
You (root) are not allowed to access to (crontab) because of pam configuration.
问题排查1:排查用户密码是否过期,发现未过期
如果过期的话,解决办法: 修改后修改oracle密码永不过期
[root@crm-sbldbdg ~]# chage -M 99999 oracle
chage -l oracle命令,再看密码过期时间为never
[root@crm-sbldbdg ~]# chage -l oracle
Last password change : Aug 31, 2020
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 10
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7Minimum number of days between password change : 10
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
问题排查2:修改文件 /etc/pam.d/crond
查看/etc/pam.d/crond
root>more /etc/pam.d/crond
#
# The PAM configuration file for the cron daemon
#
#
# No PAM authentication called, auth modules not needed
account required pam_access.so
account include password-auth
session required pam_loginuid.so
session include password-auth
auth include password-auth
修改文件:
[root@~]# cp /etc/pam.d/crond /etc/pam.d/crond.bak
[root@ ~]# vim /etc/pam.d/crond
#
# The PAM configuration file for the cron daemon
#
#
# No PAM authentication called, auth modules not needed
account sufficient pam_access.so
account include system-auth
session sufficient pam_loginuid.so
session include system-auth
auth sufficient pam_rootok.so
auth required pam_env.so
auth include system-auth
重启crond
service crond restart
4.再次执行任务调度
再次执行
su - oracle
crontab -e
将新增的任务调度添加进去,在执行查看命令 crontab -l
出现问题
发现在oracle 用户下添加任务调度没有被保存。
解决办法,在root 用户下修改/var/spool/cron 文件
修改完后在oracle用户下查看调度任务,发现任务调度已经添加完成