您好,欢迎来到要发发知识网。
搜索
您的当前位置:首页正文

oracle asm disk_repair_time

2023-11-13 来源:要发发知识网
oracle rac 大量扩表空间时 alert报错技术图片

原因:disk_repair_time超时导致。解决方式:rebalance之后添加failgroup。技术图片alter diskgroup ssddg add failgroup f1 disk ‘/dev/vdisk/mpath-htdgdb01-PD-s‘;alter diskgroup datadg add failgroup FG1 disk ‘/dev/vdisk/mpath-htdgdb01-Ndisk-s‘;添加后再次rebalance。

oracle asm disk_repair_time

标签:vdi   png   报错   图片   code   fail   大量   gdb   time   

小编还为您整理了以下内容,可能对您也有帮助:

Oracle数据库使用ASM存储, 结果ASM的diskgroup起不动了,报错说是: ORA-

这里可以看到Diskgroup mount到了recovering COD for group 1/0x3a2c35d6 (DG)阶段时,发现了一个逻辑坏块WARNING: cache read a corrupted block gn=1 dsk=0 blk=2817 from disk 0 NOTE: a corrupted block was mped to the trace file ERROR: cache failed to read dsk=0 blk=2817 from disk(s): 0,并因为该坏块引起了ORA-15196: invalid ASM block header [kfc.c:8281] [endian_kfbh] [2147483648] [2817] [173 != 1]。

这里2817是出错的ASM metadata的block number,173是实际从endian_kfbh位置读出的值,173!=1 这里的1是该位置理论上该有的值,由于读取到block中错误的字节序endian_kfbh信息,所以这里出现了ASM ORA-600错误。

这里recovering COD for group 1/0x3a2c35d6 (DG) 里的COD 指asm metadata file number 4 COD, Continuing Operation Directory (COD) 该metadata file 4 中记录的是在单个metadata block中无法完成的操作记录到COD中,这样当ASM instance crash时可以恢复这些操作。例如创建 删除和resize文件,这其中file number 4 blkn=1为KFBTYP_COD_RB 即回滚rollback数据,后面的数据为KFBTYP_COD_DATA。

可回滚的操作opcodes包括:

1 - Create a file

2 - Delete a file

3 - Resize a file

4 - Drop alias entry

5 - Rename alias entry

6 - Rebalance space COD

7 - Drop disks force

8 - Attribute drop

9 - Disk Resync

10 - Disk Repair Time

11 - Volume create

12 - Volume delete

13 - Attribute directory creation

14 - Set zone attributes

15 - User drop

每次ASM diskgroup 尝试mount时都会读取FILE number 4 COD中的数据来保证操作要么完成、要么回滚。

对于此类ASM file number 4 COD出现了源数据坏块的情况, 一般需要手动设置内部事件,并尝试手动Patch ASM metadata的手法才能修复。

建议遇到此类事件第一时间备份ASM disk header 100M的数据,保护现场,以便专业恢复人员介入恢复时现场不被破坏。

如果自己搞不定可以找ASKMACLEAN专业ORACLE数据库修复团队成员帮您恢复!

Oracle数据库自动存储管理(ASM)

  关于ASM的讨论很多 但是到底什么是ASM?ASM是一个有效的抽象层 使你的Oracle数据库可以与叫做diskgroups的抽象空间一起使用 而不是直接使用datafiles 这带来了很多好处 但是也要求学习一些新的概念 命令 使用和管理任务 所以在投入你的生产系统之前 看看它解决什么 管理什么 以及对它的正反面评价

  为什么创建它?

  回答这个问题的最好方式是直接追溯源头 Bill Bridge——自动存储管理的最初架构师 在Oracle Press标题中的Oracle ASM Bill提供了一个链接 他在那里讨论了使用供应商特定操作系统的文件系统来管理Oracle数据文件放置所遇到的问题

   对于归档日志和备份 操作系统供应商不提供共享磁盘文件系统

   逻辑卷管理器隐藏了文件的位置 使得很难管理磁盘I/O和提供良好的统计

   当磁盘数超过 时 现有的lvm不能工作得很好

   当数据库有 以上的数据文件时 操作系统和Oracle不能很好地处理数据库

   当有大量数据文件时命名就变得很困难了

   特性和文件系统随操作系统的不同而不同

   操作系统级的用户可以通过标准使用接触到Oracle文件 而Oracle并不知道

  所以 他通过建立Oracle自己的文件系统开始解决这些问题 他的目标是提供这些特性

   与Oracle紧密集成 并与集群一起使用(并行服务器)

   自动使用新的存储 作为磁盘单元或磁盘组来管理

   支持成千上万的磁盘

   文件不会名字 并会在操作系统中隐藏起来

  谁需要它?

  现在快速浏览一下上面那些问题和解决方案会帮助你确定谁需要ASM 起初 它是用来处理现在很大型的联机数据库 所以如果它包括你的商店 那么你可能已经在关注它了 或者开始执行ASM 如果你的数据库较小 数据文件也不多 那么你可能需要再一些理由使你考虑采用它

   你将要熟悉一些新技术 并且应该从在你的开发环境中建立它开始 并测试几个月

   如果你想从你现有的磁盘子系统中获得更高的性能 并获得更好的统计用于预测磁盘I/O

   如果你正在使用RAC 那么就需要考虑ASM了

  开始

  ASM是由一个实例管理 非常类似于Oracle数据库 但是初始参数是非常有限的 而且启动过程也简单得多

  a 将你的ORACLE_SID设置为+ASM

  b 编辑init ora

  # as opposed to RDBMS for a normal Oracle instance

  INSTANCE_TYPE=ASM

  # these names will be used in place of datafile names when you create tablespaces

  ASM_DISKGROUPS=SEAN AARON

  processes=

  # this parameter is platform specific and is the path to the raw disk device

  ASM_DISKSTRING= /dev/cciss/c d p ′

  # on g you should use diagnostic_dest instead of these

  background_mp_dest=/opt/oracle/admin/+ASM/bmp

  core_mp_dest=/opt/oracle/admin/+ASM/cmp

  user_mp_dest=/opt/oracle/admin/+ASM/ump

  c 启动ASM实例

  $ sqlplus / as sysdba

  SQL> startup

  d 创建磁盘组

  SQL> create diskgroup SEAN disk /dev/cciss/c d p ′;

  e 检查表空间的创建

  你可能会猜测 创建一个表空间会有轻微的改变 默认方法如下所示

  SQL> create tablespace sean_space datafile +SEAN size GB;

  不过想一下这个很好的特性 如果在你的数据库中init ora文件你设置参数为

  db_create_file_dest=+SEAN

  那么你可以这样做

  SQL> create tablespace sean_space;

  然后让Oracle做其余的工作 在这两种情形下 你将发现在v$datafile中列出的文件路径是和抽象的+SEAN 磁盘组有关 而不是与一个实际的操作系统数据文件

  f 更多的

  当然简化文件名称和表空间的创建只是ASM可以为你做的工作的冰山一角 它还可以提供一个冗余级别

  在数据库方面 外部冗余能力主要是当你在硬件级别(RAID)上或Oracle可以看到的其它外部方法中具有冗余 换句话说 如果a *** _diskstring设备是它们自己的逻辑 隐藏物理磁盘于一些冗余的硬件层后面 那么你就会有外部冗余能力

  但是 如果你没有这个冗余能力 那么ASM可以提供 你可以指定冗余 失败组和一组其它的选项来防止损失一个或多个磁盘 控制器或甚至是整个SAM失效 ASM还提供了在磁盘组中均匀分布的I/O 因为ASM很好的了解背后发生了什么 所以Oracle可以自动的为你提供I/O到磁盘的一个更好的平衡

  使用ASM遇到的挑战

  ASM当然是一个具有很大潜能的强大技术 但是对于每一个技术解决方案 都会有很多的挑战 对于ASM 它潜在地破坏了Unix系统管理组和数据库/数据库管理员组间力量的普通平衡 以前的组管理磁盘 硬件和操作系统级别 使数据库管理员与它们协作获取新的资源 这将在某种程度上挑战这个平衡 而这会引起一些来自于这个组的阻力

  最后 应该是业务需求促使了它的采用 还要注意到ASM仍然是处于企业计算认识阶段 相对还比较新 有一些供应商他们的核心业务已经放在逻辑空间管理器/文件系统空间中很多年了 一般来说 对于软件系统和可靠性来说成熟是很重要的

  总结

lishixin/Article/program/Oracle/201311/16542

如何判断 oracle 使用 asm

正好刚整理了一个这方面的资料,先贴给你吧.
准备ASM环境
ASM使用一个名叫“+ASM”的数据库实例来管理ASM磁盘,因此在配置ASM磁盘之前,需要先启动ASM实例。另外还需要注意,ASM 实例必须要先于数据库实例启动,和数据库实例同步运行,迟于数据库实例关闭。ASM 实例的创建和删除可以用DBCA 工具来操作。在DBCA的第一个界面选择配置自动存储管理就可以进入ASM配置的界面。
根据提示运行脚本就可以配置和启动CSS(Cluster Synchronization Service)了,注意要以root的身份运行这个脚本,运行情况如下:
# /u01/app/oracle/proct/10.2.0/db_1/bin/localconfig add
/etc/oracle does not exist. Creating it now.
Successfully accumulated necessary OCR keys.
Creating OCR keys for user 'root', privgrp 'root'..
Operation successful.
Configuration for local CSS has been initialized
Adding to inittab
Startup will be queued to init within 90 seconds.
Checking the status of new Oracle init process...
Expecting the CRS daemons to be up within 600 seconds.
CSS is active on these nodes.
s1
CSS is active on all nodes.
Oracle CSS service is installed and running under init(1M)
ASM可以使用裸设备或者ASMLib方式, 因为裸设备的维护更罗嗦一些,本文只讨论ASMLib方式。为了在Linux系统中使用ASMLib方式准备ASM磁盘,需要安装相关的软件,下载链接如下:

下载时注意选择自己的操作系统和内核的版本,我下载到的是以下三个软件:
oracleasm-2.6.18-164.el5-2.0.5-1.el5.i686.rpm
oracleasmlib-2.0.4-1.el5.i386.rpm
oracleasm-support-2.1.4-1.el5.i386.rpm
这里特别需要注意第一个软件要和你的Linux内核的版本一致。(其实我的内核版本是2.6.18-155.el5,但是在官方网站找不到完全对应的版本,只好使用这个2.6.18-164.el5的版本了,后面会讲怎么解决这个问题。)接下来进行软件的安装,只需要使用rpm命令即可。

# rpm -ivh oracleasm*
现在安装oracleasm模块可能会报错,像我因为没有找到对应我的内核版本的oracleasm软件就遇到了这个问题。经过一番查找,发现软件将oracleasm的模块文件oracleasm.ko安装到了目录/lib/moles/2.6.18-164.el5/kernel/drivers/addon/oracleasm中,而我的默认的模块文件路径应该是/lib/moles/2.6.18-155.el5,因此决定手工建立相关的目录和文件。
# mkdir -p /lib/moles/2.6.18-155.el5/kernel/drivers/addon/oracleasm
# cp oracleasm.ko /lib/moles/2.6.18-155.el5/kernel/drivers/addon/oracleasm
然后再安装oracleasm的模块文件就可以通过了:
# depmod -a
# modprobe oracleasm
最后进行oracleasm服务的初始配置
# service oracleasm configure
Configuring the Oracle ASM library driver.
This will configure the on-boot properties of the Oracle ASM library
driver. The following questions will determine whether the driver is
loaded on boot and what permissions it will have. The current values
will be shown in brackets ('[]'). Hitting <ENTER> without typing an
answer will keep that current value. Ctrl-C will abort.
Default user to own the driver interface []: oracle
Default group to own the driver interface []: dba
Start Oracle ASM library driver on boot (y/n) [n]: y
Scan for Oracle ASM disks on boot (y/n) [y]:
Writing Oracle ASM library driver configuration: done
Initializing the Oracle ASMLib driver: [ OK ]
Scanning the system for Oracle ASMLib disks: [ OK ]
好了,现在已经有了初步的ASM配置环境,接下来就可以准备磁盘了。
添加ASM磁盘组
为了实现ASM的磁盘负载均衡和冗余能力,我准备使用四个磁盘建立ASM的磁盘组,因此需要为Linux系统添加四个磁盘。为了搭建这个环境,我使用的是VMware环境,因此添加磁盘就非常容易了。只需要在VMware的设置中选择添加硬件即可,而且现在的VMware版本是可以支持磁盘的热插拔的。无需关闭Linux系统,直接添加磁盘即可。添加完四个磁盘之后,为了让Linux系统马上识别这几个磁盘,可以运行如下命令:
# echo 'scsi add-single-device 0 0 1 0' > /proc/scsi/scsi
# echo 'scsi add-single-device 0 0 2 0' > /proc/scsi/scsi
# echo 'scsi add-single-device 0 0 3 0' > /proc/scsi/scsi
# echo 'scsi add-single-device 0 0 4 0' > /proc/scsi/scsi
运行fdisk -l命令可以看到系统中增加了/dev/sdb、/dev/sdc、/dev/sdd、/dev/sde四个磁盘。使用fdisk工具在这个四个磁盘上各建立一个分区(具体步骤略,不熟悉的可以查阅Linux的fdisk命令用法)。
然后运行oracleasm createdisk命令添加ASM磁盘:
# oracleasm createdisk VOL1 /dev/sdb1
Writing disk header: done
Instantiating disk: done
依次添加/dev/sdb1、/dev/sdc1、/dev/sdd1、/dev/sde1四个磁盘分区,完成后检查如下:
# oracleasm listdisks
VOL1
VOL2
VOL3
VOL4
这时运行DBCA工具的ASM配置向导就可以建立ASM磁盘组了。进入DBCA向导后,选择“Configure Automatic Storage Management”,然后单击“Create New”按钮,可以看到ASM磁盘组的配置界面。输入磁盘组的名称,如“dg1”,关于冗余级别,我选择了Norma,并且将VOL1和VOL2设置为一个Failure Group,而VOL3和VOL4设置为一个Failure Group。
以上操作也可以使用sqlplus连接到ASM实例上,使用命令完成。
为了连接到ASM实例上,首先需要设置ORACLE_SID环境变量,然后再使用sqlplus进行连接:

# ORACLE_SID=+ASM
# sqlplus / as sysdba
创建Disk Group的语句如下:
SQL> create diskgroup dg1 normal rendancy
failgroup fg1 disk 'ORCL:VOL1','ORCL:VOL2'
failgroup fg2 disk 'ORCL:VOL3','ORCL:VOL4';
至此,ASM磁盘组的准备已经完成,终于可以在ASM上建立数据库了。还是使用DBCA工具,选择“Create Database”进入创建数据库的向导。按照向导操作,只是在选择存储机制时,选择ASM类型。

如何判断 oracle 使用 asm

正好刚整理了一个这方面的资料,先贴给你吧.
准备ASM环境
ASM使用一个名叫“+ASM”的数据库实例来管理ASM磁盘,因此在配置ASM磁盘之前,需要先启动ASM实例。另外还需要注意,ASM 实例必须要先于数据库实例启动,和数据库实例同步运行,迟于数据库实例关闭。ASM 实例的创建和删除可以用DBCA 工具来操作。在DBCA的第一个界面选择配置自动存储管理就可以进入ASM配置的界面。
根据提示运行脚本就可以配置和启动CSS(Cluster Synchronization Service)了,注意要以root的身份运行这个脚本,运行情况如下:
# /u01/app/oracle/proct/10.2.0/db_1/bin/localconfig add
/etc/oracle does not exist. Creating it now.
Successfully accumulated necessary OCR keys.
Creating OCR keys for user 'root', privgrp 'root'..
Operation successful.
Configuration for local CSS has been initialized
Adding to inittab
Startup will be queued to init within 90 seconds.
Checking the status of new Oracle init process...
Expecting the CRS daemons to be up within 600 seconds.
CSS is active on these nodes.
s1
CSS is active on all nodes.
Oracle CSS service is installed and running under init(1M)
ASM可以使用裸设备或者ASMLib方式, 因为裸设备的维护更罗嗦一些,本文只讨论ASMLib方式。为了在Linux系统中使用ASMLib方式准备ASM磁盘,需要安装相关的软件,下载链接如下:

下载时注意选择自己的操作系统和内核的版本,我下载到的是以下三个软件:
oracleasm-2.6.18-164.el5-2.0.5-1.el5.i686.rpm
oracleasmlib-2.0.4-1.el5.i386.rpm
oracleasm-support-2.1.4-1.el5.i386.rpm
这里特别需要注意第一个软件要和你的Linux内核的版本一致。(其实我的内核版本是2.6.18-155.el5,但是在官方网站找不到完全对应的版本,只好使用这个2.6.18-164.el5的版本了,后面会讲怎么解决这个问题。)接下来进行软件的安装,只需要使用rpm命令即可。

# rpm -ivh oracleasm*
现在安装oracleasm模块可能会报错,像我因为没有找到对应我的内核版本的oracleasm软件就遇到了这个问题。经过一番查找,发现软件将oracleasm的模块文件oracleasm.ko安装到了目录/lib/moles/2.6.18-164.el5/kernel/drivers/addon/oracleasm中,而我的默认的模块文件路径应该是/lib/moles/2.6.18-155.el5,因此决定手工建立相关的目录和文件。
# mkdir -p /lib/moles/2.6.18-155.el5/kernel/drivers/addon/oracleasm
# cp oracleasm.ko /lib/moles/2.6.18-155.el5/kernel/drivers/addon/oracleasm
然后再安装oracleasm的模块文件就可以通过了:
# depmod -a
# modprobe oracleasm
最后进行oracleasm服务的初始配置
# service oracleasm configure
Configuring the Oracle ASM library driver.
This will configure the on-boot properties of the Oracle ASM library
driver. The following questions will determine whether the driver is
loaded on boot and what permissions it will have. The current values
will be shown in brackets ('[]'). Hitting <ENTER> without typing an
answer will keep that current value. Ctrl-C will abort.
Default user to own the driver interface []: oracle
Default group to own the driver interface []: dba
Start Oracle ASM library driver on boot (y/n) [n]: y
Scan for Oracle ASM disks on boot (y/n) [y]:
Writing Oracle ASM library driver configuration: done
Initializing the Oracle ASMLib driver: [ OK ]
Scanning the system for Oracle ASMLib disks: [ OK ]
好了,现在已经有了初步的ASM配置环境,接下来就可以准备磁盘了。
添加ASM磁盘组
为了实现ASM的磁盘负载均衡和冗余能力,我准备使用四个磁盘建立ASM的磁盘组,因此需要为Linux系统添加四个磁盘。为了搭建这个环境,我使用的是VMware环境,因此添加磁盘就非常容易了。只需要在VMware的设置中选择添加硬件即可,而且现在的VMware版本是可以支持磁盘的热插拔的。无需关闭Linux系统,直接添加磁盘即可。添加完四个磁盘之后,为了让Linux系统马上识别这几个磁盘,可以运行如下命令:
# echo 'scsi add-single-device 0 0 1 0' > /proc/scsi/scsi
# echo 'scsi add-single-device 0 0 2 0' > /proc/scsi/scsi
# echo 'scsi add-single-device 0 0 3 0' > /proc/scsi/scsi
# echo 'scsi add-single-device 0 0 4 0' > /proc/scsi/scsi
运行fdisk -l命令可以看到系统中增加了/dev/sdb、/dev/sdc、/dev/sdd、/dev/sde四个磁盘。使用fdisk工具在这个四个磁盘上各建立一个分区(具体步骤略,不熟悉的可以查阅Linux的fdisk命令用法)。
然后运行oracleasm createdisk命令添加ASM磁盘:
# oracleasm createdisk VOL1 /dev/sdb1
Writing disk header: done
Instantiating disk: done
依次添加/dev/sdb1、/dev/sdc1、/dev/sdd1、/dev/sde1四个磁盘分区,完成后检查如下:
# oracleasm listdisks
VOL1
VOL2
VOL3
VOL4
这时运行DBCA工具的ASM配置向导就可以建立ASM磁盘组了。进入DBCA向导后,选择“Configure Automatic Storage Management”,然后单击“Create New”按钮,可以看到ASM磁盘组的配置界面。输入磁盘组的名称,如“dg1”,关于冗余级别,我选择了Norma,并且将VOL1和VOL2设置为一个Failure Group,而VOL3和VOL4设置为一个Failure Group。
以上操作也可以使用sqlplus连接到ASM实例上,使用命令完成。
为了连接到ASM实例上,首先需要设置ORACLE_SID环境变量,然后再使用sqlplus进行连接:

# ORACLE_SID=+ASM
# sqlplus / as sysdba
创建Disk Group的语句如下:
SQL> create diskgroup dg1 normal rendancy
failgroup fg1 disk 'ORCL:VOL1','ORCL:VOL2'
failgroup fg2 disk 'ORCL:VOL3','ORCL:VOL4';
至此,ASM磁盘组的准备已经完成,终于可以在ASM上建立数据库了。还是使用DBCA工具,选择“Create Database”进入创建数据库的向导。按照向导操作,只是在选择存储机制时,选择ASM类型。

怎么修复数据库 修复数据库坏块方法

修复数据库坏块

dbv

你也可以用dbv工具看一下你现在其他的数据文件有没有还有坏块的

dbv file='yourfilename'

恢复方法:

当Oracle数据库出现坏块时,Oracle会在警告日志文件(alert_SID.log)中记录坏块的信息:

ORA-01578: ORACLE data block corrupted (file # 7, block # )

ORA-01110: data file : '/oracle1/oradata/V920/oradata/V816/users01.dbf'

其中,<AFN>代表坏块所在数据文件的绝对文件号,代表坏块是数据文件上的第几个数据块

出现这种情况时,应该首先检查是否是硬件及操作系统上的故障导致Oracle数据库出现坏块。在排除了数据库以外的原因后,再对发生坏块的数据库对象进行处理。

1.确定发生坏块的数据库对象

SELECT tablespace_name,

segment_type,

owner,

segment_name

FROM dba_extents

WHERE file_id =

AND between block_id AND block_id+blocks-1;

2.决定修复方法

如果发生坏块的对象是一个索引,那么可以直接把索引DROP掉后,再根据表里的记录进行重建;

如果发生坏块的表的记录可以根据其它表的记录生成的话,那么可以直接把这个表DROP掉后重建;

如果有数据库的备份,则恢复数据库的方法来进行修复;

如果表里的记录没有其它办法恢复,那么坏块上的记录就丢失了,只能把表中其它数据坏上的记录取出来,然后对这个表进行重建。

3.用Oracle提供的DBMS_REPAIR包标记出坏块

exec DBMS_REPAIR.SKIP_CORRUPT_BLOCKS('','');

4.使用Create table as select命令将表中其它块上的记录保存到另一张表上

create table corrupt_table_bak

as

select * from corrupt_table;

5.用DROP TABLE命令删除有坏块的表

drop table corrupt_table;

6.用alter table rename命令恢复原来的表

alter table corrupt_table_bak

rename to corrupt_table;

7.如果表上存在索引,则要重建表上的索引

PART2

2014.7.22研究恢复数据库坏块:

Oracle调用标准C的系统函数,对数据块进行读写操作,因此,坏块是有可能由以下几种原因产生:

硬件的I/O错误

操作系统的I/O错误或缓冲问题

内存或paging问题

磁盘修复工具

一个数据文件的一部分正在被覆盖

Oracle试图访问一个未被格式化的系统块失败

数据文件部分溢出

Oracle或者操作系统的bug

遇到“ORA-01578:ORACLE data block corrupted”错误

处理方法:1.rman的recover命令可以在数据库保持open状态下只恢复受损的数据块

2.如果没有备份,万不得已之下也可以采用DBMS_REPAIR包的存储过程将受损坏块隔离,同时尽可能地挽救部分数据。

rman backup命令也是检查坏数据块的好工具 一旦读取ORA-19566 即可有问题

此时可用backup validate tablespace user观察详细的信息,可查看到坏块数与跟踪文件

grep‘corrupt’/u01/app/oracle/diag/rdbms/br/br/trace/**.trc

恢复数据块:rman》recover datafile 5 block 203;

批量恢复受损的数据块:recover corruption list;

数据块坏块一号坏块,需要做:

run{

sql 'alter database datafile 5 offline';

restore datafile 5;

recover datafile 5;

sql'alter database datafile 5 online'

}

使用exp/imp恢复

在这种情况下肯定会造成数据的丢失,在这种情况下应采取将数据导出然后重建表再进行导入的方法,来尽量恢复损坏数据块中的数据,但是在有坏块的情况下是不允许导出的,如下命令:Exp test/test file=t.dmp tables=t;

导出命令在执行中会报ORA-01578错误,在这错误提示中会提示那个文件号的文件以及这个文件中的哪个块被损坏,如:ORA—01578:ORACLE 数据块损坏(文件号 4,块号 35)

针对以上的提示首先查询那些对象被损坏:

Select tablespace_name,segment_type,owner,segment_name From dba_extents Where file_id=4 and 35 between block_id and block_id+blocks-1;

如果被损坏的块是索引,通常可以通过索引重建来解决,如果损坏的是数据(segment_type为table),那么通过设置如下内部事件使得Exp操作跳过坏块。

Alter session set events=’10231 trace name context forever,level 10’;

然后重新执行导出命令,导出相关的表,然后执行Drop Table命令删除相关表,之后重建表最后导入数据。

使用DBMS_REPAIR恢复

用DBMS_REPAIR当然也会丢失数据。这里不做详细的介绍,有兴趣的可以查看oracle的在线文

3、使用dbms_repair包进行坏块处理

1)首先建立repair_table,用于存放dbms_repair.check_object检测出来的坏块信息

SQL> declare

2begin

3dbms_repair.admin_tables

4(table_name => 'REPAIR_TABLE',--表名

5table_type => dbms_repair.repair_table,

6action => dbms_repair.create_action,

7tablespace => 'USERS');--用于指定该表存放的表空间

8end;

9/

PL/SQL 过程已成功完成。

SQL> col owner format a10

SQL> col object_name format a20

SQL> col object_type format a20

SQL> select owner, object_name, object_type

2from dba_objects

3where object_name like '%REPAIR_TABLE';

OWNEROBJECT_NAMEOBJECT_TYPE

---------- -------------------- --------------------

SYSREPAIR_TABLETABLE

SYSDBA_REPAIR_TABLEVIEW

Oracle自动创建了一个DBA_REPAIR_TABLE视图。

2)使用dbms_repair.check_object进行坏块检测

SQL> set serveroutput on size 100000;

SQL> declare

2rpr_count int;

3begin

4rpr_count := 0;

5dbms_repair.check_object(

6schema_name => 'SYS',--指定对象模式,也就是对象的所有者

7object_name => 'TEST',--指定对象名,也就是表名

8repair_table_name => 'REPAIR_TABLE',

9corrupt_count => rpr_count);

10dbms_output.put_line('repair block count: '

11||to_char(rpr_count));

12end;

13/

repair block count: 4

PL/SQL 过程已成功完成。

SQL> select object_name, block_id, corrupt_type, marked_corrupt,

2corrupt_description, repair_description

3from repair_table;

OBJECT_NAMEBLOCK_ID CORRUPT_TYPE MARKED_COR

-------------------- ---------- ------------ ----------

CORRUPT_DESCRIPTION

-------------------------------------------------------------------------------

REPAIR_DESCRIPTION

-------------------------------------------------------------------------------

TEST196148 TRUE

mark block software corrupt

TEST206148 TRUE

mark block software corrupt

TEST236148 TRUE

mark block software corrupt

TEST316148 TRUE

mark block software corrupt

通过运行dbms_repair.check_object,将坏块信息存放到了repair_table表中,其中有个字段marked_corrupt,用于标识该块是否被标识为坏块,当被标识为true时,即该块被标识为坏块。其中这一步跟oracle文档中的描述有点进入,根据oracle文档,当执行完dbms_repair.check_object时,并不会进行坏块标识,也就是marked_corrupt列的值应该为false,而只有当执行dbms_repair.fix_corrupt_blocks过程后才会进行坏块标识。

3)使用dbms_repair.fix_corrupt_blocks进行坏块标识

SQL> declare

2fix_block_count int;

3begin

4fix_block_count := 0;

5dbms_repair.fix_corrupt_blocks (

6schema_name => 'SYS',

7object_name => 'TEST',

8object_type => dbms_repair.table_object,

9repair_table_name => 'REPAIR_TABLE',

10fix_count => fix_block_count);

11dbms_output.put_line('fix blocks count: ' ||

12to_char(fix_block_count));

13end;

14/

fix blocks count: 0

PL/SQL 过程已成功完成。

我们可以见到到fix blocks count=0,即在上一步进行check_object时已经进行了坏块标识了,这一步其实可以省略。(不过没有测试过!)

当ORACLE归档日志满后如何正确删除归档日志

1,首先删除归档日志物理文件,归档日志一般都是位于archive目录下,AIX系统下文件格式为“1_17884_667758186.dbf”,建议操作前先对数据库进行备份,删除时至少保留最近几天的日志用于数据库恢复。

2,把归档日志的物理文件删除后,我们就可以正常登入ORACLE了,但是还没完全把归档日志删除干净,ORACLE的controlfile中仍然记录着这些archivelog的信息,在oracle的OEM管理器中有可视化的日志展现出,当我们手工清除archive目录下的文件后,这些记录并没有被我们从controlfile中清除掉,接下去我们要做的就是这个工作。

利用RMAN进行删除操作,操作步骤如下:(window客户端系统为例):

1.指定数据库实例

C:/Documents and Settings/Administrator>SET ORACLE_SID =orcl

2.连接数据库

C:/Documents and Settings/Administrator>RMAN TARGET SYS/sysadmin@orcl

3.查看归档日志的状态

RMAN> list archivelog all;

4.手工删除归档日志文件

RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';

5.退出rman.

Copyright © 2019- net188.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务