社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
最近在使用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 补充
工作也是生活的一部分,当专注与工作本身之时,会感受到无穷的乐趣,其创造力也是无限可能的。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!