分类: 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文件
4.Init.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)临时停止归档进程
(2)log下那些在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目录。接着我们可在UNIX的Oracle目录下(也可以是其它目录)分别建立两个文件ora—backup,tar—backup。需要说明的是,前一个文件需要对Oracle的参数进行初始化,为了方便起见,我们不妨将初始化命令放到一个文件中(文件名姑且定为ora—env),再由第一个文件调用它。
1. ora—env文件对Oracle的参数进行初始化,其内容如下:
ORACLE—HOME=$ORACLE—HOME;export ORACLE—HOME
ORACLE—SID=zxin;export ORACLE—SID
ORACLE—TERM=sun;export ORACLE—TERM
LD—LIBRARY—PATH=$ORACLE—HOME/lib;export LD—LIBRARY—PATH
ORA—NLS32=$ORACLE—HOME/ocommon/nls/admin/data;export ORA—NLS
PATH=.:/usr/ccs/bin:/usr/ucb:$ORACLE—HOME/bin:$PATH;export PATH
DISPLAY=host1:0;export DISPLAY
NLS—LANG=american—america.zhs16cgb231280;export NLS—LANG
2. ora—backup文件对数据库做export导出,导出的文件名可以任意定,本文定为字母“xx”加当天日期,即假如当天日期是12月10号,则导出的文件名为“xx1210.dmp”,以区别于其它日期的备份文件。
ora—backup文件内容:
./oracle/ora—env #初始化Oracle数据库
rq=′date +″%m%d″ ′ #把当天日期赋予变量rq
rm /backup/ # 清空 /backup目录
exp test/test file=/backup/xx$rq.dmp log=/backup/xx$rq.log
本命令用于在$提示符下,导出test用户的数据(其口令亦为test),导出文件及日志均放在/backup目录下。
二、磁带备份
tar—backup文件将用export命令导出的数据文件拷贝到磁带上。
tar—backup文件内容:
tar rvf /dev/rmt/0n/backup/?
本命令可将/backup目录下当天产生的文件备份到磁带上。本文件中,tar命令使用了三个参数,其中r选项表示向磁带上拷入文件而不破坏磁带原来内容,v选项表示在拷贝过程中显示文件信息,f选项后面加上磁带设备名,指定文件向何处拷贝,n选项表示磁带机不倒带。/dev/rmt/0表示UNIX主机第一个磁带驱动器,同理,/dev/rmt/1则表示UNIX主机第二个磁带驱动器,依此类推。
ora—env、ora—backup、tar—backup文件编写完成后,分别使用下述命令:
chmod 755 ora—env
chmod 755 ora—backup
chmod 755 tar—backup
这样,三个文件就都变成了可执行文件。
三、异地备份
我们知道,通常可用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文件的每一行由六个域(minutes、hours、day of month、month、day of week、 command)组成,域之间用空格或Tab分开,其中:
minutes:分钟域,值的范围是0到59
hours:小时域,值的范围是0到23
day of month:日期,值的范围是1到31
month:月份,值的范围是1到12
day of week:星期,值的范围是0到6,星期日值为0
command:所要运行的命令
如果一个域是?,表明命令可以在该域所有可能的取值范围内执行。
如果一个域是由连字符隔开的两个数字,表明命令可以在两个数字之间的范围内执行(包括两个数字本身)。
如果一个域是由逗号隔开的一系列值组成的,表明命令可以在这些值组成的范围内执行。
如果日期域和星期域都有值,则这两个域都有效。
现在,我们编写一个文件,用以启动自动备份进程。值得注意的是,该文件只能在Oracle用户名下用crontab -e 命令来编辑,否则将不会被定时执行,文件名定为Oracle,文件将放在/var/spool/cron/crontabs 目录下。编辑完成后,可以在Oracle的$提示符下,用crontab -l命令来查看。
Oracle文件内容:
0 23 ? ? ? /oracle/ora—backup #每天23点对数据库执行备份
0 2 ?? ? /oracle/tar—backup #每天2点将文件备份到磁带上
0 4 ?? ? ftp -i host2 # 每天4点将文件备份到另一台主机上
经过以上的操作后,系统每天晚上将自动产生一个备份,并且自动将备份文件分别拷贝到磁带上和另一台主机上。系统管理员需要做的是,隔几天换一盘磁带(更换磁带的周期取决于备份文件的大小和磁带的容量)和清理备份目录。这样,他们就可以从备份数据的繁琐中解脱出来,去做其它更有意义的工作。而数据库既实现了磁带备份,又实现了异地备份,相应的安全性也大大提高了。