几种backup小结

巫马昆杰
2023-12-01
[oracle@localhost ~]$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5.5 (Tikanga)
SQL> select * from v$version where rownum=1;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

下面介绍的是冷备份(完全脱机备份),部分脱机备份,部分联机备份,对于RMAN和逻辑备份(exp,imp|expdp,impdp)后面的篇幅会涉及。
完全脱机备份:(归档和非归档都适用,针对整个数据库备份)
这个不用多说了,http://blog.itpub.net/29876893/viewspace-1607155/这篇说的很清楚
但是这种备份很有很多缺点:
1.要shutdown之后才可以,生产库是绝对不允许的
2.需要通过操作系统命令拷贝,这个对于很大的文件,很影响数据库性能,有时候不是一般的慢!
3.如果数据库的存储采取ASM,不可以直接拷贝,我们看不到文件系统的分区。
部分脱机备份:(针对表空间)
我们可以改变表空间的offline,online(需要归档
SQL> select username,default_tablespace from dba_users where username='HR';

USERNAME                       DEFAULT_TABLESPACE
------------------------------ ------------------------------
HR                             USERS

SQL> alter tablespace users offline;

表空间已更改。
此时拷贝走users下的数据文件就行了。
SQL> select file_id,tablespace_name,online_status from dba_data_files where tablespace_name='USERS';


   FILE_ID TABLESPACE_NAME                ONLINE_
---------- ------------------------------ -------
         4 USERS                          OFFLINE


此时把users online:

SQL> alter tablespace users online;
表空间已更改。
当然你也可以直接把数据文件离线:

SQL> alter database datafile 4 offline;
数据库已更改。
SQL> truncate table tt;
表被截断。

SQL> insert into tt values(1,dbms_flashback.get_system_change_number);
 已创建 1 行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。


SQL> insert into tt values(2,dbms_flashback.get_system_change_number);
已创建 1 行。
SQL> commit;
提交完成。
SQL>  alter system switch logfile;
系统已更改。


SQL>  insert into tt values(3,dbms_flashback.get_system_change_number);
已创建 1 行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。

SQL>  select * from v$log;


    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS          FIRST_CHANGE# FIRST_TIME     NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -------------- ------------ --------------
         1          1        439   52428800        512          1 YES ACTIVE                 7312260 28-4月 -15          7312279 28-4月 -15
         2          1        440   52428800        512          1 NO  CURRENT                7312279 28-4月 -15       2.8147E+14
         3          1        438   52428800        512          1 YES ACTIVE                 7312248 28-4月 -15          7312260 28-4月 -15


此时我们删除表空间user里的数据文件
此时只能启动到mount.
具体怎么恢复参考 http://blog.itpub.net/29876893/viewspace-1607155/
可以先不恢复,把表空间离线,打开数据库,后恢复。

该种备份比较好的是不用shutdown备份表空间,但是我们不能离线system,undo,redo,temp表空间,很大的遗憾:

SQL> alter tablespace system offline; 
alter tablespace system offline
*
第 1 行出现错误:
ORA-01541: 系统表空间无法脱机; 如有必要请关闭

注意是不能离线当前undo表空间!
SQL> alter tablespace UNDOTBS1 offline;
alter tablespace UNDOTBS1 offline
*
第 1 行出现错误:
ORA-30042: 无法使还原表空间脱机

如果不是当前使用的undo表空间:
SQL> alter tablespace UNDO_W online;
表空间已更改。

这种方式的缺点还有:
2.需要通过操作系统命令拷贝,这个对于很大的文件,很影响数据库性能,有时候不是一般的慢!
3.如果数据库的存储采取ASM,不可以直接拷贝,我们看不到文件系统的分区。
部分联机备份:这种方式的备份适用于归档模式。
oracle做了很大的改进,在联机状态就可以备份:
如:
SQL> select * from v$backup;


     FILE# STATUS                CHANGE# TIME
---------- ------------------ ---------- --------------
         1 NOT ACTIVE                  0
         2 NOT ACTIVE                  0
         3 NOT ACTIVE                  0
         5 NOT ACTIVE                  0
         6 NOT ACTIVE                  0
         7 NOT ACTIVE                  0
         8 NOT ACTIVE                  0
         9 NOT ACTIVE                  0
        11 NOT ACTIVE                  0
        12 NOT ACTIVE                  0
已选择10行。

此时这些文件都不是活动状态

SQL> alter tablespace CHAO begin backup;
表空间已更改。
SQL> alter tablespace SYSTEM begin backup;
表空间已更改。

SQL> select * from v$backup;


     FILE# STATUS                CHANGE# TIME
---------- ------------------ ---------- --------------
         1 ACTIVE                7420181 29-4月 -15
         2 NOT ACTIVE                  0
         3 NOT ACTIVE                  0
         5 NOT ACTIVE                  0
         6 NOT ACTIVE                  0
         7 ACTIVE                7420021 29-4月 -15
         8 NOT ACTIVE                  0
         9 NOT ACTIVE                  0
        11 NOT ACTIVE                  0
        12 NOT ACTIVE                  0
已选择10行。

此时一号和七号文件处于活动的状态,并且记录此时SCN,作为下一次恢复的起点!
备份就是直接拷走备份的数据文件。
关闭数据文件7的活动状态:
SQL> alter tablespace CHAO end backup;
表空间已更改。

SQL> select * from v$backup where file#=7;


     FILE# STATUS                CHANGE# TIME
---------- ------------------ ---------- --------------
         7 NOT ACTIVE            7420021 29-4月 -15

如果要完全备份,这样操作是不是能把人搞疯!

SQL> alter database begin backup;
alter database begin backup
*
第 1 行出现错误:
ORA-01146: 无法启动联机备份 - 文件 1 已在备份中 ORA-01110:
数据文件 1: '/u01/app/oracle/oradata/orcl3939/system01.dbf'
SQL> alter tablespace system end backup;
表空间已更改。
这个地方感觉不是太爽!需要关闭之前的热状态!
SQL> alter database begin backup;
数据库已更改。



SQL> select * from v$backup;


     FILE# STATUS                CHANGE# TIME
---------- ------------------ ---------- --------------
         1 ACTIVE                7420464 29-4月 -15
         2 ACTIVE                7420464 29-4月 -15
         3 ACTIVE                7420464 29-4月 -15
         5 ACTIVE                7420464 29-4月 -15
         6 ACTIVE                7420464 29-4月 -15
         7 ACTIVE                7420464 29-4月 -15
         8 ACTIVE                7420464 29-4月 -15
         9 ACTIVE                7420464 29-4月 -15
        11 ACTIVE                7420464 29-4月 -15
        12 ACTIVE                7420464 29-4月 -15
已选择10行。
 
结束备份的话直接alter  database end backup;
这种备份的缺点:
1.会产生大量的redo log,是什么原因呢?
SQL> show parameter db_block_size
db_block_size                        integer     8192

[oracle@localhost ~]$ dumpe2fs /dev/sda1 
bash: dumpe2fs: command not found
[oracle@localhost ~]$ su - root
口令:
[root@localhost ~]# dumpe2fs /dev/sda1  
Block size:               1024

SQL> select 8*1024/1024 from dual;

8*1024/1024
-----------
          8
8个操作系统块构成了一个数据块:









此时用os命令拷贝这个块,读取是按照os块读取,但是此时oracle一个事务正在修改这个块。最终 我们恢复时,oracle识别不了这个块   !
oracle为了解决这个问题,只要在热备份状态下的块,操作这个数据块 都会以日志方式记录下来,所以操作一个块会多8k日志量。

大概简述模拟这个过程:
select  * from v$statname where name like '%redo%'; 统计了很多关于redo的信息,里面有redo size.
SQL> select * from v$sesstat where sid=159;
SQL> select * from v$sesstat where statistic#=169 and sid=159;

可以插入一条数据,然后看产生多少日志(大概估计)。
然后执行表空间热备份下:
看下日志量
然后插入相同数据,查看日志量
感兴趣可以自行模拟。

 类似资料: