欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Oracle数据库自动备份、删除脚本(含Linux、Windows)

最编程 2024-07-09 07:20:08
...

MySQL自动备份脚本移步->MySQL数据库自动备份、删除脚本(含Linux、Windows)

Oracle数据库自动备份删除脚本

脚本说明:

1.sh脚本为Linux环境下自动备份、删除脚本;
2.bat脚本为Windows环境下自动备份、删除脚本;
3.执行脚本前,请先详细阅读脚本中的注释,进行修改后,再使用。

功能介绍

1.脚本执行逻辑为:先对数据库进行备份,备份完成之后再保留最近的x个备份文件;
2.脚本需要结合定时任务使用,在做定时任务前,建议先手动执行一次,确保能够正常备份。

脚本文件

oracle_backup.sh

# !/bin/bash

# 数据库参数配置部分
# ==================== 按需修改以下内容 ===========================
# 默认备份路径,不建议进行修改
backupDir="/apps/oracle/admin/orcl/dpdump"
# backupDir="/data/oraclebak"

# 备份路径的逻辑文件名
DIRECTORY_NAME="DATA_PUMP_DIR"
# DIRECTORY_NAME="MYDIR"

# 数据库名称
backupSchemas="V5USER"

# 若需要自定义备份路径,需要创建对应文件夹,并在数据库中执行以下命令创建逻辑目录,并修改DIRECTORY_NAME的值为逻辑目录的名称:MYDIR
# mkdir -p /data/oraclebak && chown oracle:oinstall /data/oraclebak
# CREATE DIRECTORY MYDIR AS '/data/oraclebak';
# SELECT	* FROM dba_directories WHERE DIRECTORY_NAME = 'MYDIR';
# GRANT READ,WRITE ON DIRECTORY MYDIR TO V5USER;

# 导出用户名
dbUser="V5USER"
# 密码
dbPasswd="Abc123456"

# 保留最近几个备份文件
reservedNum=3

# 备份文件后缀时间
time="$(date +%Y%m%d%H%M%S)" 
# ==================== 按需修改以上内容 ===========================


# 数据库备份部分
echo "数据库${backupSchemas}开始备份..."

su - oracle -c "expdp ${dbUser}/${dbPasswd} schemas=${backupSchemas} DIRECTORY=${DIRECTORY_NAME} dumpfile=${backupSchemas}_${time}.dmp logfile=${backupSchemas}_${time}.log"

if ((${$?} != 0));then
	echo "数据库${backupSchemas}备份完成。。。"
	echo "备份默认位置为:${backupDir}"
else
	echo "数据库${backupSchemas}备份异常,请检测"
	exit
fi

# 备份文件删除部分
dmpFileNum=$(ls -l  ${backupDir}/${backupSchemas}*.dmp |grep ^- |wc -l)
Num=${dmpFileNum}
if((${Num} > reservedNum));then
	echo "数据库备份文件删除中..."
	while(( dmpFileNum > reservedNum))
		do
			OldFile=$(ls -rt  ${backupDir}/${backupSchemas}*.* | head -2)
			echo  "Delete File:" $OldFile
			rm -f $OldFile
			let "dmpFileNum--"
		done
	echo "数据库备份文件删除完成..."
else
	echo "当前备份文件数:${Num}小于需保留文件数:${reservedNum},不执行删除操作!"
fi

1.注意:
内容由Windows环境复制过去,在Linux执行时候会报错,如“mysql_back.sh:行37: 未预期的符号 `$‘\r’’ 附近有语法错误”,可在Linux上,使用命令:dos2unix mysql_back.sh修改脚本编码。

2.切记:
脚本中,backupDir变量一定要先使用“SELECT * FROM dba_directories;”命令进行查询后,得到的“DATA_PUMP_DIR”逻辑目录名的值。创建逻辑目录及授权可参考脚本中以下部分:

# 若需要自定义备份路径,需要创建对应文件夹,并在数据库中执行以下命令创建逻辑目录,并修改DIRECTORY_NAME的值为逻辑目录的名称:MYDIR
mkdir -p /data/oraclebak && chown oracle:oinstall /data/oraclebak
CREATE DIRECTORY MYDIR AS '/data/oraclebak';
SELECT	* FROM dba_directories WHERE DIRECTORY_NAME = 'MYDIR';
GRANT READ,WRITE ON DIRECTORY MYDIR TO V5USER;

3.优化点:
添加是否压缩备份部分内容内容,定量或定时清理历史备份信息

oracle_backup.bat

@echo off
setlocal enabledelayedexpansion
chcp 65001

rem Oracle安装目录
set ORACLE_PATH=D:\app\Administrator\product\11.2.0\dbhome_1\BIN

rem 设置数据库连接信息
set ORACLE_USERNAME=V82SP1_1
set ORACLE_PASSWORD=Abc123456

rem 设置逻辑目录,默认为:DATA_PUMP_DIR,执行数据库备份命令后,默认备份在该目录下
set BACK_OPTION=DATA_PUMP_DIR
rem 该路径需使用下述SQL查询
set BACK_DIRECTORY="D:\app\ZhangXY\admin\orcl\dpdump\"
rem 查询命令:SELECT	* FROM	dba_directories;
rem 若需要创建逻辑备份目录,可使用命令:CREATE DIRECTORY mydir AS '/data/oraclebak';进行创建,其中mydir为逻辑目录名,/data/oraclebak为逻辑备份目录实际存储路径
rem 注意:创建逻辑备份目录后,需要对用户进行授权,备份时才能正常写入。授权命令:GRANT READ,WRITE ON DIRECTORY MYDIR TO V82SP1_1;

rem 设置备份名
set DATE=%date:~3,4%%date:~8,2%%date:~11,2%
set HOUR="%time:~0,2%"
rem 处理1~9点时间显示一位问题
if "%time:~0,1%"==" " set HOUR=0%time:~1,1%
set MINUTE=%time:~3,2%
set SECOND=%time:~6,2%

set DATE_TIME=%DATE%-%HOUR%%MINUTE%%SECOND%
set BACK_NAME=%ORACLE_USERNAME%_%DATE_TIME%

rem 开始备份
%ORACLE_PATH%\expdp.exe %ORACLE_USERNAME%/%ORACLE_PASSWORD%  directory="%BACK_OPTION%" dumpfile="%BACK_NAME%.dmp" logfile="%BACK_NAME%.log"

rem 若不需要压缩备份,下边部分的代码可注释(需保留最后一行)..................................................................

rem 数据备份目录(不要放置其他内容,仅用于存放数据库压缩文件)
set BACKUP_DIR="E:\OracleBak\"
rem 如果备份目录不存在,将自动创建
if not exist "%BACKUP_DIR%" mkdir "%BACKUP_DIR%"

rem 压缩软件安装目录
set ZIP_PATH="D:\Program Files\7-Zip"

rem 开始压缩文件
%ZIP_PATH%\7z.exe a -tzip %BACKUP_DIR%%BACK_NAME%.zip %BACK_DIRECTORY%%BACK_NAME%.dmp %BACK_DIRECTORY%%BACK_NAME%.log

rem 压缩后,删除原始dmp文件和log文件
del /f /s /q /a %BACK_DIRECTORY%%BACK_NAME%.dmp
del /f /s /q /a %BACK_DIRECTORY%%BACK_NAME%.log

rem 压缩并删除原有文件
rem %RAR_CMD% a  -ep -df "%BACK_FULL_NAME%back.rar" "%BACK_FULL_NAME%.dmp" "%BACK_FULL_NAME%.log" 

rem 删除30天之前的备份数据------> 注意:30这个数字代表留下备份数据的天数,可依据现场情况调整
rem forfiles /p %BACKUP_DIR% /m *.rar -d -30 /c "cmd /c del /f @path"

rem 设置保存文件数量
set SAVE_NUM=5

:: 进入目标目录
cd /d "%BACKUP_DIR%"
 
:: 设置计数器
set /a "COUNTER=0"
 
:: 循环遍历文件,按照修改日期排序
for /f "delims=" %%i in ('dir /b /a-d /o-d /t:w') do (
    set /a "COUNTER+=1"
    if !COUNTER! gtr %SAVE_NUM% (
        del "%%i"
    )
)
endlocal

1.切记:
脚本中,BACK_DIRECTORY变量一定要先使用“SELECT * FROM dba_directories;”命令进行查询后,得到的“DATA_PUMP_DIR”逻辑目录名的值。(创建命令参考脚本说明)
在这里插入图片描述
2.优化点:
目前bat脚本中,默认使用7z进行压缩备份。基于此情况,可优化的点有:
a.设置变量,使用户能够选择是否需要压缩备份;
b.添加其他的压缩软件,使用户在备份的时候,有更多选择

定时备份

Linux:crontab
Windows:定时任务