ITPub博客

首页 > 数据库 > Oracle > 只读表空间的备份与恢复

只读表空间的备份与恢复

Oracle 作者:lilingfeng1 时间:2016-10-10 11:43:23 0 删除 编辑
--======================
--  只读表空间的备份与恢复
--======================


一、只读表空间的特性
    使用只读表空间避免对静态数据的频繁备份
    当使用alter tablespace tbs read only时,数据文件会执行检查点进程(将所有脏缓冲区的内容写至磁盘),
        当前的SCN号会被标注,同时存储了SCN的数据文件头部被冻结.控制文件内也会记录该数据文件的冻结信息。
    可以清除只读表空间的对象
    
二、只读表空间的备份
    一般情况下,只读表空间只需要进行一次备份,即当表空间状态发生改变时应立即进行备份
    可以使用OS系统cp命令来备份或RMAN进行备份只读表空间
    使用RMAN时建议启用备份优化选项
        RMAN> CONFIGURE BACKUP OPTIMIZATION ON;
        
    只读表空间不支持热备
    SQL> alter tablespace tbs1 begin backup;
    alter tablespace tbs1 begin backup
    *
    ERROR at line 1:
    ORA-01642: begin backup not needed for read only tablespace 'TBS1'

三、只读表空间的还原与恢复
    还原与恢复只读表空间的问题在于控制文件如何控制只读表空间,分为下列三种情况:    
    ---------  ---------------  ----------------  -------------------------------------
    case           backup 1     crash status                   recovery
    ---------  ---------------  ----------------  -------------------------------------
    case 1        Read-Only        Read-Only      将备份的只读表空间复制到目的地(Restore)
    case 2        Read-Only        Read-Write     先Restore backup1,后recover(applied log )
    case 3        Read-Write       Read-only       先Restore backup1,后recover(applied log )

    只读表空间恢复时需要考虑的问题
        重建一个控制文件时
        重命名数据文件时
        使用一个备份的控制文件时
    
    下面对表空间tbs1置为只读后对比前后生成的重建控制文件的脚本        
[sql] view plain copy
 print?
  1. SQL> alter database backup controlfile to trace as '/tmp/rectl1.sql';    
  2.                                                                          
  3. SQL> alter tablespace tbs1 read only;                                    
  4.                                                                          
  5. SQL> alter database backup controlfile to trace as '/tmp/rectl2.sql';    
  6.                                                                          
  7. SQL> ho diff /tmp/rectl1.sql /tmp/rectl2.sql                             
  8. 69,70c69                                                                 
  9. <   '/u01/app/oracle/oradata/orcl/example01.dbf',                        
  10. <   '/u01/app/oracle/oradata/orcl/tbs01.dbf'                             
  11. ---                                                                      
  12. >   '/u01/app/oracle/oradata/orcl/example01.dbf'                         
  13. 97a97,102                                                                
  14. > -- Files in read-only tablespaces are now named.                       
  15. > ALTER DATABASE RENAME FILE 'MISSING00006'                              
  16. >   TO '/u01/app/oracle/oradata/orcl/tbs01.dbf';                         
  17. >                                                                        
  18. > -- Online the files in read-only tablespaces.                          
  19. > ALTER TABLESPACE "TBS1" ONLINE;                                        
    对比两者
        1.使用create controlfile命令时,datafile中未列出只读表空间的数据文件
        2.成功创建控制文件并打开后,使用alter database rename file命令重命名只读表空间的数据文件
        3.使用alter tablespace readonly_tablespacename online 将只读表空间联机

四、演示只读表空间变化的恢复过程        
    1. 演示整个过程为只读表空间的情况(对应前面描述的case 1)        
[sql] view plain copy
 print?
  1. SQL> create table scott.tb1 tablespace tbs1                           
  2.   2  as select * from scott.emp;                                      
  3.                                                                       
  4. SQL> commit;                                                          
  5.                                                                       
  6. SQL> alter tablespace tbs1 read only;                                 
  7.                                                                       
  8. SQL> select file#,name,enabled from v$datafile where file#=6;         
  9.                                                                       
  10.      FILE# NAME                                          ENABLED        
  11. ---------- --------------------------------------------- ----------   
  12.                  6 /u01/app/oracle/oradata/orcl/tbs01.dbf       READ ONLY     
  13.                                                                       
  14. SQL> ho cp /u01/app/oracle/oradata/orcl/tbs01.dbf /tmp/tbs01.dbf     
  15.                                                                         
  16. SQL> insert into scott.tb1(empno,ename) values(3333,'Thomas');        
  17.                                                                       
  18. SQL> update scott.tb1 set sal=sal*1.2 where ename='SCOTT';            
  19.                                                                       
  20. SQL> delete from scott.tb1 where ename='SCOTT';                       
  21. --执行上述三条命令,收到下列同样的错误提示                            
  22. ORA-00372: file 6 cannot be modified at this time                     
  23. ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/tbs01.dbf'      
        从上面的演示可以看出对只读表空间内的数据作任何DML操作均不可用
        在 Oracle 表空间与数据文件    一文中,可以对只读表空间作delete操作(版本是10.2.0.1.0),应该是数
        据库补丁的问题,    此版本为10.2.0.4.0。        
[sql] view plain copy
 print?
  1. --使用vim 打开?/oradata/orcl/tbs01.dbf文件做任意操作来模拟破坏该只读表空间的数据文件      
  2. --重启数据库后收到下面的错误提示                                                          
  3. ORA-01157: cannot identify/lock data file 6 - see DBWR trace file                         
  4. ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/tbs01.dbf'                            
  5.                                                                                           
  6. SQL> ho cp /tmp/tbs01.dbf /u01/app/oracle/oradata/orcl/tbs01.dbf                          
  7.                                                                                           
  8. SQL> alter database open;                                                                 
  9.                                                                                           
  10. SQL> select count(1) from scott.tb1;                                                      
  11.                                                                                           
  12.   COUNT(1)                                                                                
  13. ----------                                                                                
  14.         16                                                                                    
    2. 演示由只读变为读写后发生损坏且只有只读备份的恢复情况(对应前面描述的case 2)       
[sql] view plain copy
 print?
  1. SQL> alter tablespace tbs1 read write;                                                               
  2.                                                                                                      
  3. SQL> insert into scott.tb1(empno,ename) values(3333,'Thomas');                                       
  4.                                                                                                      
  5. SQL> commit;                                                                                         
  6.                                                                                                      
  7. --使用vim 打开/u01/app/oracle/oradata/orcl/tbs01.dbf文件做任意操作来模拟破坏该读写表空间的数据文件   
  8. --重启数据库后未收到错误提示                                                                         
  9.                                                                                                          
  10. SQL> insert into scott.tb1(empno,ename) values(4444,'Jackson');                                      
  11. insert into scott.tb1(empno,ename) values(4444,'Jackson')                                            
  12.                   *                                                                                          
  13. ERROR at line 1:                                                                                     
  14. ORA-00376: file 6 cannot be read at this time                                                        
  15. ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/tbs01.dbf'                                     
  16.                                                                                                      
  17. SQL> select * from v$recover_file;                                                                   
  18.                                                                                                      
  19.      FILE# ONLINE  ONLINE_ ERROR               CHANGE# TIME                                            
  20. ---------- ------- ------- ---------------- ---------- ---------                                     
  21.          6 OFFLINE OFFLINE FILE NOT FOUND            0                                                   
  22.                                                                                                          
  23. SQL> ho cp /tmp/tbs01.dbf /u01/app/oracle/oradata/orcl/tbs01.dbf                                     
  24.                                                                                                      
  25. SQL> recover datafile 6;                                                                             
  26. Media recovery complete.                                                                             
  27.                                                                                                      
  28. SQL> alter tablespace tbs1 online;                                                                   
  29.                                                                                                      
  30. Tablespace altered.                                                                                  
  31. SQL> select * from scott.tb1 where ename='Thomas';                                                   
  32.                                                                                                      
  33.      EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO                  
  34. ---------- ---------- --------- ---------- --------- ---------- ---------- ----------                
  35.       3333 Thomas                                                                                      
    3. 演示由读写表空间变为只读表空间,且仅有读写表空间备份的恢复(对应前面描述的case 3)      
[sql] view plain copy
 print?
  1. SQL> select file#,name,enabled from v$datafile where file#=6;                           
  2.                                                                                         
  3.      FILE# NAME                                          ENABLED                          
  4. ---------- --------------------------------------------- ----------                     
  5.          6 /u01/app/oracle/oradata/orcl/tbs01.dbf        READ WRITE                         
  6.                                                                                         
  7. SQL> alter tablespace tbs1 begin backup;                                                
  8.                                                                                         
  9. SQL> ho cp /u01/app/oracle/oradata/orcl/tbs01.dbf /tmp/tbs01.dbf                        
  10.                                                                                         
  11. SQL> alter tablespace tbs1 end backup;                                                  
  12.                                                                                         
  13. SQL> delete from scott.tb1 where empno=3333;                                            
  14.                                                                                         
  15. SQL> commit;                                                                            
  16.                                                                                         
  17. SQL> alter tablespace tbs1 read only;                                                   
  18.                                                                                         
  19. --使用vim 打开?/oradata/orcl/tbs01.dbf文件做任意操作来模拟破坏该只读表空间的数据文件    
  20. --重启数据库后收到下面的错误提示                                                        
  21.                                                                                         
  22. ORA-01157: cannot identify/lock data file 6 - see DBWR trace file                       
  23. ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/tbs01.dbf'                        
  24.                                                                                         
  25. SQL> ho cp /tmp/tbs01.dbf /u01/app/oracle/oradata/orcl/tbs01.dbf                        
  26.                                                                                         
  27. SQL> recover datafile 6;                                                                
  28.                                                                                         
  29. SQL> alter database open;                                                               
  30.                                                                                         
  31. SQL> select * from scott.tb1 where ename='Thomas';                                      
  32.                                                                                         
  33. no rows selected                                                                        
    4. 演示数据文件状态发生多次变化且在变化时没有任何备份的恢复处理(实际上使用日志来重新构造该数据文件)      
[sql] view plain copy
 print?
  1. SQL> select file#,name,enabled from v$datafile where file#=6;                        
  2.                                                                                      
  3.      FILE# NAME                                          ENABLED                       
  4. ---------- --------------------------------------------- ----------                  
  5.          6 /u01/app/oracle/oradata/orcl/tbs01.dbf        READ WRITE                      
  6.                                                                                      
  7. SQL> drop table scott.tb1;                                                           
  8.                                                                                      
  9. SQL> commit;                                                                         
  10.                                                                                      
  11. SQL> alter tablespace tbs1 read only;                                                
  12.                                                                                      
  13. SQL> alter tablespace tbs1 read write;                                               
  14.                                                                                      
  15. SQL> create table scott.tb2 tablespace tbs1 as select * from scott.emp;              
  16.                                                                                      
  17. SQL> commit;                                                                         
  18.                                                                                      
  19. SQL> alter system checkpoint;                                                        
  20.                                                                                      
  21. [oracle@oradb orcl]$tail -n 50 $ORACLE_BASE/admin/orcl/bdump/alert_orcl.log          
  22. Errors in file /u01/app/oracle/admin/orcl/bdump/orcl_ckpt_4064.trc:                  
  23. ORA-01171: datafile 6 going offline due to error advancing checkpoint                
  24. ORA-01122: database file 6 failed verification check                                 
  25. ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/tbs01.dbf'                     
  26. ORA-01251: Unknown File Header Version read for file number 6                        
  27.                                                                                      
  28. SQL> select * from v$recover_file;                                                   
  29.                                                                                      
  30.      FILE# ONLINE  ONLINE_ ERROR              CHANGE# TIME                             
  31. ---------- ------- ------- --------------- ---------- ---------                      
  32.          6 OFFLINE OFFLINE FILE NOT FOUND           0                                        
  33.                                                                                      
  34. SQL> select file#,name,status from v$datafile where file#=6;                         
  35.                                                                                      
  36.      FILE# NAME                                          STATUS                        
  37. ---------- --------------------------------------------- -------                     
  38.          6 /u01/app/oracle/oradata/orcl/tbs01.dbf        RECOVER                         
  39.                                                                                      
  40. SQL> alter database create datafile 6;                                               
  41.                                                                                      
  42. SQL> recover datafile 6;                                                             
  43. Media recovery complete.                                                             
  44.                                                                                      
  45. SQL> alter database datafile 6 online;                                               
  46.                                                                                      
  47. SQL> select count(1) from scott.tb2;                                                 
  48.                                                                                      
  49.   COUNT(1)                                                                           
  50. ----------                                                                           
  51.         16                                                                                 
    5. 演示删除只读表空间上的对象      
[sql] view plain copy
 print?
  1. SQL> select file#,name,enabled from v$datafile where file#=6;                         
  2.                                                                                       
  3.      FILE# NAME                                          ENABLED                        
  4. ---------- --------------------------------------------- ----------                   
  5.          6 /u01/app/oracle/oradata/orcl/tbs01.dbf       READ ONLY                         
  6.                                                                                           
  7. SQL> select segment_name,segment_type,tablespace_name,owner from dba_segments where   
  8.   2  tablespace_name='TBS1' and segment_name='TB2';                                   
  9.                                                                                       
  10. SEGMENT_NAME         SEGMENT_TYPE       TABLESPACE_NAME                OWNER          
  11. -------------------- ------------------ ------------------------------ ----------     
  12. TB2                  TABLE              TBS1                           SCOTT          
  13.                                                                                       
  14. SQL> drop table scott.tb2;                                                            
  15.                                                                                       
  16. Table dropped.    

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30192548/viewspace-2126041/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-04-05

  • 博文量
    51
  • 访问量
    38493