oracl数据库热备份
热备份
数据库需要打开归档模式
参数文件无所谓冷备份热备份
备份控制文件热备份
alter database backup controlfile to '/home/oracle/hotbk/ctl.bk';
模拟控制文件丢失
select name from v$controlfile;
host rm -fr /u01/app/oracle/oradata/huayd/*.ctl
startup force nomount
还原controlfile
cp /home/oracle/hotbk/ctl.bk /u01/app/oracle/oradata/huayd/control01.ctl
恢复controlfile
recover database using backup controlfile [until cancel];
备份表空间
SQL> alter tablespace system begin backup;
alter tablespace system begin backup
*
ERROR at line 1:
ORA-01123: cannot start online backup;
media recovery not enabled
在noarchive模式下不能做alter tablespace XXX begin backup,联机备份只有在数据库位于archivelog模式中才能进行。
select file_name from dba_data_files where tablespace_name='USERS';
alter tablespace users begin backup;
ho cp -v /u1/oracle/oradata/madrid/users01.dbf /home/oracle/hotbk
alter tablespace users end backup;
思考:begin backup 做了什么?
当数据文件置于backup模式时,oracle会去锁定数据文件头,这时候数据库发生检查点的话将不会修改文件头的checkpoint scn,而只是增加checkpoint cnt,所以不管执行cp的时候操作系统块的拷贝顺序是如何,oracle总会从文件头的scn开始恢复,这样的话也就避免了数据丢失和数据块corruption.如果大家用的是rman来备份,那么就不会有这个问题,因为rman备份的时候rman会去对比数据块的头尾标志,如果发现不一致,那么它将会再去读这个块,直到读到一致的块才往备份集里写。
'block split',当数据文件在备份cp时,因为oracle数据块和操作系统块的差异,一个数据块可能由16个操作系统块组成(8k 数据块,512bytes 系统块),这样的话可能出现一个数据块包含了几个不同版本的操作系统块,会导致数据块的不一致,所以在备份模式下如果有语句对备份块产生更新,那么oracle会先把当前块复制一份到redo,当恢复的时候如果碰到数据块不一致就从redo把这个镜像拷贝回去,然后在这个一致性的镜像开始恢复。 如果使用rman来备份可以避免产生过多的块,就像上面所说的,rman会去建议块的一致性,所以不用复制镜像块到日志。
恢复表空间
system / undo表空间
startup mount;
cp
recover datafile 1
alter database open
普通表空间
SYS>alter database datafile 4 offline;
SYS>select * from v$recover_file;
# 查看需作恢复的datafile
SYS>ho cp '/tmp/bk/users01.dbf' '/u01/app/oracle/oradata/10gdb/users01.dbf'
SYS>select * from v$recovery_log # 查看恢复需用到的日志文件
SYS>recover datafile 4
SYS>alter tablespace users online;
全库备份
生成备份所有数据文件的脚本:
select 'alter tablespace '||tablespace_name||' begin backup;'||chr(10)|| 'ho cp -v '||file_name||' /home/oracle/hotbk/'||chr(10)|| 'alter tablespace '||tablespace_name||' end backup;' from dba_data_files;