半夏微凉

半夏微凉

十五、ORACLE备份与恢复

一、数据库恢复和备份。

1、数据库备份分物理备份和逻辑备份。

物理备份:主要分归档模式备份和非归档模式备份。

    归档模式:数据库设置成归档模式对数据库进行的备份。

   非归档模式:数据库设置成非归档模式对数据库进行的备份。

逻辑备份:主要是指数据的导出导入操作。(imp/exp 和impdp/expdp).

(1).归档模式 

oracle数据库有联机重做日志,这个日志是记录对数据库所做的修改,比如插入,删除,更新数据等,对这些操作都会记录在联机重做日志里。一般数据库至少要有2个联机重做日志组。当一个联机重做日志组被写满的时候,就会发生日志切换,这时联机重做日志组2成为当前使用的日志,当联机重做日志组2写满的时候,又会发生日志切换,去写联机重做日志组1,就这样反复进行。

  如果数据库处于非归档模式,联机日志在切换时就会丢弃. 而在归档模式下,当发生日志切换的时候,被切换的日志会进行归档。比如,当前在使用联机重做日志1,当1写满的时候,发生日志切换,开始写联机重做日志2,这时联机重做日志1的内容会被拷贝到另外一个指定的目录下。这个目录叫做归档目录,拷贝的文件叫归档重做日志。

  数据库使用归档方式运行时才可以进行灾难性恢复。

  归档日志模式和非归档日志模式的区别

非归档模式只能做冷备份,并且恢复时只能做完全备份.最近一次完全备份到系统出错期间的数据不能恢复.

归档模式可以做热备份,并且可以做增量备份,可以做部分恢复.

用ARCHIVE LOG LIST 可以查看期模式状态时归档模式还是非归档模式.

(2).非归档模式

相反非归档就是不保存旧事务日志

2、数据库恢复分完全恢复和不完全恢复。

完全恢复:恢复到数据库失败时的数据库状态。

数据库恢复也分物理恢复和逻辑恢复。

物理恢复:从数据库中备份的文件重新复制到原来的数据库中;

逻辑恢复:从数据库中导出的数据再导入原来的数据库。

二、物理备份和恢复数据库。

1.对数据库进行脱机备份。

脱机备份又称冷备份,shutdown数据库的服务后复制需要的文件,包括把数据文件和控制文件等相关的内容复制到其他的磁盘路径上。如果数据库出现问题,再把文件复制回来,实现数据库恢复。

数据库数据文件:select name from v$datafile;

数据库控制文件:select name from v$controlfile;

2.对数据库进行联机备份。

联机备份又称热备份。是在数据库归档模式下进行的备份。

(1)查看数据库中日志:archive log list

十五、ORACLE备份与恢复 数据库 第1张

(2)切换日志模式为归档模式且自动存档为启用状态命令如下:

修改日志为归档模式:alter system set log_archive_start=true scope=spfile;

关闭数据库:shutdown immediate;

启动mount实例但不启动数据库:startup mount;

更改数据库为归档日志模式:alter database archivelog;

十五、ORACLE备份与恢复 数据库 第2张

十五、ORACLE备份与恢复 数据库 第3张

把数据库设置成归档模式后就可以进行数据库的备份和恢复操作了。

(3)举例备份表空间DCDB.

改变数据库的状态为open:alter database open;

开始备份表空间DCDB:alter tablespace DCDB begin backup;(把oradata里面的DCDB.dbf文件复制到其他磁盘或备份路径)

结束表空间DCDB的备份:alter tablespace DCDB end backup;

十五、ORACLE备份与恢复 数据库 第4张

(4)举例恢复表空间中的数据文件

对当前日志进行归档:alter system archive log current;

切换日志文件:alter system switch logfile;

关闭数据库命令:shutdown immediate;       -----shutdonwn abort

删除数据文件并重新启动数据库:startup;

将数据文件设置成脱机状态并删除:alter database datafile 8 offline drop;

把数据库的状态设置成open:alter database open;

恢复数据文件:recover datafile 8;(auto)

设置数据文件为联机状态:alter database datafile 8 online;

三、逻辑备份和恢复数据库。

1、exp导出方法。

导出表:exp username/password@实例名 file='C:\data.dmp' tables=table_name

导出表空间:exp username/password@实例名 file='C:\data.dmp' tablespaces=tablespace_name

2、expdp导出方法。

创建目录对象:create directory directory_name as 'file_name'  

给使用目录的用户赋权限:grant read,write on directory directory_name to user_name;

expdp user_name/password directory=directory_name dumpfile=temp.dmp logfile=log.dmp tables=table_name;

查看已经创建的directory项:SELECT * FROM DBA_DIRECTORIES;

3、逻辑导入数据

imp导入方式:imp user_name/password file=backupfile.dmp tables=table_name

impdp导入方式:imp user_name/password directory=directory_name dumpfile=temp.dmp tables=table_nam


SQL>drop user lentim cascade;

SQL>CREATE USER lentim IDENTIFIED BY 123456 DEFAULT TABLESPACE LENTIM;

grant connect,resource to lentim;

grant unlimited tablespace to lentim;

grant create database link to lentim;

grant select any sequence,create materialized view to lentim; 

grant dba to lentim;


几点报错说明:

问题1:

ORA-39002: 操作无效

ORA-39070: 无法打开日志文件。

ORA-29283: 文件操作无效

ORA-06512: 在 "SYS.UTL_FILE", line 536

ORA-29283: 文件操作无效

注意导出语句的路径必需是导出源主机的路径,且真实存在。


问题2:

ORA-31631: 需要权限

ORA-39109: 未授权用户不能对其他用户的方案进行操作

grant dba权限给目标用户。


问题3:

ORA-39001: 参数值无效

ORA-39000: 转储文件说明错误

ORA-31640: 无法打开要读取的转储文件 "/home/oracle/lentim1030.dmp;"

ORA-27037: 无法获得文件状态

linux-x86_64 Error: 2: No such file or directory

Additional information: 3

重点检查导入文件dmp文件名称大小写是否与linux里面的一致。

一 用impdp必须在服务端,不能在客户端

二 创建的目录必须是是有效的,并且要导入的dmp文件必须放在其中

三 要导入的dmp文件必须是expdp导出才行

四 服务器中的orale至少是10g,低的版本不支持数据泵


附简要备份过程文档(适合了解备份概念后的读者):

//逻辑备份恢复

export NLS_LANG="Simplified Chinese_china".ZHS16GBK

●oracle10G

exp lentim/123456@192.168.32.6:1521/orcl file=/home/oracle/lentim_backup.dmp log=/home/oracle/lentim.log owner=lentim

imp cp_dcdb/cp_dcdb@DCDB_TEST file=e:\dcdb.dmp fromuser=cp_dcdb touser=cp_dcdb


●oracle11G

expdp导出步骤:

sqlplus sys/123456@orcl as sysdba;

SQL>create directory dir as '/home/oracle'

SQL>grant read,write on directory dir to lentim;

expdp system/123456@orcl directory=dir dumpfile=lentim.dmp logfile=lentim_expdp.log schemas=lentim

expdp system/123456@orcl directory=dir dumpfile=lentim.dmp logfile=lentim_expdp.log full=y parallel=10

impdp导入步骤:

impdp system/123456@mac_linux directory=dir dumpfile=SYSTEM.DMP logfile=impdp.log

impdp system/123456@mac_linux directory=dir dumpfile=lentim.dmp logfile=impdp.log remap_schema=lentim:yemo

impdp \'/ as sysdba\' directory=dir full=y dumpfile=lentim.dmp logfile=impdp.log parallel=10  table_exists_action=replace


//物理备份恢复

●开启归档:

shutdown immediate;

start mount

alter database archivelog;

alter database open;

archive log list;


●禁用归档:

SQL> shutdown immediate;

SQL> startup mount; #重启数据库到mount模式

SQL> alter database noarchivelog; #修改为非归档模式

SQL> alter database open; #打数据文件

SQL> archive log list; #再次查看前归档模式

##SQL> alter system set log_archive_start=false scope=spfile; #禁用自归档  ##11G此参数无效,无需设置


●脱机备份(冷备份)

select name from v$datafile;    ##数据库数据文件

select name from v$controlfile; ##数据库控制文件


●联机备份恢复(热备份)

示例备份表空间

需要先开启数据库归档模式

SQL>alter tablespace LENTIM begin backup;

把oradata里面的DCDB.dbf文件复制到其他磁盘或备份路径

SQL>alter tablespace LENTIM end backup;


●示例恢复表空间

SQL>alter system archive log current;     ##对当前日志进行归档

SQL>alter system switch logfile;          ##切换日志文件(一般切换三次)

SQL>shutdown immediate;                   ##关闭数据库命令

SQL>startup;                              ##删除数据文件并重新启动数据库

SQL>alter database datafile 8 offline     ##将数据文件设置成脱机状态并恢复备份到原来路径

SQL>alter database open;                  ##把数据库的状态设置成open

SQL>recover datafile 8;(auto)             ##恢复数据文件

SQL>alter database datafile 8 online;     ##设置数据文件为联机状态

评论回复


·