Oracle数据库:使用 bash脚本 + 定时任务 自动备份数据

Oracle数据库:使用 bash脚本 + 定时任务 自动备份数据

  • 1、前言
  • 2、为什么需要自动化备份?
  • 3、编写备份脚本
  • 4、备份脚本授权
  • 5、添加定时任务
  • 6、重启 crond / 检查 crond 服务状态
  • 7、备份文件检查


💖The Begin💖点点关注,收藏不迷路💖

在这里插入图片描述

1、前言

在日常的系统管理工作中,数据库的备份是至关重要的一环。针对 Oracle 数据库的备份,我们可以编写 Bash 脚本来实现自动化备份操作,从而简化数据库管理的流程,保障数据的安全性和可靠性。

2、为什么需要自动化备份?

数据库作为应用程序的核心数据存储,包含了大量的重要信息,例如用户数据、配置信息等。一旦数据库出现意外故障或数据丢失,可能会给业务带来严重影响甚至损失。因此,定期进行数据库备份并保证备份文件的安全存储是非常重要的。

手动备份存在诸多弊端,例如容易出现疏忽、不及时等问题,因此自动化备份成为了一个更好的选择。通过编写脚本实现自动备份,可以提高效率、减少人为错误,同时也能够更好地保障数据的安全。

3、编写备份脚本

创建备份数据保存目录和bash脚本保存目录。

在 /oracle/backup 目录下创建一个名为 data 的子目录,用于保存备份数据;

在同一目录下创建一个名为 bash 的子目录,用于保存 bash 脚本文件。


mkdir -p /oracle/backup/data 

mkdir -p /oracle/backup/bash 


##先安装 bzip2 压缩工具,后面压缩备份文件用到,或者你使用tar -cvzf 打包为.tar.gz格式也可以
yum install  bzip2

在这里插入图片描述

注意:先对/oracle/backup/data 目录进行授权,要不会报错:

ORA-39002: invalid operation
ORA-39070: Unable to open the log file.
ORA-39087: directory name /ORACLE/BACKUP/DATA is invalid

在这里插入图片描述

解决:

###切换oracle用户
su - oracle 

###启动客户端进程
sqlplus /nolog 

###以管理员登录
conn / as sysdba

##在 Oracle 数据库中创建一个名为 dumpdir 的目录,并将其路径设置为 /oracle/backup/data/。这样,你就能够在数据库中通过目录别名 dumpdir 来引用该路径。

create directory dumpdir as '/oracle/backup/data/';

##针对备份执行备份用户赋予read,write权限,
grant read,write on directory dumpdir to zyl;

在这里插入图片描述

备份脚本模板:

#!/bin/sh

source /home/oracle/.bash_profile

export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/12.2.0
export ORACLE_SID=orcl
export ORACLE_TERM=xterm
export PATH=$ORACLE_HOME/bin:/usr/sbin:$PATH:$HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
#export LANG=C
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

# 以上代码为Oracle数据库运行账号oracle的系统环境变量设置,必须添加,否则crontab任务计划不能执行。

# oracle用户的系统环境变量路径:/home/oracle/.bash_profile

current_date=`date +%Y_%m_%d` # 获取系统当前日期时间
days_to_keep=90 # 设置删除90天之前的备份文件
db_server="192.168.10.19:1521/ORCL"  # Oracle数据库服务器IP、端口、SID
backup_owner="your_username" # 备份此用户下面的数据
backup_user="your_backup_user" # 用此用户来执行备份,必须要有备份操作的权限
backup_password="your_password" # 执行备份的用户密码
backup_dir=/oracle/backup/data  # 备份文件路径,需要提前创建好
backup_data=$backup_owner"_"$current_date.dpdmp # 备份数据库名称
backup_log=$backup_owner"_"$current_date.dplog # 备份执行时生成的日志文件名称
oracle_data_backup=$backup_owner"_"$current_date.tar.bz2 # 最后保存的Oracle数据库备份文件

cd $backup_dir # 进入备份目录
expdp $backup_user/$backup_password DIRECTORY=dumpdir DUMPFILE=$backup_data logfile=$backup_log SCHEMAS=$backup_owner VERSION=11.2.0.1.0   ##注意这里的DIRECTORY值为数据库中创建的 dumpdir 目录
tar -cvjpf $oracle_data_backup $backup_data $backup_log # 压缩备份文件和日志文件
find $backup_dir -type f -name "*.dplog" -exec rm {} \; # 删除备份文件
find $backup_dir -type f -name "*.dpdmp" -exec rm {} \; # 删除日志文件
find $backup_dir -type f -name "*.tar.bz2" -mtime +$days_to_keep -exec rm -rf {} \; # 删除90天前的备份(注意:{} \中间有空格)

cd 到/oracle/backup/bash ,vi 编写备份脚本,如vi backup_oracle.sh

查看oracle有关的环境变量:

## Oracle 数据库软件的基础目录
echo $ORACLE_BASE

##Oracle 数据库软件的安装目录
echo $ORACLE_HOME

##可执行程序的路径
echo $PATH

在这里插入图片描述

修改模板文件:

#!/bin/sh

source /home/oracle/.bash_profile

export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0
export ORACLE_SID=orcl
export ORACLE_TERM=xterm
export PATH=$ORACLE_HOME/bin:/usr/sbin:$PATH:$HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
#export LANG=C
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

# 以上代码为Oracle数据库运行账号oracle的系统环境变量设置,必须添加,否则crontab任务计划不能执行。

# oracle用户的系统环境变量路径:/home/oracle/.bash_profile

current_date=`date +%Y_%m_%d` # 获取系统当前日期时间
days_to_keep=90 # 设置删除90天之前的备份文件
db_server="192.168.234.20:1521/ORCL"  # Oracle数据库服务器IP、端口、SID
backup_owner="zyl" # 备份此用户下面的数据(和模式名一样)
backup_user="system" # 用此用户来执行备份,必须要有备份操作的权限
backup_password="Zyl#123456" # 执行备份的用户密码
backup_dir=/oracle/backup/data  # 备份文件路径,需要提前创建好
backup_data=$backup_owner"_"$current_date.dpdmp # 备份数据库名称
backup_log=$backup_owner"_"$current_date.dplog # 备份执行时生成的日志文件名称
oracle_data_backup=$backup_owner"_"$current_date.tar.bz2 # 最后保存的Oracle数据库备份文件,tar.bz2/.gz格式,选一种即可


cd $backup_dir # 进入备份目录
expdp $backup_user/$backup_password DIRECTORY=dumpdir DUMPFILE=$backup_data logfile=$backup_log SCHEMAS=$backup_owner VERSION=11.2.0.1.0 
tar -cvjpf $oracle_data_backup $backup_data $backup_log # 压缩备份文件和日志文件,.tar.bz2格式,选一种即可

#tar -cvzf $oracle_data_backup $backup_data $backup_log # 压缩备份文件和日志文件,.tar.gz格式


find $backup_dir -type f -name "*.dplog" -exec rm {} \; # 删除备份文件
find $backup_dir -type f -name "*.dpdmp" -exec rm {} \; # 删除日志文件
find $backup_dir -type f -name "*.tar.bz2" -mtime +$days_to_keep -exec rm -rf {} \; # 删除90天前的备份(注意:{} \中间有空格)

在这里插入图片描述

4、备份脚本授权

在添加定时任务之前,需要确保脚本已经有可执行权限。可以使用chmod +x 备份脚本 命令赋予脚本可执行权限。

chmod +x /oracle/backup/bash/backup_oracle.sh

在这里插入图片描述

5、添加定时任务

拓展:

当设置定时任务时,可以使用以下格式来详细定义时间:

* * * * *  执行脚本绝对路径
- - - - -
| | | | |
| | | | +----- 星期几 (0 - 7) (星期天可以用0或7表示)
| | | +------- 月份 (1 - 12)
| | +--------- 日期 (1 - 31)
| +----------- 小时 (0 - 23)
+------------- 分钟 (0 - 59)


通过这五个字段的组合,可以精确地定义定时任务执行的时间。例如:

30 2 * 1-5        表示在周一到周五的凌晨230分执行任务。
0 20 * * 1,3,5    表示在周一、周三、周五的晚上8点执行任务。
0 * * * *         表示每分钟执行一次任务。
0 3 * * *         表示每天凌晨3点执行任务。
0 4 1 * *         表示每月的第一天凌晨4点执行任务。

根据具体的需求,可以灵活地调整定时任务的时间设置。

为脚本添加定时任务可以实现自动备份,以下是添加定时任务的步骤:

打开终端窗口,输入crontab -e命令,编辑当前用户的定时任务配置文件。

crontab -e

在文件中添加如下一行,注意是脚本的绝对路径,表示每天凌晨3点执行备份:

0 3 * * * /oracle/backup/bash/backup_oracle.sh

在这里插入图片描述

如果出现下面报错:

UDE-00013: Message 13 not found; No message file for product=RDBMS, facility=UDE
UDE-00019: You may need to set ORACLE_HOME to your Oracle software directory

在这里插入图片描述

是因为指定的ORACLE_HOME没有生效。

如果是直接用expdp命令执行,执行前先做一次 source /home/oracle/.bash_profile 。

如果是使用shell脚本调度执行,需要在shell脚本中再次声明赋值 ORACLE_HOME、ORACLE_SID 变量,因为shell脚本调度的时候,使用的是 全局环境变量 /etc/profile。

如果频繁使用shell执行Oracle命令,可以把这些配置参数刷新到 /etc/profile 中。如果没有设定ORACLE_HOME、ORACLE_SID,在调度shell命令的时候,会报错 UDE-00013、UDE-00019

解决:

1、su root

vi /etc/profile ,末尾加上如下配置:

####添加内容
# use for oracle

unset   TNS_ADMIN
export  ORACLE_BASE=/u01/app/oracle
export  ORACLE_HOME=$ORACLE_BASE/product/11.2.0

export  ORACLE_SID=orcl

export  PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin

export  LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib
#防止Oracle安装界面乱码,先把语言环境改为英文
export LANG=en_US

if [ $USER = "oracle" ];then

   if [ $SHELL = "/bin/ksh" ];then

     ulimit -p 16384

     ulimit -n 65536

   else

    ulimit -u 16384 -n 65536

   fi

   fi

在这里插入图片描述

2、使配置文件生效:

source /etc/profile

6、重启 crond / 检查 crond 服务状态

#重启 
systemctl restart crond

#服务状态查看
systemctl status crond

在这里插入图片描述

7、备份文件检查

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/461779.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

matlab 平面桁架有限元受力分析计算

1、内容简介 略 62-可以交流、咨询、答疑 平面桁架有限元受力分析计算 2、内容说明 略 3、仿真分析 略 4、参考论文 略

宿主环境

1. 什么是宿主环境 宿主环境( host environment )指的是程序运行所必须的依赖环境。例如: Android 系统和 iOS 系统是两个不同的宿主环境。安卓版的微信 App 是不能在 iOS 环境下运行的,所以, Android 是安卓软件的宿…

“import ... =“ 只能在 TypeScript 文件中使用

当你遇到这个问题很苦恼。 可以按照以下解决办法 使用ctrlshiftP 修改"javascript.validate.enable": false

php中 0 == ‘’(0等于任意字符串) 判断是否成立 返回true

php中不同类型变量之间比较大小 一、背景二、探究0是为什么?三、探究 0all是为什么?四、程序中如何判断0是否等于指定字符串 一、背景 最近在项目实际开发中,我需要判断前端传来的参数值是否等于一个字符串;然后发现当参数值是0时…

MATLAB学习笔记(二)PDE求解偏微分方程组

一、利用PDE求解偏微分方程组 初值为: 针对上述方程组,利用matlab自带工具箱和函数PDE进行求解。 以下是matlab中对工具箱中pdepe函数的解释。 二、matlab编程 在matlab中编程,利用PDE函数求解以上偏微分方程。 clc; clear; syms y global …

【蓝桥杯单片机】十三届省赛“重难点”解析(附源码)

【蓝桥杯单片机】十三届省赛“重难点”解析 一、题目难点解析二、易出错点提示三、完整代码链接 笔记包括:①题目难点解析、②易出错点提示、③完整代码链接 注:本文提供的所有代码都是使用第十四届竞赛包完成 ⭐----------系列文章链接----------⭐ 【蓝…

Java初阶数据结构二叉树实现+练习完整(工程文件后序会进行上传)

i1.二叉树的概念 1.二叉树的定义 (1)二叉树可以是一个节点的有限集合 (2)可以为空 (3)或者是由一个根节点加上两棵分别称为左子树和右子树的二叉树组成的 (4)二叉树的每一个节点…

力扣细节题:字符串中的最大奇数

奇数只要找到第一位是奇数的即可,不是找单个数字 //即从最低位开始,找到第一位为奇数的位 //然后之前的就是需要的数字char * largestOddNumber(char * num){int i strlen(num) - 1;while(i > 0){if((num[i] - 0) % 2 1)break;i--;}//先找到低位开…

电子科技大学链时代工作室招新题C语言部分---题号E

1. 题目 这道题大概的意思是说,一座城市中被埋了许多雷(用一个只含0和1的字符串表示城市,1代表有雷,0代表无雷)。 你作为一个排雷兵,需要花最少的钱引爆所有的雷来使城市中不再有雷(太逆天了&a…

Java宝典-异常

目录 1. 异常的分类1.1 运行时异常1.2 编译时异常 2. 异常的抛出2.1 throw2.2 throws 3. 异常的捕获3.1 try-catch3.2 finally 4. 异常执行的过程5. 自定义异常 在Java中,异常(Exception)是指程序发生不正常的行为,异常其实就是一个一个的类。 1. 异常的…

c++刷题(自用)(问题合集)---(一直会更)

初始化列表易错点 #include <iostream> using namespace std;struct A {A() { std::cout << "A"; } }; struct B {B() { std::cout << "B"; } };class C { public:C() : a(), b(){std::cout << "C";}private:B b;A a; …

【AcWing】蓝桥杯集训每日一题Day5|归并排序|离散化|二分|逆序数对|505.火柴排队(C++)

火柴排队 505. 火柴排队 - AcWing题库难度&#xff1a;中等时/空限制&#xff1a;1s / 128MB总通过数&#xff1a;2058总尝试数&#xff1a;4484来源&#xff1a;NOIP2013提高组算法标签贪心离散化树状数组归并排序 题目内容 涵涵有两盒火柴&#xff0c;每盒装有 n 根火柴…

基于Pnpm + Turborepo + QianKun的微前端+Monorepo实践

基于Pnpm Turborepo QianKun的微前端Monorepo实践 背景 微前端一般都会涉及多个代码库&#xff0c;很多时候要一个一个代码库地去开发维护和运行&#xff0c;很不方便&#xff0c;这种时候引入Monorepo搭配微前端就能很好地解决这种问题&#xff0c;一个代码库就可以完成整…

AI赋能写作:AI大模型高效写作一本通

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星评选TOP 10&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作…

文件包含例子

一、常见的文件包含函数 php中常见的文件包含函数有以下四种&#xff1a; include() require() include_once() require()_once() include与require基本是相同的&#xff0c;除了错误处理方面: include()&#xff0c;只生成警告&#xff08;E_WARNING&#xff09;&#x…

linux之source.list解析

众所周知&#xff0c;linux可以通过apt命令安装软件&#xff0c;那么apt又是从哪里获取软件包呢并安装呢&#xff1f;这里就绕不开一个文件source.list&#xff0c;该文件定义了软件源相关的信息。下面以实际例子&#xff0c;详细的介绍下这个文件。 文件作用 定义软件源的信…

MySQL-HMA 高可用故障切换

本章内容&#xff1a; 了解MySQL MHA搭建MySQL MHAMySQL MHA故障切换 1.案例分析 1.1.1案例概述 目前 MySQL 已经成为市场上主流数据库之一&#xff0c;考虑到业务的重要性&#xff0c;MySQL 数据库 单点问题已成为企业网站架构中最大的隐患。随着技术的发展&#xff0c;MHA…

【C++庖丁解牛】List容器的介绍及使用 | 深度剖析 | list与vector的对比

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1. list的介绍1.1 list的…

每周一算法:双向深搜

题目描述 达达帮翰翰给女生送礼物&#xff0c;翰翰一共准备了 N N N 个礼物&#xff0c;其中第 i i i 个礼物的重量是 G [ i ] G[i] G[i]。 达达的力气很大&#xff0c;他一次可以搬动重量之和不超过 W W W的任意多个物品。 达达希望一次搬掉尽量重的一些物品&#xff0c;请…

冲动是魔鬼,工作不顺心时不要把坏脾气带给家人

今天与一个跟踪了很久的客户准备签合同了&#xff0c;客户突然反悔&#xff0c;为此与他周旋了一整天&#xff0c;忙碌得一口水都没有喝。回到小区坐在车里抽着烟&#xff0c;久久不愿回家&#xff0c;只想一个人坐着&#xff0c;疲惫、无奈。这个月的奖金似乎又将成为泡影。 …