oracle自动备份数据库 - Go语言中文社区

oracle自动备份数据库


最近在使用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:backupdata"    mkdir D:backupdata  
if not exist "D:backuplog"     mkdir D:backuplog  
set DATADIR=D:backupdata
set LOGDIR=D:backuplog
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:backupdatadata_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:backupdatadata_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 补充

工作也是生活的一部分,当专注与工作本身之时,会感受到无穷的乐趣,其创造力也是无限可能的。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/kangguowei/article/details/50990650
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-06-12 20:42:46
  • 阅读 ( 893 )
  • 分类:数据库

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢