8.1 数据库备份与恢复概述
硬件、数据文件、操作系统都可能损坏或崩溃,程序员或数据维护人员也不可能永远不犯错误。因此,数据库的备份与恢复就显得格外重要。
备份,就是把数据库复制到转储设备的过程。恢复,就是当发生故障后,利用已备份的文件,重新建立一个完整的数据库。根据出现故障的原因,恢复分为实例恢复和介质恢复两种类型。
实例恢复:当Oracle实例出现意外后(如意外掉电,后台进程故障等),Oracle自动进行的恢复。
介质恢复:当存放数据库的介质出现故障时所做的恢复。例如,当一个文件、一个文件的一部分或一个磁盘不能读或不能写时,所进行的恢复操作。
DBA的主要职责之一,就是备份数据库和在数据库发生故障时高效、安全地恢复数据库。
备份的方法有逻辑备份、物理备份(冷备份、热备份)等多种方式;恢复的方法也有完全恢复、不完全恢复和RMAN恢复等。
8.1.1 逻辑备份
逻辑备份是指将数据库中的用户对象导出到一个二进制文件中,需要使用导入/导出工具IMPDP/EXPDP或IMP/EXP。由于逻辑备份具有平台无关性,因此逻辑备份常作为数据迁移的主要手段。
本节以IMP/EXP工具为例,讲解导入及导出的具体方法。首先强调,IMP或EXP工具是直接在CMD中通过同名的IMP或EXP命令调用的,不需要登录数据库。
- 导出工具EXP
使用EXP执行导出操作有以下三种方式。
(1)表方式。导出指定的表,语法如下:
EXP 数据库用户名/密码@IP地址/实例名 file:/文件名.dmp log=/日志文件名.log
tables=表名1,表名2,…,表名n
例如,若需要导出scott用户的emp和dept表,就可以执行以下命令:
EXP scott/tiger@127.0.0.1/orcl file:/back/bk.dmp log=d:/back/logfile.log tables=emp,dept
这样就可以将本机中scott用户的emp表和dept表中的数据保存在f:/back/bk.dmp文件中,并且将日志内容保存在同目录中的logfile.log文件里。
(2)用户方式。导出指定用户的所有对象和数据,语法如下:
EXP 数据库用户名/密码@IP地址/实例名 file:/文件名.dmp log=/日志文件名.log
(3)全库方式。导出数据库中的所有对象和数据,此操作需要使用DBA的角色执行,语法如下:
EXP 管理员用户名/密码@IP地址/实例名 file:/文件名.dmp log=/日志文件名.log full=y
- 导入工具IMP
执行了导出操作以后,就可以使用IMP工具执行导入操作。与导出操作相对应,导入操作也有以下三种方式。
(1)表方式。导入指定的表,语法如下:
IMP 数据库用户名A/密码@IP地址/实例名 file:/文件名.dmp log=/日志文件名.log
tables=表名1,表名2,…,表名n fromuser=数据库用户名B touser=数据库用户名A
commit=y ignore=y
以上命令,就可以将用户B中用tables指定的表导入用户A中。
(2)用户方式。导入指定用户的所有对象和数据,语法如下:
IMP 数据库用户名A/密码@IP地址/实例名 file:/文件名.dmp log=/日志文件名.log
fromuser=数据库用户名B touser=数据库用户名A commit=y ignore=y
(3)全库方式。导入数据库中的所有对象和数据,此操作需要使用DBA的角色执行,语法如下:
IMP 数据库用户名A/密码@IP地址/实例名 file:/文件名.dmp log=/日志文件名.log
full=y ignore=y destroy=y
其中destroy=y表示的是,如果在导入时发现已经存在的数据,则将其删除后重新导入。
另一种导入/导出方式IMPDP/EXPDP,是从Oracle10g起引入的新方式,称为数据泵(Data Pump)。简单地讲,IMPDP/EXPDP采用了并行地进行导入/导出的方式,比IMP/EXP速度更快。
8.1.2 冷备份及恢复
我们已经知道,物理备份可以分为冷备份和热备份。冷备份又称脱机备份,是指在关闭数据库后进行的备份;而热备份也称为联机备份,是在数据库运行的同时进行备份,但热备份存在着难以维护等风险。实际应用中,为了确保备份的可靠性,大多采用冷备份。
冷备份实质就是数据库相关文件的复制:在数据库关闭之后,将所有的关键性文件(数据文件、控制文件、联机文件等)复制到另外的位置。因此,冷备份最重要的一点,就是要知道这些文件的存放位置,而这些位置是可以通过超级管理员SYS账户进行查询的。
冷备份的具体步骤如下。
- 使用SYS登录数据库
SQLPLUS sys/change_on_install AS SYSDBA
- 查询所有控制文件的位置
SELECT * FROM v$controlfile;
- 查询所有日志文件的位置
SELECT * FROM v$logfile;
- 查询所有数据文件的位置
SELECT * FROM v$datafile;
- 查询pfile文件的位置
SHOW PARAMETER pfile;
- 记录以上所有文件的位置,之后关闭数据库实例
SHUTDOWN immediate
根据记录的位置,将以上所有文件复制到备份目录中
重新启动数据库实例
STARTUP
冷备份完成以后,如果要进行恢复操作,只需要先关闭数据库实例,然后将之前备份的文件再复制回原目录中,最后重启数据库实例。
8.1.3 RMAN
RMAN(Recovery Manager,恢复管理器)是一种用于备份和恢复数据的Oracle工具。
RMAN能够备份整个数据库或某些数据库部件(如表空间、数据文件、控制文件、归档文件、Spfile参数文件等)。RMAN也允许进行增量数据块级别的备份,但增量RMAN备份是时间和空间有效的,因为它们只备份自上次备份以来有变化的那些数据块。而且,通过RMAN提供的接口,可以很好地与第三方的备份与恢复软件(如VERITAS等)对接,从而提供更强大的备份与恢复功能。此外,RMAN还提供了其他更多功能,如数据库的克隆等。
使用RMAN有Nocatalog和Catalog两种备份及恢复方式。
Nocatalog方式:用控制文件作为catalog秦桂岭1(目录),每一次备份都要往控制文件里面写很多备份信息,因此控制文件里面会有越来越多的备份信息。
Catalog方式:首先要创建备份目录并建立恢复目录,即将数据库的备份信息写到恢复目录里面。
本节以Nocatalog方式为例,介绍使用RMAN进行备份与恢复的基本步骤。
- 使用Nocatalog方式备份数据
(1)查看是否开启归档模式
以SYSDBA角色登录,并执行以下命令:
ARCHIVELOG LIST ;
如果发现数据库处于非归档模式,则需要通过以下步骤改为归档模式。
① 关闭数据库(确保仍然处于SYSDBA角色)
SHUTDOWN immediate;
② 将数据库启动到MOUNT模式
START mount;
③ 调整数据库的归档模式
ALTER DATABASE archivelog;
④ 打开数据库
ALTER DATABASE OPEN;
⑤ 确认数据库已处于归档模式
ARCHIVELOG LIST ;
(2)设置备份时间
通过参数control_file_record_keep_time设置备份信息的保存时间(单位:天),超时后就自动清除掉以前的备份信息:
ALTER SYSTEM SET control_file_record_keep_time = 天数 SCOPE=BOTH ;
可以通过以下语句查看是否设置成功:
SHOW PARAMETER CONTROL ;
- 使用Nocatalog方式恢复数据
(1)建立Oracle运行环境(包括init或sp文件)
(2)将备份的控制文件复制到init文件指定的位置
(3)进入MOUNT模式
(4)使用RMAN,恢复datafile文件
(5)通过以下语句,打开resetlogs文件:
ALTER DATABASE OPEN resetlogs;
实际工作中,会有专业的人员来操作RMAN,开发人员简单了解即可。