在讲备份与恢复的操作之前,请了解ckpt,checkpoint,scn概念,以及oracle体系架构。
checkpoints检查点用于决定数据是从何处开始恢复(recovery)
检查点队列:脏数据的链接表
物理备份
1.冷备
archive 模式和noarchive模式都可以,但是archive模式下一般都是进行热备,冷备显得没有意义,冷备实际上就是要在数据库关闭的情况下,备份物理系统上的文件。
用户名、库名和实例名也是不可缺少的,可以使用下列命令进行查看:
SYS>show user
SYS>select name from v$database;
SYS>select instance_name from v$instance;
要备份的文件有data file,control file,redo log file,password file,pfile(参数文件)。另外还要记得备份临时表空间的文件tempfile,防止恢复时需要排序,却找不到此文件。
这些文件路径可以执行以下命令一一查看:
SYS>select name from v$datafile;
SYS>select name from v$controlfile;
SYS>select member from v$logfile;
SYS>select name from v$tempfile;
password file 路径 在$ORACLE_HOME/dbs/orapw$ORACLE_SID //跟备份关系不大,可以随时生成。
spfile路径可通过SYS>SELECT VALUE FROM V$PARAMETER WHERE NAME='spfile'; 查询,但是其为二进制文件。
我们可以通过 SYS>create pfile from spfile; 来得到文本的拷贝文件
我们可以以脚本形式拷贝,写一个脚本叫bak_original.sql, 通过sys>@script_path/bak_original.sql 将要备份的文件备份至/u02目录下
内容如下,
ho mkdir -p /u02/orcl
spool /u02/bakorcl.sql
select 'ho cp '||name||' /u02/orcl/' from v$controlfile
union all
select 'ho cp '||name||' /u02/orcl/' from v$datafile
union all
select 'ho cp '||member||' /u02/orcl/' from v$logfile
union all
select 'ho cp '||name||' /u02/orcl/' from v$tempfile;
spool off
shutdown immediate
create pfile='/u02/orcl/initorcl.pfile' from spfile;
ho cp $ORACLE_HOME/dbs/orapw$ORACLE_SID /u02/orcl/
ho sed -n '/^ho cp/p' /u02/bakorcl.sql > /u02/bak.sql
start /u02/bak.sql
startup
/
在有冷备文件的情况下,如何restore数据
1.1 丢失数据文件
1.1.1 system 文件丢失
system tablespace出现问题后,则先全备数据库(其他一些表空间是有的,但是因为system tablespace坏了,我们不能查询出来,
但是可以通过第三方软件,将其他表空间信息读取恢复出来);然后使用最近的冷备还原到目的路径;再启动数据库--完成恢复到
冷备时刻 -- 冷备后变化的数据只有在archive mode 下才能恢复到损坏的时刻。由于我们是no archive,所以只能恢复到最近冷备时刻。
a)全备数据库
b)冷备还原(确保没有再做resetlog,重置control file)
ho cp system01.dbf /u01/oracle/oradata/orcl/
alter database open;
recover database; //如果恢复得了,表明你的日志文件中是有记录的。
alter database open;
create table scott.ee as select * from scott.emp;
alter system switch logfile; //多切几次日志
ho rm /u01/../system01.dbf //让日志文件变动大一点来演示recover database失败的状况
c)忽略一致性验证打开数据库
recover database; // cancel
alter database open; //需要media recovery
alter system set "_allow_resetlogs_corruption"=true scope=spfile; //忽略一致性验证
startup force
recover database until cancel;
alter database open resetlogs; //instance 中断,重新启动数据库即可
alter system set "_allow_resetlogs_corruption"=false scope=spfile; //重新启动数据库后还原一致性验证
虽然数据库正常启动了,但是数据不能完全恢复,比如scott.ee已经丢失。要想完全恢复,则需要在归档模式下。
d)如还不可以,则把所有的做还原。
1.1.2 sysaux 文件丢失
2种方法
a).数据库启动后,将sysaux数据库文件offline,然后导出数据,再新建数据库,导回数据;
b).冷备数据还原 加隐藏参数来启动数据库(忽略一致性验证)
1.1.3 undo 文件丢失
删除旧的文件,建立新的,这种的就不要用冷备恢复回去了。
1.1.4 自己建立的表空间文件丢失
offline该数据文件,启动数据库,导出其他可用的数据
1.1.5 temp
建立新的
1.2 日志文件丢失
a)全备datafile controlfile spfile|pfile(防止一下子修复不过来)
b)直接通过resetlogs恢复日志文件,千万不要将备份拷贝回去!
alter database open resetlogs; //不完全恢复的时候用
recover database using backup controlfile;
会报arc缺少,忽略
alter database open resetlogs; //需要media recovery,就是一致性验证
alter system set "_allow_resetlogs_corruption"=true scope=spfile; //忽略一致性验证
startup force mount
alter database open resetlogs;
//此时日志全部恢复
alter system set "_allow_resetlogs_corruption"=false scope=spfile; //不要忘记把参数改回来
1.3 控制文件丢失
建立新的控制文件
strings contorl01.ctl | grep dbf //从冷备中的control文件中查询到数据文件个数
sql> ho cp /u02/orcl/control* /u01/oracle/oradata/orcl/ //得到控制文件创建的语句
show parameter control_files
alter database mount;
alter database backup controlfile to trace as '/u02/orcl/ctl.sql'; //得到建立控制文件的脚本
ho rm /u01/oracle/oradata/orcl/control*
shutdown abort
!
vim ctl.sql
@ ctl.sql //执行该脚本
将该脚本中的注释和空格都去除掉即可。此法仅适用于冷备后控制文件无改变。
1.4 参数文件丢失
用冷备恢复即可
1.5 密码文件丢失
用冷备恢复,或者自己建立密码文件(orapwd 命令)
2.热备 ----控制scn不变 拷贝的前后需要冻结头文件,备份完后解冻头文件
热备数据库,热备表空间,热备控制文件。
alter database begin backup;
alter database end backup;
alter tablespace <> begin backup; //临时表空间不需要备份
demo:
alter database archivelog;
archive log list;
alter system switch logfile;
archive log list; //查看sequence是否有变化,没有则不正常
select tablespace_name from dba_data_files; //查看表空间有哪些
select name from v$datafile;
alter database begin backup;
mkdir /u02/hot_oracl
select 'ho cp '||name||' /u02/hot_orcl/' from v$datafile;
将输出的语句执行,即完成拷贝了数据文件。
alter database end backup;
alter database backup controlfile to '/u02/hot_orcl/control01.ctl';
create pfile='/u02/hot_orcl/initorcl.ora' from spfile;
编写成脚本进行热备,如下:
vim /u02/hot_bak.sql
spool /tmp/hot.sql
select 'ho cp '||name||' /u02/hot_orcl/' from v$datafile;
spool off
sed -n '/^ho cp/p' /tmp/hot.sql >/tmp/hotorcl.sql
alter database begin backup;
start /tmp/hotorcl.sql
alter database end backup;
ho rm /tmp/hot*.sql
alter database backup controlfile to '/u02/horcl/control01.ctl';
create pfile='/u02/hot_orcl/initorcl.ora' from spfile;
2.2 使用表空间的方式进行备份 //低版本中不可以用2.1的方式备份
select tablespace_name,file_name from dba_data_files;
alter tablespace test begin backup;
ho cp /../test.dbf /../..
alter tablespace test end backup;
写成脚本的形式
vim hot2.sql
set heading off
spool /tmp/hot.sql
select 'alter tablespace '||tablespace_name||' begin backup; '||chr(10) ||'ho cp ' || file_name || ' /u02/hot_orcl' || chr(10) || 'alter tablespace '||tablespace_name||' end backup; ' from dba_data_files order by tablespace_name;
spool off
start /tmp/hot.sql
alter database backup controlfile to '/u02/hot_oral/control01.ctl';
create pfile='/u02/hot_orcl/initorcl.ora' from spfile;
2.3 热备情况下,如何restore
2.3.1
controlfile-- 还原备份的控制文件-- recover database using backup controlfile;
在instance状态下,ho cp 热备的control file到oracle 对应目录下,这样才可以启动到mount状态
然后再启动到open状态下,提示要做media recovery
recover database using backup controlfile; //提示缺少归档日志,请指定redolog位置进行恢复。
alter database open resetlogs;
重新全备数据库
2.3.2
数据文件丢失
a)可以offline的,在线还原恢复
demo:
users文件坏掉
select file#,status,enabled from v$datafile; //通过file id查看其状态
alter database 4 offline;
select file#,status,enabled from v$datafile; //RECOVER状态了
ho cp /u02/../users01.dbf /u01/..../users01.dbf //先还原,即拷贝到报错提示的路径下
alter database datafile 4 online; //提示需要media recovery
recover datafile 4;
alter database datafile 4 online;
b)不可以offline,只能到mount阶段恢复
系统文件丢失
启动到mount阶段(shutdown abort,或者startup force mount )
还原文件 ho cp /u02/.../system01.dbf /u01/.../system01.dbf
recover datafile 1;
alter database open;
不需要再做热备。
注意:如果执行了resetlogs来打开数据库,或者重新建立了控制文件,就必须重新全备
2.3.3
日志文件丢失-参照日志管理
2.3.4
temp丢失
不影响数据库的启动,只是影响数据库的使用。
2.3.5
参数文件,密码文件 丢失-参照管理方法
3.不完全恢复
将数据库恢复到过去的某一个时刻。
4种情况下需要进行不完全恢复
a)redo log 丢失,没有镜像redo log,并且日志没来得及归档,数据文件也丢失。no archive模式下联机日志的cancel恢复。
b)用户误操作,恢复到误操作前一时刻。比如提交了用错误的WHERE子句更新的数据。如果有逻辑恢复,还是可以完全恢复的,不然只能做不完全恢复。
c) 丢失归档
d)丢失控制文件,建议大家重建控制文件比较好,最好不要进行不完全恢复。
常见类型:
a)基于时间点的恢复
注意不要在目标庫上操作,除非有全备。
b)基于cancel的恢复
建议日志文件做成冗余,并做归档日志,可以避免
c)基于更改的恢复
找到scn号,比较复杂。
其操作步骤:
不在当前需要恢复的庫上操作,到另外的庫上去操作,找到想要的数据导出,再导入到目标庫中。
三种方式
a)基于用户的管理sqlplus
b)RMAN
c)flashback
打开flashback数据库
在没有必要的情况下就不要去做,消耗的时间长,成本高。日志挖掘也可以做不完全恢复。
4.RMAN备份 ----基于块级的备份,仅仅备份使用过的块
-----将使用large pool,不然只能是用共享池,要保证足够的内存
-----locate log 记录在control file
-----catolog log C/S架构,集中管理和维护
5.逻辑备份 ----导入导出
三个级别:
a.全备
b.用户备份
c.表备
6.物理备库,逻辑备库
7.flash recovery