您的位置:首页 > 数据库 > Oracle

oracle自动备份数据库

2016-03-27 10:56 676 查看
最近在使用oracle,本人经常没心,担心数据丢失,所以只能通过各种方式来减少丢失的概率。于是研究了一下oracle数据库备份,其实也算不上研究了,就是百度查找资料然后自己实际操作呗。下面把步骤总结一下。

目录:

一,Windows下的oracle自动备份

二,Ubuntu下的oracle自动备份

一、Windows下oracle 自动备份

1,系统:Windows7

2,建立.bat执行文件

3,建立定时器任务,定时执行

4,向数据库导入dmp文件

下面是语句,直接新建一个文本文档,文件类型为.bat,然后复制粘贴过去即可。

@echo off
echo ================================================
echo  Windows环境下Oracle数据库的自动备份脚本
echo  1. 使用当前日期命名备份文件。
echo  2. 自动删除7天前的备份。
echo ================================================

::以“YYYYMMDD”格式取出当前时间。
set BACKUPDATE=%date:~0,4%%date:~5,2%%date:~8,2%%Time:~0,2%%Time:~3,2%%Time:~6,2%
::创建备份目录。
if not exist "D:\backup\data"    mkdir D:\backup\data
if not exist "D:\backup\log"     mkdir D:\backup\log
set DATADIR=D:\backup\data
set LOGDIR=D:\backup\log
set mydate=%date:~0,4%%date:~5,2%%date:~8,2%%Time:~0,2%
exp userid='ADMIN/kanggw@OracleOrcl'  file=%DATADIR%\data_%BACKUPDATE%.dmp log=%LOGDIR%\log_%mydate%.log
::删除7天前的备份。
forfiles /p "%DATADIR%" /s /m *.* /d -7 /c "cmd /c del @path"
forfiles /p "%LOGDIR%" /s /m *.* /d -7 /c "cmd /c del @path"
exit

imp  BACKUPS/kanggw@OracleOrcl  file='D:\backup\data\data_20160325161222.dmp' full=y


其中:@sid是服务名,如果不知道可以在开始里输入:net ,打开net manager 查看</span>




注:如果有时我们写bat脚本执行时一闪而过,无法排错;那么我可以在脚本的最后加个pause(如上面的脚本可以把exit换成pause),用pause结尾执行完后,会提示按任意键来继续或退出,

这样我就能知道是什么报错。

2,建立定时器任务,每天自动执行

1,在开始里输入“任务计划”,会显示任务计划器



2,打开任务计划器后,选择创建基本任务



3,直接按要求输入,然后下一步即可,当执行到 操作 一步时,要选择刚才建立的bat文件



4,注意:如需每天自动执行,则oracle的监听服务要看起,就是通常用oracle时要开的那个服务。

4)向数据库导入dmp文件

生成备份当然是为了导入,导入非常简单,如下语句

imp  BACKUPS/kanggw@OracleOrcl  file='D:\backup\data\data_20160325161222.dmp' full=y

既可以 直接 cmd 在控制台运行,也可以建立一个.bat文件,随便你自己。其中:BACKUPS是用户名,kanggw是密码。@后是数据库服务名。

但当用exp备份时,空表是不进行备份的。oracle11G有一个新特性,如需备份需要进行设置

设置deferred_segment_creation 参数

show parameter deferred_segment_creation

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation            boolean     TRUE
SQL> alter system set deferred_segment_creation=false;

该参数值默认是TRUE,当改为FALSE时,无论是空表还是非空表,都分配segment。
原因:11G中有个新特性,当表无数据时,不分配segment,以节省空间。

解决方法: 1、insert一行,再rollback就产生segment了。

  该方法是在在空表中插入数据,再删除,则产生segment。导出时则可导出空表。

  2、设置deferred_segment_creation 参数

  该参数值默认是TRUE,当改为FALSE时,无论是空表还是非空表,都分配segment。

  需注意的是:该值设置后对以前导入的空表不产生作用,仍不能导出,只能对后面新增的表产生作用。
                如 需导出之前的空表,只能用第一种方法

二、Ubuntu下oracle自动备份

我总结为两部分:

1,备份脚本的实现(复制粘贴)。

2,定时执行备份脚本

1,备份脚本的实现(复制粘贴)

代码示例:

su - oracle 

oracle为安装oracle的用户或者是root也可以。

在/opt下创建backup文件夹,在该文件夹下创建auto_backup.sh文件。

该文件内容为:

#!/bin/sh
export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export ORACLE_SID=orcl
export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin

export NLS_LANG=AMERICAN_AMERICA.UTF8

export DATA_DIR=/opt/backup/data
export LOGS_DIR=/opt/backup/logs
export DELTIME=`date -d "7 days ago" +%Y%m%d`
export BAKUPTIME=`date +%Y%m%d%H%M%S`

mkdir -p $DATA_DIR
mkdir -p $LOGS_DIR
echo "Starting bakup..."
echo "Bakup file path $DATA_DIR/$BAKUPTIME.dmp"
exp admin/bjgyjs@orcl file=$DATA_DIR/$BAKUPTIME.dmp log=$LOGS_DIR/$BAKUPTIME.log

echo "Delete the file bakup before 7 days..."
rm -rf $DATA_DIR/$DELTIME*.dmp
rm -rf $LOGS_DIR/$DELTIME*.log
echo "Delete the file bakup successfully. "

echo "Bakup completed."
具体参数与Windows的类似。可以看到数据超过七天就会被清除,否则会导致硬盘容量不足。

2,定时执行备份脚本

添加定时执行任务
输入命令
crontab -e  进入oracle用户的定时任务执行列表

输入:0 23 * * * /opt/backup/auto_backup.sh 

此处为每天晚上23点开始执行备份,具体时间 ,可参考Linux 的Cron表达式,可提供多种时间机制。

2016-10-27
补充

工作也是生活的一部分,当专注与工作本身之时,会感受到无穷的乐趣,其创造力也是无限可能的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle 备份