您的位置:首页 > 数据库 > Oracle

Oracle数据库备份及恢复

2017-01-17 15:22 232 查看
引言

本章节内容讲述的是在日常工作中经常使用的对数据进行的备份与恢复操作。分为数据泵方式和传统的导入导出两部分进行讲解。在Oracle 10g之前,传统的导出和导入分别使用EXP工具和IMP工具,从10g开始,不仅保留了原有的EXP和IMP工具,还提供了数据泵导出导入工具EXPDP和IMPDP。
下面,先对这两种方式进行一下简单的说明:
(1) EXP和IMP是客户端工具程序,他们既可以在客户端使用,也可以在服务端使用。
(2) EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能再客户端使用。
(3) IMP只适用于EXP导出文件,不适用与EXPDP导出文件;IMPDP只适用于EXPDP导出的文件,而不适用于EXP导出文件。

1. 准备工作

    
在数据库导入导出的过程中,可能因为两个数据库字符集不一致而导致恢复数据库的时候,恢复的数据变成乱码,所以在进行数据库恢复的时候,我们要保证恢复库的字符集与备份库的字符集是一致的。同时还要将备份库所在oracle用户的环境变量NLS_LANG设置为数据库的字符集
(1) 检查备份库的字符集:
切换至oracle用户:su – oracle
           登录sqlplus: sqlplus / as sysdba
           查询数据库字符集:
select * from nls_database_parameters where parameter='NLS_CHARACTERSET';



图1.1
(1) 查看备份库所在服务器的NLS_LANG
echo $NLS_LANG
 


图1.2

如果未设置,我们可以在导出数据之前手动设置环境变量,值为图1.1查询出来的值

export NLS_LANG= AMERICAN_AMERICA.AL32UTF8
但是我们更推荐将上面的命令,放到oracle用户的.bash_profile中来设置用户的环境变量信息,这样每次用户登录的时候,都会加载NLS_LANG环境变量,见下图1.3



(1) 检查要恢复的数据库的字符集设置

查看与上面(1)中的步骤相同,如果字符集设置与备份库的字符集设置相同,可以进行数据库的恢复操作,否则需要先更改数据库的字符集。

更改数据库的字符集,我们可以删除实例,然后重新创建实例,指定相应的字符集。

用oracle用户登录系统,然后输入dbca调用图形界面,来进行实例的删除和创建,此处不再赘述,请参考与文档同级目录下的《linux系统下安装oracle教程.docx》

1. 数据泵方式

数据泵导出包括导出表,导出方案,导出表空间以及下面要讲的导出数据库4中方式。

下面都是在linux服务器(Red Hat Enterprise Linux Server release 6.5)上执行。

1.1 EXPDP导出数据库

(1) 查看一下数据库directory

SELECT * FROM dba_directories;



(1) 在服务器上创建’/home/oracle/backUpDB’目录

上面第二步中,我们只是在数据库中保存了这样一个目录;而且在通过IMPDP导出数据库的时候,oracle也不会自动创建这样一个目录;我们必须手动去创建这个目录,而且要注意权限的问题。

使用root用户登录系统,执行:mkdir /home/oracle/backUpDB

并放开权限:chmod 777 /home/oracle/backUpDB

(2) 导出用户sdfae的数据

用oracle用户登陆系统

su - oracle

export ORACLE_SID=tsdb

expdp sdfae/sdfae@tsdb directory=EMPDIR dumpfile=sit201609061438_sdfae.dmp content=ALL



简单说一下上面命令中的几个参数,sdfae/sdfae@tsdb表示用户名/密码@实例名;directory指定目录,后面就是上面我们创建用于存放数据库和日志文件的目录;dumpfile指定数据库备份的文件名;content=ALL导出全部数据。

1.1 IMPDP导入数据库

执行完1.1EXPDP导出数据库中描述的步骤,我们便可以拿到数据库了,下面我们看一下如何将备份好的数据库,恢复到指定服务器中。

(1) 如果指定服务器中以前未恢复过数据库,否则跳至(3)

首先要创建用户sdfaebak(用户名可以随便起) 

sqlplus / as sysdba用系统管理员登录

create user sdfaebak identified by sdfaebak;

给用户授权 dba

grant dba,connect,resource to sdfaebak;

(2) 如果已经恢复过数据库,比如已经有了sdfaebak用户,打算恢复到sdfaebak上面

首先删除用户:

drop user sdfaebak CASCADE;

重新创建用户sdfaebak:

create user sdfaebak identified by sdfaebak;

删除业务数据用到的表空间(我们手动创建的表空间)

drop tablespace TS_DATA including contents and datafiles;

(3) 创建表空间

通常我们会为我们自己设计开发的数据库表设置自己的表空间,在数据库导入的时候如果相应表空间在恢复库上不存在,那么会出现下图所示的异常错误:ORA-00959:表空间’EMR_EMPTY’不存在



如果能拿到创建表空间的脚本,拿到脚本在恢复库上执行,否则,按照下面操作执行:

a) 查询表空间名称

SELECT t.tablespace_name, round(SUM(bytes / (1024 * 1024)), 0) ts_size

        FROM dba_tablespaces t, dba_data_files d

        WHERE t.tablespace_name = d.tablespace_name

        GROUP BY t.tablespace_name;

b) 查询表空间创建语句

此时,对于系统创建的表空间比如SYSAUX、USERS、SYSTEM表空间就没有必要查找表空间创建语句了。
执行语句:
select dbms_metadata.get_ddl('TABLESPACE','TS_DAT') from dual;

其中TS_DAT是上面查询出来的表空间的名称。
c) 在恢复库上执行创建语句

执行创建表空间语句的时候,需要注意,我们可能会需要修改一下表空间数据存储的路径,因为服务器不同,可能没有相应的目录。

(1) 重复1.1中讲述的(1)到(4)步,创建好目录。

(2) 如果已经恢复过数据库(或者本省存在了数据库),那么省略上面的(1)到(3)步

(3) 将1.1导出的数据库,放到empdir 对应的目录中

(4) 数据库恢复

执行:

impdp sdfae/sdfae@orcl directory=EMPDIR dumpfile= sit201609061438_sdfae.dmp REMAP_SCHEMA=sdfae:sdfaebak

其中REMAP_SCHEMA=sdfae:sdfaebak,将原方案sdfae的所有对象装载到目标方案sdfaebak中;可以简单理解为这个地方写的就是用户名,一般一个用户对应一个schema,而且该用户的schema名等于用户名,一般不会去修改。

1. 传统EMP/IMP方式

1.1 EXP导出数据库

(1) 处理空表

在ORACLE 11G中,表无数据时,不分配segment,以节省空间 。这样就导致采用EXP命令时,空表不会导出创建表结构的sql语句,所以我们要提前对空表进行处理。

I. 首先查询一下当前用户下的所有空表

select table_name from user_tables where NUM_ROWS=0;

II. 生成alter 语句

select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0

III. 执行第II步生成的alter 语句

(2) 执行下面的导出命令

exp sdfae/sdfae_@tsdb file=/home/oracle/backUpDB/sit_201611231655_sdfae.dmp owner=sdfae

 

小结:因为在整个项目开发过程中,都有可能向数据库中添加表,那么每次进行数据库数据导出的时候,每次都要执行上面的第(1)步的操作,很麻烦,
我们有两种处理方法,第一种,就是在创建表的时候,手动向刚创建的表中插入一条数据,然后删除,这样就会未该表分配segment,即便是空表也可以导出表结构,但是难以保证开发人员都清楚这样的操作;第二种,设置deferred_segment_creation
参数,查看该参数: SQL> show parameter deferred_segment_creation,默认是true,下面改为false, 执行 SQL>
alter system set deferred_segment_creation=false; 这样在创建表的时候,就会分配segment,此时仍要知道一点,把deferred_segment_creation设置为false之后,只对后续创建的空表起作用,对以前导出的空表不产生作用,仍然需要手动处理,见上面的(1)处理空表的步骤。
 

 

1.2 IMP导入数据库

(1) 首次导入数据库,否则跳到第(2)步

创建用户

create user sdfae identified by "sdfae"; ------授权:grant connect to sdfae;grant dba to sdfae;grant resource to sdfae;

执行第(3)(4)步操作

(2) 已经存在用户

drop user sdfae CASCADE;

重新创建用户

create user sdfae identified by "sdfae"; ------授权:grant connect to sdfae;grant dba to sdfae;grant resource to sdfae;

删除表空间:

drop tablespace TS_DATA including contents and datafiles;

执行第(3)(4)步操作

(3) 创建表空间

按照1.2IMPDP导入数据库中的(3)创建表空间的操作

(4) 执行imp导入操作

imp sdfae/sdfae@orcl file=F:\sit_201611231655_sdfae.dmp ignore=y fromuser=sdfae touser=sdfae
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: