只读表空间的备份与恢复

--====================== --  只读表空间的备份与恢复 --====================== 一、只读表空间的特性     使用只读表空间避免对静态数据的频繁备份     当使用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> alter database backup controlfile to trace as '/tmp/rectl1.sql';  
                                                                       
SQL> alter tablespace tbs1 read only;                                  
                                                                       
SQL> alter database backup controlfile to trace as '/tmp/rectl2.sql';  
                                                                       
SQL> ho diff /tmp/rectl1.sql /tmp/rectl2.sql                           
69,70c69                                                               
<   '/u01/app/oracle/oradata/orcl/example01.dbf',                      
<   '/u01/app/oracle/oradata/orcl/tbs01.dbf'                           
---                                                                    
>   '/u01/app/oracle/oradata/orcl/example01.dbf'                       
97a97,102                                                              
> -- Files in read-only tablespaces are now named.                     
> ALTER DATABASE RENAME FILE 'MISSING00006'                            
>   TO '/u01/app/oracle/oradata/orcl/tbs01.dbf';                       
>                                                                      
> -- Online the files in read-only tablespaces.                        
> ALTER TABLESPACE "TBS1" ONLINE;                   

    对比两者         1.使用create controlfile命令时,datafile中未列出只读表空间的数据文件         2.成功创建控制文件并打开后,使用alter database rename file命令重命名只读表空间的数据文件         3.使用alter tablespace readonly_tablespacename online 将只读表空间联机 四、演示只读表空间变化的恢复过程      1. 演示整个过程为只读表空间的情况(对应前面描述的case 1)       

SQL> create table scott.tb1 tablespace tbs1                         
  2  as select * from scott.emp;                                    
                                                                    
SQL> commit;                                                        
                                                                    
SQL> alter tablespace tbs1 read only;                               
                                                                    
SQL> select file#,name,enabled from v$datafile where file#=6;       
                                                                    
	 FILE# NAME                                          ENABLED      
---------- --------------------------------------------- ---------- 
				 6 /u01/app/oracle/oradata/orcl/tbs01.dbf       READ ONLY   
                                                                    
SQL> ho cp /u01/app/oracle/oradata/orcl/tbs01.dbf /tmp/tbs01.dbf	  
	                                                                  
SQL> insert into scott.tb1(empno,ename) values(3333,'Thomas');      
                                                                    
SQL> update scott.tb1 set sal=sal*1.2 where ename='SCOTT';          
                                                                    
SQL> delete from scott.tb1 where ename='SCOTT';                     
--执行上述三条命令,收到下列同样的错误提示                          
ORA-00372: file 6 cannot be modified at this time                   
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。       

--使用vim 打开?/oradata/orcl/tbs01.dbf文件做任意操作来模拟破坏该只读表空间的数据文件    
--重启数据库后收到下面的错误提示                                                        
ORA-01157: cannot identify/lock data file 6 - see DBWR trace file                       
ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/tbs01.dbf'	                      
                                                                                        
SQL> ho cp /tmp/tbs01.dbf /u01/app/oracle/oradata/orcl/tbs01.dbf                        
                                                                                        
SQL> alter database open;                                                               
                                                                                        
SQL> select count(1) from scott.tb1;                                                    
                                                                                        
  COUNT(1)                                                                              
----------                                                                              
		16                                                               

    2. 演示由只读变为读写后发生损坏且只有只读备份的恢复情况(对应前面描述的case 2)      

SQL> alter tablespace tbs1 read write;                                                             
                                                                                                   
SQL> insert into scott.tb1(empno,ename) values(3333,'Thomas');                                     
                                                                                                   
SQL> commit;                                                                                       
                                                                                                   
--使用vim 打开/u01/app/oracle/oradata/orcl/tbs01.dbf文件做任意操作来模拟破坏该读写表空间的数据文件 
--重启数据库后未收到错误提示                                                                       
		                                                                                               
SQL> insert into scott.tb1(empno,ename) values(4444,'Jackson');                                    
insert into scott.tb1(empno,ename) values(4444,'Jackson')                                          
				  *                                                                                        
ERROR at line 1:                                                                                   
ORA-00376: file 6 cannot be read at this time                                                      
ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/tbs01.dbf'                                   
                                                                                                   
SQL> select * from v$recover_file;                                                                 
                                                                                                   
	 FILE# ONLINE  ONLINE_ ERROR               CHANGE# TIME                                          
---------- ------- ------- ---------------- ---------- ---------                                   
		 6 OFFLINE OFFLINE FILE NOT FOUND            0	                                               
		                                                                                               
SQL> ho cp /tmp/tbs01.dbf /u01/app/oracle/oradata/orcl/tbs01.dbf                                   
                                                                                                   
SQL> recover datafile 6;                                                                           
Media recovery complete.                                                                           
                                                                                                   
SQL> alter tablespace tbs1 online;                                                                 
                                                                                                   
Tablespace altered.                                                                                
SQL> select * from scott.tb1 where ename='Thomas';                                                 
                                                                                                   
	 EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO                
---------- ---------- --------- ---------- --------- ---------- ---------- ----------              
	  3333 Thomas                                                                                 

    3. 演示由读写表空间变为只读表空间,且仅有读写表空间备份的恢复(对应前面描述的case 3)      

SQL> select file#,name,enabled from v$datafile where file#=6;                         
                                                                                      
	 FILE# NAME                                          ENABLED                        
---------- --------------------------------------------- ----------                   
		 6 /u01/app/oracle/oradata/orcl/tbs01.dbf        READ WRITE                       
                                                                                      
SQL> alter tablespace tbs1 begin backup;                                              
                                                                                      
SQL> ho cp /u01/app/oracle/oradata/orcl/tbs01.dbf /tmp/tbs01.dbf                      
                                                                                      
SQL> alter tablespace tbs1 end backup;                                                
                                                                                      
SQL> delete from scott.tb1 where empno=3333;                                          
                                                                                      
SQL> commit;                                                                          
                                                                                      
SQL> alter tablespace tbs1 read only;                                                 
                                                                                      
--使用vim 打开?/oradata/orcl/tbs01.dbf文件做任意操作来模拟破坏该只读表空间的数据文件  
--重启数据库后收到下面的错误提示                                                      
                                                                                      
ORA-01157: cannot identify/lock data file 6 - see DBWR trace file                     
ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/tbs01.dbf'                      
                                                                                      
SQL> ho cp /tmp/tbs01.dbf /u01/app/oracle/oradata/orcl/tbs01.dbf                      
                                                                                      
SQL> recover datafile 6;                                                              
                                                                                      
SQL> alter database open;                                                             
                                                                                      
SQL> select * from scott.tb1 where ename='Thomas';                                    
                                                                                      
no rows selected                              

    4. 演示数据文件状态发生多次变化且在变化时没有任何备份的恢复处理(实际上使用日志来重新构造该数据文件)      

SQL> select file#,name,enabled from v$datafile where file#=6;                      
                                                                                   
	 FILE# NAME                                          ENABLED                     
---------- --------------------------------------------- ----------                
		 6 /u01/app/oracle/oradata/orcl/tbs01.dbf        READ WRITE                    
                                                                                   
SQL> drop table scott.tb1;                                                         
                                                                                   
SQL> commit;                                                                       
                                                                                   
SQL> alter tablespace tbs1 read only;                                              
                                                                                   
SQL> alter tablespace tbs1 read write;                                             
                                                                                   
SQL> create table scott.tb2 tablespace tbs1 as select * from scott.emp;            
                                                                                   
SQL> commit;                                                                       
                                                                                   
SQL> alter system checkpoint;                                                      
                                                                                   
[oracle@oradb orcl]$tail -n 50 $ORACLE_BASE/admin/orcl/bdump/alert_orcl.log        
Errors in file /u01/app/oracle/admin/orcl/bdump/orcl_ckpt_4064.trc:                
ORA-01171: datafile 6 going offline due to error advancing checkpoint              
ORA-01122: database file 6 failed verification check                               
ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/tbs01.dbf'                   
ORA-01251: Unknown File Header Version read for file number 6                      
                                                                                   
SQL> select * from v$recover_file;                                                 
                                                                                   
	 FILE# ONLINE  ONLINE_ ERROR              CHANGE# TIME                           
---------- ------- ------- --------------- ---------- ---------                    
		 6 OFFLINE OFFLINE FILE NOT FOUND           0		                               
                                                                                   
SQL> select file#,name,status from v$datafile where file#=6;                       
                                                                                   
	 FILE# NAME                                          STATUS                      
---------- --------------------------------------------- -------                   
		 6 /u01/app/oracle/oradata/orcl/tbs01.dbf        RECOVER                       
                                                                                   
SQL> alter database create datafile 6;                                             
                                                                                   
SQL> recover datafile 6;                                                           
Media recovery complete.                                                           
                                                                                   
SQL> alter database datafile 6 online;                                             
                                                                                   
SQL> select count(1) from scott.tb2;                                               
                                                                                   
  COUNT(1)                                                                         
----------                                                                         
		16                                                                         

    5. 演示删除只读表空间上的对象     

SQL> select file#,name,enabled from v$datafile where file#=6;                       
                                                                                    
	 FILE# NAME                                          ENABLED                      
---------- --------------------------------------------- ----------                 
		 6 /u01/app/oracle/oradata/orcl/tbs01.dbf       READ ONLY                       
		                                                                                
SQL> select segment_name,segment_type,tablespace_name,owner from dba_segments where 
  2  tablespace_name='TBS1' and segment_name='TB2';                                 
                                                                                    
SEGMENT_NAME         SEGMENT_TYPE       TABLESPACE_NAME                OWNER        
-------------------- ------------------ ------------------------------ ----------   
TB2                  TABLE              TBS1                           SCOTT        
                                                                                    
SQL> drop table scott.tb2;                                                          
                                                                                    
Table dropped.                                                      

五、总结     1. 表空间置为只读后将减少数据的备份量     2. 表空间置为只读后,不能对其中的对象执行任何DML操作     3. 只读表空间内的对象可以被清除,因为drop命令更新了数据字典,而不更新对象本身     4. 当表空间的状态发生变化时,应立即备份该表空间,以减少恢复工作     5. 对于状态多次发生改变且未及时备份的情况,日志未损坏时,可以使用联机重做、归档日志来进行恢复         使用下列命令来实现:             删除受损的数据文件(rm dbfile.dbf)             重建受损的数据文件(alter database create datafile n)             进行介质恢复(recover datafile n)             使受损的数据文件联机(alter database datafile n online)     6. 演示中多为在mount状态下来恢复,生产环境中多在open状态下恢复,可以按下列步骤实现           先将受损的只读表空间(数据文件)脱机(offline)           使用备份的表空间(数据文件)来还原(restore)           使用归档、联机日志进行介质恢复(recover)           使恢复成功的表空间(数据文件)联机(online)     7. 对于原始介质受损,不能恢复到原始位置的情况下,使用下面的命令实现转移           alter database rename file '<dir1>' to '<dir2>';

六、 快捷参考

有关性能优化请参考

Oracle硬解析与软解析

共享池的调整与优化(Sharedpool Tuning)

Buffercache 的调整与优化(一)

Oracle表缓存(cachingtable)的使用

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据和云

Oracle数据库的初始化与跟踪学习方法

编辑说明:《Oracle性能优化与诊断案例精选》出版以来,收到很多读者的来信和评论,我们会通过连载的形式将书中内容公布出来,希望书中内容能够帮助到更多的读者朋友...

3889
来自专栏乐沙弥的世界

Oracle 基于用户管理恢复的处理

Oracle支持多种方式来管理数据文件的备份与恢复来保证数据库的可靠与完整。除了使用RMAN工具以及第三方备份与恢复工具之外,基于

572
来自专栏乐沙弥的世界

MySQL read_log_event(): 'Found invalid event in binary log'

    MySQL以简单易用著称,在同一个服务器上可以安装N个不同的版本,方便测试,迁移等等。此外,对于大多数Linux系统,集成了mysql,缺省会被安装。因...

872
来自专栏黑白安全

秒杀杀软的badusb

我们看过很多黑客电影,上面的黑客利用一个U盘轻松入侵到对方计算机。觉得很酷,今天我们也来做一个吧。

1.1K4
来自专栏沃趣科技

Log Miner 挖挖挖

Log Miner是Oracle自Oracle 8i以后推出的一个可以分析数据库redo log和archivelog内容的工具,可以通过日志分析所有对数据库的...

1505
来自专栏沃趣科技

删用户删表空间的操作还能flashback回来吗?

有一次在某微信群里,有人提问以下两条操作还能恢复吗?而且是在没有开归档。紧接着又有人提问数据库是否开了闪回?

1752
来自专栏杨建荣的学习笔记

系统级alias vs Oracle ADR功能(r5笔记第35天)

Oracle在11g中推出的新特性ADR,即Automatic Diagnostic Repository 个人理解这个工具就是能够高效的把一些日志文件轻松管理...

3638
来自专栏杨建荣的学习笔记

关于查看dba_data_files的一个小问题(r7笔记第72天)

今天帮一个朋友看一个pl/sql的问题,他已经钻到一个死胡同里列,可能明眼人一看就知道哪里有问题,但是当局者迷,所以我抽空看了一下这个pl/sql块。 pl/s...

3795
来自专栏CSDN技术头条

MySQL 5.7 X Plugin:流水线技术vs.并行查询技术

本文将以MySQL 5.7 X Plugin为例,对比分析流水线(pipelining)和并行查询技术。 另一篇博文《MySQL 5.7 X Plugin支持异...

3716
来自专栏乐沙弥的世界

基于同一主机配置Oracle 11g Data Guard(logical standby)

      Oracle Data Guard逻辑备库是利用主库的一个备份首先建立一个物理备库,然后再将其转换为逻辑备库。这之后主库将日志传递到备库,备库利用l...

821

扫码关注云+社区

领取腾讯云代金券