Total Pageviews

Thursday, 2 August 2012

Oralce实现每天自动备份与恢复到另一个库


有时候我们需要每天将一个数据库(A库或开发库)进行备份并且恢复到另一个新的库(B库或开发日库),B库就像是这个A库一个克隆,并且是每天都进行克隆一次.为什么我们需要这么做呢? 当然会要这种的需求了..

现在我就碰到这种情况,A库就是开发库,因为现在还处于研发阶段,所以数据库每天都有可能会变化.所有的应用系统的开发人员都使用A库,但是有一些基本功能(像枚举,系统参数,菜单设置等等)需要开发时,有可能会影响应用系统的开发,所以一般都非常地小心.我们就希望有一个库(B库,开发库的克隆库),这个库随便我们怎么改并且又是应用系统开发库的最新的表结构与数据.需求就这么产生了.上网找了一些资料怎么实现这个需要的.本人整理了一下.

backup_dev.bat文件 :
作用是 : 备份数据库,删除数据库用户并重新创建,最后恢复数据库

REM 得到当前日期字段串,格式为 2000-12-31
SET DATE=%date:~0,10%
REM 设置需要备份的数据库的用户名,密码和SID
SET FROM_USER=dev
SET FROM_USER_PASSWORD=123

REM 设置需要每日还原(恢复)的数据库的用户名,密码和SID
SET TO_USER=dev_daily
SET TO_USER_PASSWORD=123

REM 设置数据库的SID
SET SID=ORCL

REM 设置备份的目录与文件名
SET BACKUP_ROOT=E:\backup_root\oracle\%FROM_USER%_%DATE%\
SET BACKUP_FILE=%BACKUP_ROOT%\%FROM_USER%_%date%.dmp

mkdir %BACKUP_ROOT% -p

REM 进行备份
exp USERID=%FROM_USER%/%FROM_USER_PASSWORD%@%SID% file=%BACKUP_FILE% OWNER=(%FROM_USER%) DIRECT=Y buffer=655000

REM 删除oracle用户的所有相关数据并重新创建,创建的包括用户,表空间,权限等等.
REM 如果该数据库有其它用户连接将会删除用户失败.所有一般是在晚上进行的.
sqlplus %FROM_USER%/%FROM_USER_PASSWORD%@%SID% @create_dev_daily_user.sql

REM 还原数据库
imp %FROM_USER%/%FROM_USER_PASSWORD%@%SID% file=%BACKUP_FILE% fromuser=(%FROM_USER%) touser=(%TO_USER%) buffer=655000 ignore=y commit=y log=%BACKUP_FILE%.log

REM 完成

create_dev_daily_user.sql文件
作用是 : 以下是sql文件,用sqlplus执行,删除并重新创建用户

spool create_user.LOG
CONNECT dev/123@orcl;
  --删除用户--
  DROP USER dev_daily CASCADE;

  --删除表空间--
  DROP TABLESPACE dev_daily including contents;

  --创建表空间--
  CREATE TABLESPACE dev_daily datafile 'D:\ORADATA\ORACLE\dev_daily.DBF' SIZE 200m reuse autoextend ON next 50m;

  --创建用户并授权--
  CREATE USER dev_daily IDENTIFIED BY 1 DEFAULT TABLESPACE dev_daily;
  GRANT dba,RESOURCE,CONNECT TO dev_daily;

  EXIT;
spool off;

注意:
1,用sqlplus执行时,如果有其它用户连接dev_daily库的话,将不能删除用户成功.所以都是用计划任务在晚上执行,这时候就没有开发人员连接该库了.
2,数据库授权给dev_daily为了方便,将数据库管理员的权限给予它了,在真实环境下可以根据实际情况给予相应的权限.