暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle手工冷备与热备

原创 Hello world 2023-02-21
789

手工冷备与热备

1 手工冷备与热备

1.1 相关命令

(1)备份和还原都使用OS命令,如linux中的cp
(2)恢复用sqlplus命令:recover

1.2 备份前进行检查

严格来说,冷备考虑两种文件:数据文件和控制文件。
1.2.1 检查需要备份的数据文件
SQL> col name for a60
SQL> select name from v$datafile;
图片.png

1.2.2 检查要备份的控制文件

SQL> select name from v$controlfile;
图片.png

1.2.3 在线redo日志不需要做备份

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

alter database clear logfile group n;重建所有日志文件组。

1.2.3.1日志组状态

日志组状态:综述

在任何给定时间,重做日志组的状态都会是以下值之一:
current:LGWR进程当前正在向重做日志组写入重做数据。
active:不再向重做日志组写入数据,但是仍需要它来恢复实例。
inactive:不再向重做日志组写入数据,且不再需要它来恢复实例。
1.2.3.2 丢失日志组后的恢复
图片.png

SQL> col member for a60
SQL> select member from v$logfile;
MEMBER
------------------------------------------------------------
/oracle/app/oracle/oradata/oracle/redo03.log
/oracle/app/oracle/oradata/oracle/redo02.log
/oracle/app/oracle/oradata/oracle/redo01.log
/oracle/app/oracle/product/11.2.0/db/dbs/srl1.f
/oracle/app/oracle/product/11.2.0/db/dbs/srl2.f
/oracle/app/oracle/product/11.2.0/db/dbs/srl3.f
/oracle/app/oracle/product/11.2.0/db/dbs/srl4.f
/oracle/app/oracle/oradata/oracle/std_redo01.log
/oracle/app/oracle/oradata/oracle/std_redo02.log
/oracle/app/oracle/oradata/oracle/std_redo03.log
/oracle/app/oracle/oradata/oracle/std_redo04.log

1.2.4 dbv检查坏块

在手工备份前,可以使用dbv命令检查datafile是否有坏块,备份完成后对备份也要做检查。对某个datafile做坏块检查。
查看当前数据库有哪些数据文件。

SQL> select name,STATUS,BYTES/1024/1024 as MB from v$datafile;
![图片.png](https://oss-emcsprod-public.modb.pro/image/editor/20230221-a0368373-67ca-4138-b984-70176b8d42a5.png)
[oracle@primary ~]$ dbv
[oracle@primary ~]$ dbv file=/oracle/app/oracle/oradata/oracle/test01.dbf

图片.png

1.3 冷备的注意事项

(1)必须干净的关闭数据库,以保证数据一致性。
SQL>shutdwon immediate
(2)在OS下必须备份所有数据文件
(3)在OS下必须备份控制文件(至少备份一个)
(4)非归档备份还原策略
恢复时还原所有备份,重建所有在线日志,没有recover步骤。

SQL> startup mount
SQL> alter database clear logfile group n;
SQL> alter database open;

图片.png

1.4 手工冷备数据库

1.4.1 创建目录、赋予权限

[oracle@primary ~]$ mkdir -p /oracle/backup/oracle/cold
[oracle@primary ~]$ ls -ld /oracle/backup/oracle/cold
drwxr-xr-x 2 oracle oinstall 6 Feb  9 11:13 /oracle/backup/oracle/cold

1.4.2 正常关库

SQL> shutdown immediate     
Database closed.
Database dismounted.
ORACLE instance shut down

.

1.4.3 数据文件、控制文件、(日志文件)

[oracle@primary ~]$ cd /oracle/app/oracle/oradata/oracle
[oracle@primary oracle]$ ls -l
total 1706460
-rw-r----- 1 oracle oinstall   9814016 Feb  9 11:22 control01.ctl
-rw-r----- 1 oracle oinstall   5251072 Feb  9 11:22 john.dbf
-rw-r----- 1 oracle oinstall  52429312 Feb  9 10:17 redo01.log
-rw-r----- 1 oracle oinstall  52429312 Feb  9 11:22 redo02.log
-rw-r----- 1 oracle oinstall  52429312 Feb  9 11:22 redo03.log
-rw-r----- 1 oracle oinstall  52429312 Feb  7 15:38 std_redo01.log
-rw-r----- 1 oracle oinstall  52429312 Feb  7 15:38 std_redo02.log
-rw-r----- 1 oracle oinstall  52429312 Feb  7 15:38 std_redo03.log
-rw-r----- 1 oracle oinstall  52429312 Feb  7 15:38 std_redo04.log
-rw-r----- 1 oracle oinstall 545267712 Feb  9 11:22 sysaux01.dbf
-rw-r----- 1 oracle oinstall 775954432 Feb  9 11:22 system01.dbf
-rw-r----- 1 oracle oinstall  20979712 Feb  7 09:38 temp01.dbf
-rw-r----- 1 oracle oinstall   5251072 Feb  9 11:22 test01.dbf
-rw-r----- 1 oracle oinstall  31465472 Feb  9 11:22 undotbs01.dbf
-rw-r----- 1 oracle oinstall   5251072 Feb  9 11:22 users01.dbf
[oracle@primary oracle]$ cp * /oracle/backup/oracle/cold
[oracle@primary oracle]$ ll /oracle/backup/oracle/cold

图片.png

1.4.4 开库

SQL> startup
ORACLE instance started.

Total System Global Area 2455228416 bytes
Fixed Size                  2255712 bytes
Variable Size             620758176 bytes
Database Buffers         1811939328 bytes
Redo Buffers               20275200 bytes
Database mounted.
Database opened.

1.4.5 临时文件不需要做备份

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

SQL> select name from v$tempfile;

NAME
--------------------------------------------------------------------------------
/oracle/app/oracle/oradata/oracle/temp01.dbf

1.5 手工热备(非一致性备份)

图片.png

1.5.1 热备必须是归档模式

SQL> archive log list

图片.png
特别强调:noarchive模式下不支持热备。

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

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

SQL> alter database begin backup;

图片.png
在设置了全库热备之后,要结束热备模式之后,才能关闭数据库,否则关闭数据库的时候会报错。

SQL> shutdown immediate

图片.png
取消全备

SQL> alter database end backup;

Database altered.
对只读的表空间不能做热备份,临时表空间不需要备份

SQL> alter tablespace JOHN read only;

Tablespace altered.
SQL> alter tablespace john begin backup;
SQL> alter tablespace john read write;

Tablespace altered.

把表空间修改回read write状态。

SQL> select tablespace_name,status from dba_tablespaces;

1.6 热备表空间

1.6.1 创建目录、赋予权限

[oracle@primary ~]$ mkdir -p /oracle/backup/oracle/hot
[oracle@primary ~]$ ls -ld /oracle/backup/oracle/hot

图片.png

1.6.2 进入热备模式(database/tablespace)

SQL> alter tablespace users begin backup;

SQL> select file#,checkpoint_change# from v$datafile_header;

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

SQL> select * from v$backup;

status是acitve,表示可以cp命令备份相应的数据文件。

1.6.3 cp文件

[oracle@primary ~]$ cd /oracle/app/oracle/oradata/oracle/
[oracle@primary oracle]$ cp users01.dbf /oracle/backup/oracle/hot
[oracle@primary oracle]$ ll /oracle/backup/oracle/hot
total 5128
-rw-r----- 1 oracle oinstall 5251072 Feb  9 13:05 users01.dbf

1.6.4 结束热备模式

SQL> alter tablespace users end backup;

Tablespace altered.
SQL> select file#,checkpoint_change# from v$datafile_header;
SQL> select * from v$backup;

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

1.7 数据库热备模式

SQL> alter database begin backup;

Database altered.
SQL> select * from v$backup;

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

SQL> alter database end backup;

Database altered.
SQL> select * from V$backup;

图片.png

1.8 块分裂问题split block

图片.png
如果块在t2时间复制,则该块是破碎的。
一个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 block就是spit block。

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

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

最后修改时间:2023-02-24 10:40:52
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论