• 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

  • 相关阅读:
    主机访问虚拟机网络服务失败
    关于接收者为指针的方法
    slice的部分说明
    ES基础知识
    静态语言和动态语言
    数据库设计三大范式
    SparkSQL小例子
    spark小例子
    spark 分析作者发布文章的总阅读量
    spark和hadoop差异
  • 原文地址:https://www.cnblogs.com/jianshuai520/p/16396250.html
Copyright © 2020-2023  润新知