惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Hackread – Cybersecurity News, Data Breaches, AI and More
G
Google Developers Blog
The GitHub Blog
The GitHub Blog
Jina AI
Jina AI
A
About on SuperTechFans
MongoDB | Blog
MongoDB | Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园_首页
Blog — PlanetScale
Blog — PlanetScale
酷 壳 – CoolShell
酷 壳 – CoolShell
Google DeepMind News
Google DeepMind News
D
DataBreaches.Net
B
Blog RSS Feed
大猫的无限游戏
大猫的无限游戏
美团技术团队
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
L
LangChain Blog
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
腾讯CDC
Hugging Face - Blog
Hugging Face - Blog
阮一峰的网络日志
阮一峰的网络日志
H
Help Net Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

博客园 - 一江水

什么时候使用绑定变量性能反而更差 模拟登录新浪微博(Python) Oracle ASM 详解 物化视图日志没有清除 Oracle如何根据物化视图日志快速刷新物化视图 物化视图注册信息的清除 Oracle RAC 碰到 gc buffer busy Oracle RAC 常用维护工具和命令 RAC Debug开关修改工具 Java连接Sybase ASE数据库的一个简单例子 中文图解Python脚本 解决sybase中文以及大小写问题(服务器端)(utf8 乱码) 如何使Sybase ASE中对象名不区分大小写? 使用 Oracle 数据库 10g内部的 ETL 基础架构 Oracle代理用户(Proxy User) Android系统手机端抓包方法 RAC中如何更改对外网卡和内部互联网卡的IP及VIP ORA-12545: 因目标主机或对象不存在, 连接失败 Oracle数据块损坏恢复总结[转]
Oracle OS Block Header
一江水 · 2012-12-12 · via 博客园 - 一江水

oracle文件的第一个块(block 0)是OS block header,在数据库中查询不到信息,记录的是OS信息,以及文件大小的等信息:

SQL> select file_name,bytes from dba_data_files;
 
FILE_NAME                                               BYTES
-------------------------------------------------- ----------
/u01/app/oracle/oradata/PROD/user01.dbf              67108864
 
$ls -lrt
total 1390268
-rw-r-----  1 oracle oinstall  67117056 Apr 12 09:31 user01.dbf


从上面可以看出,OS上的大小比数据库里的大小多了一个BLOCK。

如果OS block header损坏,并不影响数据库打开、使用,但重建控制文件时会报错,用dbverify/rman也检测不到坏块,不过可以使用dbfsize来查看:
正常状态:

$dbfsize user01.dbf
 
Database file: user01.dbf
Database file type: file system
Database file size: 8192 8192 byte blocks

损坏:

$dbfsize user01.dbf
user01.dbf: Header block magic number is bad

编缉BLOCK 0,模拟损坏,可以正常启动、使用:

SQL> startup;
ORACLE instance started.
 
Total System Global Area  184549376 bytes
Fixed Size                  1266488 bytes
Variable Size             100666568 bytes
Database Buffers           79691776 bytes
Redo Buffers                2924544 bytes
Database mounted.
ORA-01113: file 4 needs media recovery
ORA-01110: data file 4: '/u01/app/oracle/oradata/PROD/user01.dbf'
 
 
SQL> recover datafile 4;  
Media recovery complete.
SQL> alter database open;
 
Database altered.
 
SQL> create table test01 tablespace USERS as select * from dba_objects;
 
Table created.

用dbv检查,未发现坏块:

$dbv file=user01.dbf
 
DBVERIFY: Release 10.2.0.4.0 - Production on Mon Apr 16 16:38:33 2012
 
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
 
DBVERIFY - Verification starting : FILE = user01.dbf
 
 
DBVERIFY - Verification complete
 
Total Pages Examined         : 8192
Total Pages Processed (Data) : 357
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 0
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 11
Total Pages Processed (Seg)  : 0
Total Pages Failing   (Seg)  : 0
Total Pages Empty            : 7824
Total Pages Marked Corrupt   : 0
Total Pages Influx           : 0
Highest block SCN            : 336969 (0.336969)

用dbfsize检查,报错:

$dbfsize user01.dbf
user01.dbf: Header block magic number is bad

如果重建控制文件,则会报错:

SQL> startup nomount;
ORACLE instance started.
 
Total System Global Area  184549376 bytes
Fixed Size                  1266488 bytes
Variable Size             100666568 bytes
Database Buffers           79691776 bytes
Redo Buffers                2924544 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "PROD" NORESETLOGS  ARCHIVELOG
  2      MAXLOGFILES 5
  3      MAXLOGMEMBERS 5
  4      MAXDATAFILES 100
  5      MAXINSTANCES 2
  6      MAXLOGHISTORY 292
  7  LOGFILE
  8    GROUP 1 (
  9      '/u01/app/oracle/oradata/PROD/REDO1_1.log',
 10      '/u01/app/oracle/oradata/PROD/REDO1_2.log',
 11      '/u01/app/oracle/oradata/PROD/REDO1_3.log'
 12    ) SIZE 100M,
 13    GROUP 2 (
 14      '/u01/app/oracle/oradata/PROD/REDO2_1.log',
 15      '/u01/app/oracle/oradata/PROD/REDO2_2.log',
 16      '/u01/app/oracle/oradata/PROD/REDO2_3.log'
 17    ) SIZE 100M
 18  -- STANDBY LOGFILE
 19  DATAFILE
 20    '/u01/app/oracle/oradata/PROD/SYSTEM01.dbf',
 21    '/u01/app/oracle/oradata/PROD/undotbs01.dbf',
 22    '/u01/app/oracle/oradata/PROD/SYSAUX01.dbf',
 23    '/u01/app/oracle/oradata/PROD/user01.dbf'
 24  CHARACTER SET AL32UTF8
 25  ;
CREATE CONTROLFILE REUSE DATABASE "PROD" NORESETLOGS  ARCHIVELOG
*
ERROR at line 1:
ORA-01503: CREATE CONTROLFILE failed
ORA-01565: error in identifying file '/u01/app/oracle/oradata/PROD/user01.dbf'
ORA-27047: unable to read the header block of file
Additional information: 2

报ORA-27047错误。这里可以在数据库打开状态下,resize datafile,这样就可以重写OS block header信息:

SQL> alter database open;
 
Database altered.
 
SQL> alter database datafile '/u01/app/oracle/oradata/PROD/user01.dbf' resize 65M;
 
Database altered.
 
SQL> select file_name,bytes from dba_data_files;
 
FILE_NAME                                               BYTES
-------------------------------------------------- ----------
/u01/app/oracle/oradata/PROD/user01.dbf              68157440

dbfsize检查正常,重建控制文件正常:

$dbfsize user01.dbf
 
Database file: user01.dbf
Database file type: file system
Database file size: 8320 8192 byte blocks
 
SQL> CREATE CONTROLFILE REUSE DATABASE "PROD" NORESETLOGS  ARCHIVELOG
  2      MAXLOGFILES 5
  3      MAXLOGMEMBERS 5
  4      MAXDATAFILES 100
  5      MAXINSTANCES 2
  6      MAXLOGHISTORY 292
  7  LOGFILE
  8    GROUP 1 (
  9      '/u01/app/oracle/oradata/PROD/REDO1_1.log',
 10      '/u01/app/oracle/oradata/PROD/REDO1_2.log',
 11      '/u01/app/oracle/oradata/PROD/REDO1_3.log'
 12    ) SIZE 100M,
 13    GROUP 2 (
 14      '/u01/app/oracle/oradata/PROD/REDO2_1.log',
 15      '/u01/app/oracle/oradata/PROD/REDO2_2.log',
 16      '/u01/app/oracle/oradata/PROD/REDO2_3.log'
 17    ) SIZE 100M
 18  -- STANDBY LOGFILE
 19  DATAFILE
 20    '/u01/app/oracle/oradata/PROD/SYSTEM01.dbf',
 21    '/u01/app/oracle/oradata/PROD/undotbs01.dbf',
 22    '/u01/app/oracle/oradata/PROD/SYSAUX01.dbf',
 23    '/u01/app/oracle/oradata/PROD/user01.dbf'
 24  CHARACTER SET AL32UTF8
 25  ;
 
Control file created.
 
SQL> alter database open;
 
Database altered.

注:resize 原大小,重建还是报错,需要resize一个不同的大小。