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

需要先创建备份路径:

image-20220621103805346

创建物理文件夹的时候权限为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:排查用户密码是否过期,发现未过期

image-20220621102554524

如果过期的话,解决办法: 修改后修改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 

image-20220621111135131

将新增的任务调度添加进去,在执行查看命令 crontab -l

image-20220621112049117

出现问题

发现在oracle 用户下添加任务调度没有被保存。

解决办法,在root 用户下修改/var/spool/cron 文件

image-20220621112204659

修改完后在oracle用户下查看调度任务,发现任务调度已经添加完成

image-20220621112326447

posted @ 2022-06-21 11:28  迷途的小码农  阅读(2018)  评论(0编辑  收藏  举报