手工备份与恢复

手工备份与恢复

官方文档入口:

  Backup and Recovery User's Guide ---> Part VIII Performing User-Managed Backup and Recovery

1 相关命令

  • 备份和还原都使用OS命令,如linux中的拷贝命令:cp
  • 恢复用sqlplus命令:recover

 

2 备份前进行检查

冷备考虑两种文件:数据文件控制文件

2.1 检查需要备份的数据文件

select name from v$datafile;

2.2 检查要备份的控制文件

select name from v$controlfile;

2.3 在线redo日志不需要做备份(需注意)

  注意:如果是shutdown immediate干净关闭数据库,可以不备份online redo log,可以在需要的时候重新创建。但是如果在备份前由于某些错误造成实例异常终止,那么如果备份中没有包括联机重做日志文件,会在restore还原数据库后无法打开数据库,因为不能执行必需的recover恢复

  重建所有日志文件组命令:

alter database clear logfile group n;

2.3.1日志组状态

在任何给定时间,重做日志组的状态都会是以下值之一

CURRENT:LGWR进程当前正在向重做日志组写入重做数据

ACTIVE:不再向重做日志组写入数据,但是仍需要它来恢复实例

INACTIVE:不再向重做日志组写入数据,且不再需要它来恢复实例

2.3.2丢失日志组后的恢复

select member from v$logfile;

建议把联机日志文件也一起备份

2.4 dbv检查坏块

在手工备份前,可以使用dbv命令检查datafile是否有坏块,备份完后对备份也要做检查

对某个datafile做坏块检查

 

3 手工冷备的注意事项

1)必须干净的关闭数据库,以保证数据一致性

shutdwon immediate;

2)在OS下必须备份所有数据文件

3)在OS下必须备份控制文件(至少备份一个)

4)非归档备份还原策略

恢复时还原所有备份,重建所有在线日志,没有recover步骤

startup mount
alter database clear logfile group n;   --n为所有在线日志组
alter database open;

 

4 手工冷备数据库(一致性备份)

4.1 创建目录、赋予权限

mkdir -p /u01/backup/orcl/cold
ls -ld /u01/backup/orcl/cold/

4.2 正常关库

shutdown immediate;

4.3 cp 数据文件、控制文件、(日志文件)

cd /u01/app/oracle/oradata/ORCL/
ll
cp * /u01/backup/orcl/cold
ll /u01/backup/orcl/cold

4.4 开库

startup

4.5 临时文件不需做备份

即使临时文件受损,也总能够重新创建而不丢失数据

select name from v$tempfile;

 

5 手工热备的注意事项

5.1 热备必须是归档模式

archive log list

NOARCHIVE模式下不支持热备

5.2 在备份前要进入热备模式,备份后要结束热备模式

执行begin backup设置备份模式(在数据文件上生成检查点,写入scn ,将来恢复的时候以此scn为起点)

  • 对整个数据库设置热备模式:
alter database begin backup;
  • 对整个数据库结束热备模式:
alter database end backup;
  • 对单个表空间设置热备模式:
alter tablespace users begin backup;
  • 对单个表空间结束热备模式:
alter tablespace users end backup;

注意:

  • 对只读的表空间不能做热备份
  • 临时表空间不需要备份
select tablespace_name,status from dba_tablespaces;

 

6 热备表空间(非一致性备份)

6.1 创建目录、赋予权限

mkdir -p /u01/backup/orcl/hot
ls -ld /u01/backup/orcl/hot

6.2 进入热备模式(database/tablespace

alter tablespace users begin backup;

select file#,name,checkpoint_change# from v$datafile_header;

在备份期间,scn被冻结,它是恢复阶段运用日志的起点

select * from v$backup;

STATUSACTIVE,表示可以cp命令备份相应的数据文件

6.3 转储(cp)文件

cp /u01/app/oracle/oradata/ORCL/users01.dbf /u01/backup/orcl/hot/
ll /u01/backup/orcl/hot/

6.4 结束热备模式

alter tablespace users end backup;
select file#,name,checkpoint_change# from v$datafile_header;
select * from v$backup;

备份完毕,尽快执行end backup,如果在执行end backup命令之前发生数据库abort,那么可以在下次启动到mountend backup,从而完成实例恢复

 

7 查看数据库热备模式

alter database begin backup;
select * from v$backup;

此时可以对所有数据文件进行cp热备。当表空间处于备份模式时,所有针对表空间中对象的DML产生的redo会显著增加

alter database end backup;
select * from v$backup;

 

8 块分裂问题split block

  一个Oracle block一般包含多个os block (dbca默认8KB,linux 默认1KB),当手工热备时,OS的cp单位不是Oracle block而是 OS block。热备过程中,Oracle的DBWR又可能不时的从内存中刷新Oracle block(脏块)到磁盘上,如此,OS级的拷贝便可能造成:一个Oracle Block是由不同的版本组成,比如未被DBWR刷新Header block加上另一部分被刷新的foot block,这样cp出来的Oracle blcok就是split block

  数据库的一致性是不允许oracle block是split的,Oracle采取的办法是:在 begin backup后,冻结数据文件头,对数据文件设置检查点并且调整redo生成算法。正常运行过程中,redo记录应用到oracle block的最小变更向量;begin backup热备模式下,如果发现首次DBWR要写脏块,则将该块被刷新之前整个块的镜像数据记录到redo buffer。这样,虽然 cp后的备份文件里仍然含有split block,而当需要利用备份进行恢复时,日志会前滚该块的前镜像,以保证所有被恢复的oracle block最终是一个完整的版本

  当表空间处于备份模式时,所有针对表空间中对象的DML产生的redo会显著增加。这就是我们常常发现在热备时日志文件会急剧增大的原因。为了降低维护额外的重做数据带来的开销,Oracle建议一次将一个表空间置于备份模式,同时复制其数据文件。RMAN可以设法处理此问题。如果读取的块是破碎的,则将不停地重复读取该块,直到该块一致为止

 

9 手工冷热备脚本

cd /u01/backup/orcl/
ll

9.1 手工冷备脚本

vi /u01/backup/orcl/cold.sql

添加脚本:

set echo off trimspool off heading off feedback off verify off time off
set pagesize 0 linesize 200
define bakdir='/u01/backup/orcl/cold'
define bakscp='/u01/backup/orcl/coldbak.sql'
spool &bakscp
select 'host cp '||name||' &bakdir ' from v$datafile order by 1;
select 'host cp '||name||' &bakdir ' from v$controlfile order by 1;
spool off
shutdown immediate
@&bakscp
startup
手工冷备脚本

9.2 手工热备脚本

vi /u01/backup/orcl/hot.sql

添加脚本:

set echo off trimspool off heading off feedback off verify off time off
set pagesize 0 linesize 200
define bakdir='/u01/backup/orcl/hot'
define bakscp='/u01/backup/orcl/hotbak.sql'
set serveroutput on
spool &bakscp
declare
  cursor cu_tablespace is
    select tablespace_name from dba_tablespaces
    where contents not like 'TEMP%' and status='ONLINE';
  cursor cu_datafile(name varchar2) is
    select file_name from dba_data_files where tablespace_name=name;
begin
  dbms_output.put_line('alter system switch logfile;');
  for i in cu_tablespace loop
    dbms_output.put_line('alter tablespace '||i.tablespace_name||' begin backup;');
    for j in cu_datafile(i.tablespace_name) loop
      dbms_output.put_line('host cp '||j.file_name||' &bakdir ');
    end loop;
    dbms_output.put_line('alter tablespace '||i.tablespace_name||' end backup;');
  end loop;
    dbms_output.put_line('alter database backup controlfile to trace;');
    dbms_output.put_line('alter database backup controlfile to ''&bakdir/control01.ctl''
reuse;');
    dbms_output.put_line('alter system switch logfile;');
end;
/
spool off
@&bakscp
手工热备教本

9.3 执行冷热备脚本测试

@/u01/backup/orcl/cold.sql
@/u01/backup/orcl/hot.sql

冷备:

热备:

posted @ 2021-06-27 13:03  chchcharlie、  阅读(332)  评论(0编辑  收藏  举报