各种操作系统裸设备dd命令,以及ora-01200错误的分析

各种操作系统裸设备dd命令

很多oracle 环境都适用的是裸设备环境,常常需要适用dd命令备份裸设备。

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

系统保留块如下

unix    OS Reserved Size

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

SUN Solaris    0

HP-UX          0

Linux          0

IBM AIX        4K

Tru64 UNIX     64k

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

dd 命令:

1.if=file         :输入文件名,缺省为标准输入。即指定源文件。<if=inputfile>

3.ibs=bytes       :一次读入bytes个字节,即指定一个块大小为bytes个字节。

obs=bytes         :一次输出bytes个字节,即指定一个块大小为bytes个字节。

bs=bytes          :同时设置读入/输出的块大小为bytes个字节。

4.cbs=bytes       :一次转换bytes个字节,即指定转换缓冲区大小。

5.skip=blocks     :从输入文件开头跳过blocks个块后再开始复制。

6.seek=blocks     :从输出文件开头跳过blocks个块后再开始复制。

注意:通常只用当输出文件是磁盘或磁带时才有效,即备份到磁盘或磁带时才有效。

7.count=blocks    :仅拷贝blocks个块,块大小等于ibs指定的字节数。

8.conv=conversion :用指定的参数转换文件。

ascii:转换ebcdic为ascii

ebcdic:转换ascii为ebcdic

ibm:转换ascii为alternateebcdic

block:把每一行转换为长度为cbs,不足部分用空格填充

unblock:使每一行的长度都为cbs,不足部分用空格填充

lcase:把大写字符转换为小写字符

ucase:把小写字符转换为大写字符

swab:交换输入的每对字节

noerror:出错时不停止

notrunc:不截短输出文件

sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。

例如: dd 出来裸设备上的数据文件

dd if=/app/oracle/testdb/system01.dbf f=/backup/testbk/system01.dbf bs=8k

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

ora-01200错误:

ora-01200:文件的真实大小比控制文件和数据文件头记录的小,一般是数据库异常导致的,在数据库的运行过程中,重新启动时,文件resize之后出现异常状况时都可能会遇到。推荐的解决方案是从备份中恢复一个完好的拷贝,执行必要的恢复,使数据库恢复到正常的状态。

问题的发现

备份失败,提示如下:

allocated channel:ch00

channel ch00:sid=32 devtype=SBT_TAPE

channel choo:Veritas NetBackup for Oracle - Release 6.5

sent command to channel:ch00

Starting backup at 24-MAR-09

channel ch00:starting incremental level 0 datafile backupset

channel ch00:specifying datafile(s) in backupset

input datafile fno=00079 name=/dev/rpub_pind1_12

input datafile fno=00090 name=/dev/rpub_ping2_13

channel ch01:starting piece 1 at 24-MAR-09

including current SPFILE in backupset

including current controlfile in backupset

input datafile fno=00044 name=/dev/rpub_pdata2_06

input datafile fno=00063 name=/dev/rpub_plob2_05

released channel:ch00

RMAN-00571==============

RMAN-00569==============

RMAN-00571==============

RMAN-03009:failure of backup command on ch00 channel at 03/24/2009 00:06:42

ORA-01122:database file 59 failed verification check

ORA-01110:data file 59:‘/dev/rpub_plob2_01‘

ORA-01200:actual file size of 327678 is smaller than corrent size of 655104 blocks

这里提示 文件59大小异常,文件实际大小为327678个数据块,而控制文件记录的当前大小为655104,两者不一致,导致rman异常退出,备份失败。

如果为了使rman暂时能够跳过这个错误,可以在rman中设置备份时跳过这个出现错误的表空间,在常规rman备份时,

也可以通过exclude命令来排除某些表空间:

rman target /

Recovery Manager: Release 9.2.0.7.0 - 64bit Production

Copyriht (c) 1995,2002,Oracle Corporation. All rights reserced.

connected to target database:OS(DBID=658484424)

RMAN>configure exclude for tablespace PUB_PLOB2_01;

using target database controlfile instead of recovery catalog tablespace PUB_PLOB2_01 will be excluded from future whole database backups

new RMAN configuration parameters are successfully stored

检查告警日志文件,可以找到离线文件的相关信息,其实初始创建大小为126MB,创建时间等如下代码:

Wed Nov 16 09:00:44 2005

create tablespace pub_plob2_01 datafile ‘/dev/rpub_plob2_01‘ size 126m segment space management auto

Wed Nov 16 09:00:45 2005

Completed:created tablespace pub_plob2_01 datafile ‘/dev/rpub.......

而数据文件离线的具体出错时间及详细信息如下:

Mon Mar 9 16:41:04 2009

Errors in file /opt/prod/admin/ds/bdump/ds2_ckpt_827498.trc:

ORA-01171:datafile 59 going offline due to error advancing checkpoint

ORA-01122:database file 59 failed verification check

ORA-01110:data file 59:‘/dev/rpub_plob2_01‘

ORA-01200:actual file size of 327678 is smaller than correct size of 655104 blocks

检查点进程在增加表空间时,发现了该文件的错误,并将该文件离线,CKPT进程跟踪文件记录如下:

Oracle9i Enterprise Edition Release 9.2.0.7.0-64bit Production

With the Partitioning and Real Application Clusters options

JServer Release 9.2.0.7.0-Production

ORACLE_HOME=/opt/prod/ora92

System name:AIX

Node name:oracle2

Release:1

Version:5

Machine:0007D76F4C00

Instance name:ds2

Redo thread mounted by this instance:2

Oracle process number:10

Unix process pid:827498,image:[email protected](CKPT)

****2009-03-09......

****SESSION ID:(11.1) 2008.....

ORA-01171:datafile 59 going offline dure to error advancing checkpoint

ORA-01122:database file 59 failed verification check

ORA-01110:data file 59:‘/dev/rpub_plob2_01‘

ORA-01200:actual file size of 327678 is smaller than correct size of 655104 blocks

处理过程记录:

通过V$RECOVER_FILE 查看需要恢复的文件

SQL> select * from V$RECOVER_FILE ;

--查看总块大小

select A.FILE#,A.NAME,A.BLOCKS,A.BYTES/1024/1024 from v$datafile a where A.FILE#=59

物理设备确认:

lapv -l XXvg

执行恢复:

在系统中使用mklv创建分配一个新的逻辑卷

mklv -y recvr_plob2_01 -T O -w n -s n -r n -t raw datavg 6000M

----两个节点都执行

chown oracle:oinstall /dev/rrecvr_plob2_01

接下来使用dd 命令将数据文件转存到文件系统中。使用dd命令时候要注意,由于在不同的OS中裸设备文件头可能预留有系统保留块。

所以我们在使用dd命令时候需要跳过该系统保留块。避免破坏系统。

我们可以通过语句 BLOCK1_OFFSET  确认保留块大小

SELECT A.FILE#,

A.NAME,

A.BLOCKS,

A.BYTES / 1024 / 1024,

A.BLOCK1_OFFSET

FROM v$datafile a

例如AIX 系统中可以查看到BLOCK1_OFFSET偏移量为12288(12k),

oracle文件头预留了1个 8k(8192)的数据块,

另外一个 4k 的数据块就是裸设备的系统保留块。


系统保留块如下

unix    OS Reserved Size

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

SUN Solaris    0

HP-UX          0

Linux          0

IBM AIX        4K

Tru64 UNIX     64k

*************************************************************************

对于此案例 AIX 系统 数据块大小为 327678 转换一下,就是 327678*2 = 655356 个4k块,

在加上oracle 数据文件头块 8k,所以需要 dd 出 (655356 + 2) 655358个4K块,

并且跳过一个裸设备的头块。

*************************************************************************

输出文件到文件plob2_01.dbf

dd if=/dev/rpub_plob2_01 of=plob2_01.dbf bs=4k seek=1 count=655358

那么现在这个文件跳过AIX保留块后总共备份了 655358个4K块 及 327679 个8k数据块

dbv检查一遍

dbv file=plob2_01.dbf blocksize=8192

接下来通过dd命令将文件补齐 加上一个空块,模拟得到一个655104个8k数据块加上1个8k数据文件头的的数据文件,

正好可以骗过操作系统和控制文件。

(有点绕,因为提示中的 655104 个8k块同样也没有包含数据文件头块

dd if=/dev/zero of=plob2_01.dbf bs=8192 seek=327679 count= 327426 conv=notrunc

接下来将这个文件添加到前面创建的裸设备中去,注意同样要跳过一个系统块

dd if=plob2_01.dbf of=/dev/rrecvr_plob2_01 bs=4k seek=1

alter
database rename file ‘/dev/rpub_plob2_01‘ to  ‘/dev/rrecvr_plob2_01‘ ;

recover  tablespace PUB_PLOB2_01 ;

alter
database  tablespace  PUB_PLOB2_01  online ;

问题解决:

---------------------linux案例一则--------------------------------------

在数据库启动的过程中可能遇到如下的错误:

点击(此处)折叠或打开

[[email protected] huateng]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Sun Aug 5 17:24:07 2012

Copyright (c) 1982, 2009, Oracle. All rights reserved.

Connected to an idle instance.

SQL> startup

ORACLE instance started.

Total System Global Area 506368000 bytes

Fixed Size 1337520 bytes

Variable Size 331351888 bytes

Database Buffers 167772160 bytes

Redo Buffers 5906432 bytes

Database mounted.

ORA-01122: database file 6 failed verification check

ORA-01110: data file 6: ‘/u01/app/oracle/oradata/huateng/htyansp01.dbf‘

ORA-01200: actual file size of 7399 is smaller than correct size of 12800 blocks

SQL>

这个错误表示文件头记录的数据文件的大小与实际不一致:

--数据文件大小

SQL> ! ls -ltr /u01/app/oracle/oradata/huateng/htyansp01.dbf

-rw-r--r-- 1 oracle oinstall 60620800 08-05 17:25 /u01/app/oracle/oradata/huateng/htyansp01.dbf

SQL> select bytes from v$datafile where name=‘/u01/app/oracle/oradata/huateng/htyansp01.dbf‘;

BYTES

----------

104857600

SQL> select 60620800-8192 from dual;

60620800-8192

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

60612608

SQL> select 60612608/8192 from dual;

60612608/8192

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

7399

实际文件的大小为 7399 个 8k BLOCKS。

SQL> select bytes from v$datafile where name=‘/u01/app/oracle/oradata/huateng/htyansp01.dbf‘;

BYTES

----------

104857600

SQL> select 104857600/8192 from dual;

104857600/8192

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

12800

而控制文件中记录的文件大小为12800个 BLOCKS。

如果有备份的话可以通过备份恢复的方法来解决这个问题。如果没有备份的话,

一种简单解决这个错误的方法是通过把数据文件构造到和控制文件记录的一模一样来骗过oracle。

如下:

点击(此处)折叠或打开

SQL> alter database open;

alter database open

*

ERROR at line 1:

ORA-01122: database file 6 failed verification check

ORA-01110: data file 6: ‘/u01/app/oracle/oradata/huateng/htyansp01.dbf‘

ORA-01200: actual file size of 7399 is smaller than correct size of 12800

blocks

SQL> select 12800-7399 from dual;

12800-7399

----------

5401

备份

dd if=/u01/app/oracle/oradata/huateng/htyansp01.dbf of=htyansp01back.dbf bs=8192

如果要加count 那么记住 要加上一个8块的数据头文件。

count=7400

通过dd命令补齐数据文件,注意要加上一个8k的数据文件头块。

SQL> ! dd if=/dev/zero of=/u01/app/oracle/oradata/huateng/htyansp01.dbf bs=8192 count=5401 seek=7400

5401+0 records in

5401+0 records out

44244992 bytes (44 MB) copied, 0.152335 seconds, 290 MB/s

SQL> ! ls -ltr /u01/app/oracle/oradata/huateng/htyansp01.dbf

-rw-r--r-- 1 oracle oinstall 104865792 08-05 17:37 /u01/app/oracle/oradata/huateng/htyansp01.dbf

SQL> alter database open;

Database altered.

来自为知笔记(Wiz)

时间: 2024-10-28 23:20:50

各种操作系统裸设备dd命令,以及ora-01200错误的分析的相关文章

定时任务任务脚本报命令找不到错误原因分析

1.1 定时任务内环境变量和shell环境变量的区别 1.1.1 shell环境变量PATH查询用echo $PATH命令 [[email protected] /]# echo $PATH /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin shell环境变量 1.1.2 定时任务内环境变量PATH查询是把echo $PATH的命令写入脚本,再把执行结果写入文本查询结果. [[email protecte

dd命令简单使用举例

bs为单位,count为写入的范围区间,如下举例: 例:使用dd清除vote disk和ocr(裸设备) $dd if=/dev/zero of=/dev/rrac_ocr1  bs=8192 count=17000 $dd if=/dev/zero of=/dev/rrac_vote1 bs=8192 count=17000 例:使用dd清除裸设备头部信息 $dd if=/dev/zero of=/dev/rlv_asm1 bs=8192 count=2560 以8k(8192字节)为单位,擦

裸设备和Oracle问答20例

裸设备和Oracle问答20例 导读 裸设备,也叫裸分区(原始分区),是一种没有经过格式化,不被Unix通过文件系统来读取的特殊字符设备.裸设备可以绑定一个分区,也可以绑定一个磁盘.本文收集裸设备和Oracle问答20例. 1.什么叫做裸设备? 裸设备,也叫裸分区(原始分区),是一种没有经过格式化,不被Unix通过文件系统来读取的特殊字符设备.它由应用程序负责对它进行读写操作.不经过文件系统的缓冲. 2.如何辨别裸设备? 在Unix的/dev 目录下,有许多文件,其中有两个大类:字符设备文件和块

Oracle裸设备

裸设备,也叫裸分区(原始分区),是一种没有经过格式化,不被Unix通过文件系统来读取的特殊字符设备.本文收集裸设备和Oracle问答20例. 1.什么叫做裸设备? 裸设备,也叫裸分区(原始分区),是一种没有经过格式化,不被Unix通过文件系统来读取的特殊字符设备.它由应用程序负责对它进行读写操作.不经过文件系统的缓冲. 2.如何辨别裸设备? 在Unix的/dev 目录下,有许多文件,其中有两个大类:字符设备文件和块设备文件. 字符设备特殊文件进行I/O操作不经过操作系统的缓冲区,而块设备特殊文件

linux添加裸设备

1.什么裸设备?字符设备?块设备? 裸设备:也叫裸分区(原始分区),是一种没有经过格式化,不被Unix/Linux通过文件系统来读取的特殊字符设备.裸设备,也叫裸分区(原始分区),是一种没有经过格式化,不被Unix通过文件系统来读取的特殊字符设备.它由应用程序负责对它进行读写操作.不经过文件系统的缓冲.裸设备可以绑定一个分区,也可以绑定一个磁盘. 字符设备:对字符设备的读写不需要通过OS的buffer.它不可被文件系统mount. 块设备:对块设备的读写需要通过OS的buffer,它可以被mou

利用dd命令对Linux磁盘进行读写能力测试

在Linux中,对磁盘进行读写能力的测试,是一件非常必要的事情.虽然有一些很专业的软件去做这件事,但在某些情况下,由于技术能力限制,或用户并不需要很专业,这时就要考虑Linux内嵌命令dd了,它是一个简单易用,且功能略微强大的命令. 一.首先要了解两个特殊的设备 /dev/null:回收站.无底洞,可以把一些没用的东西丢进去 /dev/zero:产生字符,这样就可以模拟文件,不需要有文件就可以进行文件传输 二.读写能力测试 磁盘写能力测试: time dd if=/dev/zero of=/te

Aix Oracle11g裸设备建库

11G RAW ON AIX 查看物理内存大小 /usr/sbin/lsattr -E -l sys0 -a realmem Available RAM Swap Space Required Between 1 GB and 2 GB 1.5 times the size of the RAM Between 2 GB and 16 GB Equal to the size of the RAM More than 16 GB 16 GB 查看paging space /usr/sbin-/l

Linux 下的dd命令使用详解(摘录)

一.dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512:c=1:k=1024:w=2 参数注释: 1. if=文件名:输入文件名,缺省为标准输入.即指定源文件.< if=input file > 2. of=文件名:输出文件名,缺省为标准输出.即指定目的文件.< of=output file > 3. ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节.

在linux上用dd命令实现ghost功能

转自:http://blog.jobbole.com/90978/ ghost和g4l 安装操作系统,速度太慢,整个过程太冗长乏味了. 安装过程中,需要回答若干问题,系统需要安装无数个软件,创建和写入无数的文件.因为涉及到大量的文件定位和读写,速度一定是快不起来的. Windows下我们常常使用ghost系统来备份和刻录操作系统.ghost可以clone整个系统的镜像,然后在新的电脑上恢复,相当简单.用ghost系统安装操作系统比使用安装光盘安装系统要快捷多了,也不需要回答任何问题了. 那么,我