Chinaunix首页 | 论坛 | 博客
  • 博客访问: 22759
  • 博文数量: 12
  • 博客积分: 570
  • 博客等级: 中士
  • 技术积分: 150
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-04 10:04
文章分类

全部博文(12)

文章存档

2009年(3)

2008年(9)

我的朋友

分类: Oracle

2008-10-21 09:11:39

 当我们使用一个数据库时,总希望数据库的内容是可靠的、正确的,但由于计算

机系统的故障(包括机器故障、介质故障、误操作等),数据库有时也可能遭到破坏,

这时如何尽快恢复数据就成为当务之急。如果平时对数据库做了备份,那么此时恢复数

据就显得很容易。由此可见,做好数据库的备份是多么的重要,下面笔者就以ORACLE7

为例,来讲述一下数据库的备份和恢复。ORACLE 数据库有三种标准的备份方法,它们

分别为导出/导入(EXPORT/IMPORT)、冷备份、热备份。导出备份是一种逻辑备份,冷

备份和热备份是物理备份。

 

 一、导出/导入(Export/Import

 

 利用Export可将数据从数据库中提取出来,利用Import则可将提取出来的数据送

Oracle数据库中去。

 

 1. 简单导出数据(Export)和导入数据(Import

 

 Oracle支持三种类型的输出:

 

 1)表方式(T方式),将指定表的数据导出。

 

 2)用户方式(U方式),将指定用户的所有对象及数据导出。

 

 3)全库方式(Full方式),将数据库中的所有对象导出。

 

 数据导出(Import)的过程是数据导入(Export)的逆过程,它们的数据流向不

同。

 

 2. 增量导出/导入

 

 增量导出是一种常用的数据备份方法,它只能对整个数据库来实施,并且必须作

SYSTEM来导出。在进行此种导出时,系统不要求回答任何问题。导出文件名缺省为

export.dmp,如果不希望自己的输出文件定名为export.dmp,必须在命令行中指出要用

的文件名。

 

 增量导出包括三个类型:

 

 1)“完全”增量导出(Complete

 

 即备份整个数据库,比如:

 

 exp system/manager inctype=complete file=990702.dmp

 

 2增量型”增量导出

 

 备份上一次备份后改变的数据。比如:

 

 exp system/manager inctype=incremental file=990702.dmp

 

 3累计型”增量导出(Cumulative

 

 累计型导出方式只是导出自上次“完全” 导出之后数据库中变化了的信息。比如

 

 exp system/manager inctype=cumulative file=990702.dmp

 

 数据库管理员可以排定一个备份日程表,用数据导出的三个不同方式合理高效地

完成。

 

 比如数据库的备份任务可作如下安排:

 

 星期一:完全导出(A

 

 星期二:增量导出(B

 

 星期三:增量导出(C

 

 星期四:增量导出(D

 

 星期五:累计导出(E

 

 星期六:增量导出(F

 

 星期日:增量导出(G

 

 如果在星期日,数据库遭到意外破坏,数据库管理员可按以下步骤来恢复数据库

 

 第一步:用命令CREATE DATABASE重新生成数据库结构;

 

 第二步:创建一个足够大的附加回段。

 

 第三步:完全增量导入A

 

 imp system./manager inctype= RECTORE FULL=Y FILE=A

 

 第四步:累计增量导入E

 

 imp system/manager inctype= RECTORE FULL=Y FILE =E

 

 第五步:最近增量导入F

 

 imp system/manager inctype=RESTORE FULL=Y FILE=F

 

 二、冷备份

 

 冷备份发生在数据库已经正常关闭的情况下,当正常关闭时会提供给我们一个完

整的数据库。冷备份是将关键性文件拷贝到另外位置的一种说法。对于备份Oracle信息

而言,冷备份是最快和最安全的方法。冷备份的优点是:

 

 1.是非常快速的备份方法(只需拷贝文件)

 

 2.容易归档(简单拷贝即可)

 

 3.容易恢复到某个时间点上(只需将文件再拷贝回去)

 

 4.能与归档方法相结合,作数据库“最新状态”的恢复。

 

 5.低度维护,高度安全。

 

 但冷备份也有如下不足:

 

 1.单独使用时,只能提供到“某一时间点上”的恢复。

 

 2.在实施备份的全过程中,数据库必须要作备份而不能作其它工作。也就是说,

在冷备份过程中,数据库必须是关闭状态。

 

 3.若磁盘空间有限,只能拷贝到磁带等其它外部存储设备上,速度会很慢。

 

 4.不能按表或按用户恢复。

 

 如果可能的话(主要看效率),应将信息备份到磁盘上,然后启动数据库(使用

户可以工作)并将所备份的信息拷贝到磁带上(拷贝的同时,数据库也可以工作)。冷

备份中必须拷贝的文件包括:

 

 1.所有数据文件

 

 2.所有控制文件

 

 3.所有联机REDO LOG文件

 

 4Init.ora文件(可选)。

 

 值得注意的是冷备份必须在数据库关闭的情况下进行,当数据库处于打开状态

时,执行数据库文件系统备份是无效的

 

 下面是做冷备份的完整例子:

 

 1) 关闭数据库$sqldba lmode=y

 

 SQLDBA >connect internal;

 

 SQLDBA >shutdown normal;

 

 2) 用拷贝命令备份全部的时间文件、重做日志文件、控制文件、初始化参数

文件

 

 SQLDBA >! cp < file > < backup directory >

 

 3) 重启Oracle数据库

 

 sqldba lmode=y

 

 SQLDBA >connect internal;

 

 SQLDBA >startup;

 

 三、热备份

 

 热备份是在数据库运行的情况下,采用archivelog mode方式备份数据的方法。所

以,如果你有昨天夜里的一个冷备份而且又有今天的热备份文件,在发生问题时,就可

以利用这些资料恢复更多的信息。热备份要求数据库在Archivelog方式下操作,并需要

大量的档案空间。一旦数据库运行在archivelog状态下,就可以做备份了。热备份的命

令文件由三部分组成:

 

 1.数据文件一个表空间一个表空间地备份。

 

 1)设置表空间为备份状态

 

 2)备份表空间的数据文件

 

 3)恢复表空间为正常状态

 

 2.备份归档log文件。

 

 1)临时停止归档进程

 

 2log下那些在archive redo log目标目录中的文件

 

 3)重新启动archive进程

 

 4)备份归档的redo log 文件

 

 3.用alter database backup controlfile命令来备份拷贝文件

 

 热备份的优点是:

 

 1.可在表空间或数据文件级备份,备份时间短。

 

 2.备份时数据库仍可使用。

 

 3.可达到秒级恢复(恢复到某一时间点上)。

 

 4.可对几乎所有数据库实体作恢复。

 

 5.恢复是快速的,在大多数情况下在数据库仍工作时恢复。

 

 热备份的不足是:

 

 1.不能出错,否则后果严重。

 

 2.若热备份不成功,所得结果不可用于时间点的恢复。

 

 3.因难于维护,所以要特别仔细小心,不允许“以失败而告终”。 

 

 

 

 

 

自动备份Oracle数据库

 

  我们计划让数据库在晚上23点做export导出备份,在凌晨2点将备份文件拷贝到磁带上,在凌晨4点将备份文件拷贝到另一台UNIX机器上,为此我们可进行如下操作:

 

  一、导出数据库

 

  export命令将数据库中的数据备份成一个二进制文件,它通常有三种模式:用户模式、表模式和整个数据库模式。本文拟采用用户模式,备份之前,应先建立一个备份目录,以容纳备份文件,比如可建一个/backup目录。接着我们可在UNIXOracle目录下(也可以是其它目录)分别建立两个文件orabackuptarbackup。需要说明的是,前一个文件需要对Oracle的参数进行初始化,为了方便起见,我们不妨将初始化命令放到一个文件中(文件名姑且定为oraenv),再由第一个文件调用它。

 

  1. oraenv文件对Oracle的参数进行初始化,其内容如下:

  ORACLEHOME=ORACLEHOME;export ORACLEHOME

  ORACLESID=zxin;export ORACLESID

  ORACLETERM=sun;export ORACLETERM

  LDLIBRARYPATH=ORACLEHOME/lib;export LDLIBRARYPATH

  ORANLS32=ORACLEHOME/ocommon/nls/admin/data;export ORANLS

  PATH=.:/usr/ccs/bin:/usr/ucb:ORACLEHOME/bin:PATH;export PATH

  DISPLAY=host1:0;export DISPLAY

  NLSLANG=americanamerica.zhs16cgb231280;export NLSLANG

 

  2. orabackup文件对数据库做export导出,导出的文件名可以任意定,本文定为字母“xx加当天日期,即假如当天日期是1210号,则导出的文件名为“xx1210.dmp,以区别于其它日期的备份文件。

 

  orabackup文件内容:

  ./oracle/oraenv        #初始化Oracle数据库

  rq=date +″%md″ ′  #把当天日期赋予变量rq

  rm /backup/                # 清空 /backup目录

  exp test/test file=/backup/xxrq.dmp log=/backup/xxrq.log

 

  本命令用于在$提示符下,导出test用户的数据(其口令亦为test),导出文件及日志均放在/backup目录下。

 

  二、磁带备份

 

  tarbackup文件将用export命令导出的数据文件拷贝到磁带上。

 

  tarbackup文件内容:

  tar rvf /dev/rmt/0n/backup/?

  本命令可将/backup目录下当天产生的文件备份到磁带上。本文件中,tar命令使用了三个参数,其中r选项表示向磁带上拷入文件而不破坏磁带原来内容,v选项表示在拷贝过程中显示文件信息,f选项后面加上磁带设备名,指定文件向何处拷贝,n选项表示磁带机不倒带。/dev/rmt/0表示UNIX主机第一个磁带驱动器,同理,/dev/rmt/1则表示UNIX主机第二个磁带驱动器,依此类推。

 

  oraenvorabackuptarbackup文件编写完成后,分别使用下述命令:

 

  chmod 755 oraenv

  chmod 755 orabackup

  chmod 755 tarbackup

 

  这样,三个文件就都变成了可执行文件。

 

  三、异地备份

 

  我们知道,通常可用FTP命令在两台主机间传输数据,但一般是通过交互方式实现的,即需要手工输入目标主机的IP地址、用户名、口令等。显然,这不符合自动备份的要求。所幸的是,我们可以通过编写一个.netrc的文件来达到目标。这一文件必须命名为.netrc,且必须存放在启动FTP命令的机器上的用户注册目录中,该文件的权限应禁止组内或其它用户进行读访问。这样,当用户使用FTP命令的时候,系统将会在该用户的注册目录中寻找.netrc文件,如果能够寻找到,将会首先执行该文件,否则,会交互式地提示用户输入用户名、口令等。

 

  在使用FTP命令之前,应先在另一台作备份用的UNIX机器上建一目录,以容纳备份文件,本文建的目录是/pub 。需要指出的是,为了加快备份速度,两台主机之间的传输速率应尽可能的高,最好位于同一局域网上。

 

  .netrc文件内容如下:

 

  machine host2      # host2为作备份用的主机名

  login oracle       #oracle为备份主机上的一个用户

   password oracle    #oracle用户的口令为oracle

  macdef init     #定义一个名为init的宏,它将在自动注册进程的最后被执行

  bin        #文件的传输方式设为二进制

  lcd /backup  # 进入本地工作目录/backup

  cd /pub     #进入备份主机目录/pub

  mput ?    # 将/backup目录下的所有文件传输至备份主机

  bye     #退出FTP会话进程

 

  .netrc文件编写完成后,使用下述命令:

 

  chmod 600 .netrc

 

  这样,.netrc文件就只能被该用户所访问。

 

  四、启动备份进程

 

  Cron是一个永久进程,它由/etc/rc.local启动执行。Cron检查/var/spool/cron/crontabs/?目录中的文件,找到所要执行的任务和执行任务的时间。

 

  Crontab文件的每一行由六个域(minuteshoursday of monthmonthday of week command)组成,域之间用空格或Tab分开,其中:

   minutes:分钟域,值的范围是059

   hours:小时域,值的范围是023

   day of month:日期,值的范围是131

   month:月份,值的范围是112

   day of week:星期,值的范围是06,星期日值为0

    command:所要运行的命令

 

  如果一个域是?,表明命令可以在该域所有可能的取值范围内执行。

  如果一个域是由连字符隔开的两个数字,表明命令可以在两个数字之间的范围内执行(包括两个数字本身)。

  如果一个域是由逗号隔开的一系列值组成的,表明命令可以在这些值组成的范围内执行。

  如果日期域和星期域都有值,则这两个域都有效。

 

  现在,我们编写一个文件,用以启动自动备份进程。值得注意的是,该文件只能在Oracle用户名下用crontab e 命令来编辑,否则将不会被定时执行,文件名定为Oracle,文件将放在/var/spool/cron/crontabs 目录下。编辑完成后,可以在Oracle的$提示符下,用crontab l命令来查看。

 

  Oracle文件内容:

 

  0 23 ? ? ? /oracle/orabackup   #每天23点对数据库执行备份

  0 2 ?? ? /oracle/tarbackup   #每天2点将文件备份到磁带上

  0 4 ?? ? ftp i host2         # 每天4点将文件备份到另一台主机上

 

  经过以上的操作后,系统每天晚上将自动产生一个备份,并且自动将备份文件分别拷贝到磁带上和另一台主机上。系统管理员需要做的是,隔几天换一盘磁带(更换磁带的周期取决于备份文件的大小和磁带的容量)和清理备份目录。这样,他们就可以从备份数据的繁琐中解脱出来,去做其它更有意义的工作。而数据库既实现了磁带备份,又实现了异地备份,相应的安全性也大大提高了。  

 

阅读(532) | 评论(0) | 转发(0) |
0

上一篇:SQL,PL/SQL编程规范

下一篇:DDL,DML,DCL区别

给主人留下些什么吧!~~