您的位置:首页 > 数据库 > Oracle

裸设备上的oracle文件备份-----HP-UX下oracle的裸设备大小

2013-09-24 14:11 274 查看
裸设备上的oracle文件备份-----HP-UX下oracle的裸设备大小 

2005年4月18日 13:56:42 

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

HP-UX下oracle的裸设备大小

1.简介

=====

在HP-UX中,一个'raw device'通常有两种格式:

a.单盘裸设备(/dev/rdsk/cXtYdZ)

b.逻辑卷管理器管理的裸设备(/dev/vgXX/rlvolYY)

当一个数据库文件被创建时,无论是裸设备还是文件系统,Oracle保留第一个数据块给操作系统。第一个Oracle块实际上是文件中的第二个数据块(块的大小稍后讨论)。第二个数据库叫oracle数据文件头。(LVM是大家常用的,就不讨论a情况了)

2在RAW设备上创建数据文件

======================

a.创建一个raw逻辑卷(逻辑卷应该比相要的实际数据数据文件大小至少大一个oracle块)假设raw逻辑卷大小8MB;

b.为了维护简单,建立一个符号连接到这个raw逻辑卷

% ln -s /dev/vg00/rlvtest /oracle/test_raw.dbf

c. 创建一个数据文件,db_block_size大小8k。则数据文件大小不应超过(8*1024*1024) - (8*1024) = 8380416

SVRMGR> create tablespace test datafile '/oracle/test_raw.dbf' size 8380416;

为了表明以上理论,测试实例可为:

SVRMGR> create tablespace test datafile '/oracle/test_raw.dbf' size 8380417;

ORA-01119: error in creating database file '/oracle/test_raw.dbf'

ORA-27042: not enough space on raw partition to fullfill request

看,这里并无HP-UX的错误提示,oracle确保请求分配的文件大小必须比raw逻辑卷小1个数据块。

3.在文件系统和裸设备间 拷贝数据文件:

=================================

3.1 文件系统到raw逻辑卷

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

a. 在文件系统上创建一个8M的数据文件

SVRMGR> create tablespace test datafile '/oracle/test_fs.dbf' size 8M;

b. 检查他的大小

%ls -la /oracle/test_fs.dbf

-rw-r----- 1 hpsupp support 8396800 May 29 15:01 /oracle/test_fs.dbf

实际大小是8396800 =(8M + 8k) = (8*1024*1024) + (8*1024) ,oracle存储数据是从db_block_size=8k的偏移量开始的

c. 假定数据库没有打开,使用dd从文件系统到raw逻辑卷拷贝数据文件

%dd if=/oracle/test_fs.dbf of=/oracle/test_raw.dbf bs=8192

I/O error

1025+0 records in

1024+1 records out

(注意:/oracle/test_fs.dbf大小8396800,/oracle/test_raw.dbf大小8380416,dd试着去拷贝8M+8k 的文件到8M的 raw逻辑卷)

正确的方法是让dd跳过第一个数据块

%dd if=/oracle/test_fs.dbf of=/oracle/test_raw.dbf bs=8192 skip=1

1024+0 records in

1024+0 records out

d. mount数据库, 重命名datafile, 然后open database

SVRMGR> alter database rename file '/oracle/test_fs.dbf'

2> to '/oracle/test_raw.dbf';

SVRMGR> alter database open;

ORA-01122: database file 2 failed verification check

ORA-01110: data file 2: '/oracle/test_raw.dbf'

ORA-01251: Unknown File Header Version read for file number 2

错误的原因是oracle认为数据在raw逻辑卷中从db_block_size的偏移后开始,这确保保留的第一个数据块不被覆盖。

但与此同时,dd命令不支持这样(c例),所以要使用seek选项来跳过第一个保留块

%dd if=/oracle/test_fs.dbf of=/oracle/test_raw.dbf bs=8192 skip=1 seek=1

这个命令确保dd从8192bytes后开始读取文件系统数据文件,并从8192bytes后开始写raw逻辑卷

当然由于数据文件raw逻辑卷大8k,dd命令还是会失败

%dd if=/oracle/test_fs.dbf of=/oracle/test_raw.dbf bs=8192 skip=1 seek=1

I/O error

1024+0 records in

1023+1 records out

如果裸设备卷大小增加到更大,如12MB,那样命令就开始工作了

%dd if=/oracle/test_fs.dbf of=/oracle/test_raw.dbf bs=8192 skip=1 seek=1

1024+0 records in

1024+0 records out

SVRMGR> alter database open;

Statement processed.

注意 dd拷贝整个文件系统数据文件到raw逻辑卷,如果count选项没被指定的话

3.2 裸设备到文件系统

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

a. 删掉文件系统文件,使用dd去拷贝数据文件

% rm /oracle/test_fs.dbf

SVRMGR> shutdown immediate

SVRMGR> startup mount

% dd if=/oracle/test_raw.dbf of=/oracle/test_fs.dbf bs=8192 skip=1 seek=1

1535+0 records in

1535+0 records out

(1535= 12M/8K -1)

b. open the database, and check filesize

SVRMGR> alter database rename file '/oracle/test_raw.dbf' to '/oracle/test_fs.dbf';

SVRMGR> alter database open;

SVRMGR> select name, bytes, blocks from v$datafile;

NAME                BYTES BLOCKS

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

/oracl2/test_fs.dbf 8388608 1024

% ls -la /oracle/test_fs.dbf

-rw-r--r-- 1 hpsupp support 12582912 May 29 16:44 /oracle/test_fs.dbf

 

这显示了raw逻辑卷大小是12MB,并已经背拷贝到文件系统。但是oracle只能用到8MB.为了避免这种磁盘空间浪费,指定拷贝块数(从v$datafile中获得).

% dd if=/oracle/test_raw.dbf of=/oracle/test_fs.dbf  bs=8192 skip=1 seek=1 count=1024

1024+0 records in

1024+0 records out

% ls -la /oracle/test_fs.dbf

-rw-r--r-- 1 hpsupp support 8396800 May 29 17:06 /oracle/test_fs.dbf

4. 在文件系统和裸设备间拷贝重作日志文件

====================================

当考虑到日志文件的在raw设备和文件系统间复制时,注意db_block_size 不能被用于dd命令的bs参数,如果没有遵守,redo日志文件的头可能没背拷贝,在数据库打开或重建control文件是将引起错误:

ORA-01160: file is not a log file

为了发现redo日志文件块大小,如下方法可以确定

4.1 raw逻辑卷到文件系统

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

a. 在裸设备上创建一个2MB的redo log文件

ln -s /dev/vgks/rrtest /oracle/redo_raw.dbf

----------/dev/vgks/rtest是裸设备

alter database add logfile '/oracle/redo_raw.dbf' size 2m;

b. 映像logfile得到文件块大小和文件块数

alter system dump logfile '/oracle/redo_raw.dbf';

文件头显示

FILE HEADER:

Software vsn=135294976=0x8107000, Compatibility Vsn=135290880=0x8106000

Db Id=3227187598=0xc05af98e, Db Name='V817'

Control Seq=12474=0x30ba, File size=2048=0x800

File Number=5, Blksiz=1024, File Type=2 LOG

这个例子中:块大小1024 文件含2048个块

c. 使用dd去备份文件

dd if=/oracle/redo_raw.dbf of=/oracle/redo_fs.dbf bs=1024 count=2048 skip=1 seek=1

2048+0 records in

2048+0 records out

d. SVRMGR> alter database rename file '/oracle/redo_raw.dbf'

to '/oracle/redo_fs.dbf';

4.2 文件系统到裸设备

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

a. 创建日志文件

b. 映像日志文件

c. 使用dd拷贝

dd if=/oracle/redo_fs.dbf of=/oracle/redo_raw.dbf bs=1024 count=2048 skip=1 seek=1

2048+0 records in

2048+0 records out

d. alter database rename file '/oracle/redo_fs.dbf'

to '/oracle/redo_raw.dbf';

像数据文件一样, 裸设备一定比实际文件大小大一个数据块.

4.3

redo log文件被

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

考虑重建redolog而非mv。 这避免了不得不计算出上面提到的参数。

一种方式是删除现在未使用的redo(如需要archive的话先archive)并在想要的位置重建他们:

alter database drop logfile ...

alter database add logfile ...

或者,如果控制文件正在被重建,就是用resetlogs选项创建

CREATE CONTROLFILE REUSE DATABASE "V817" RESETLOGS ARCHIVELOG ...

数据库需要被以RESTELOGS方式打开:

alter database open resetlogs;

之后作数据库的全备份.

5.0 Controlfile

===================

对控制文件提取存储参数很难且容易出错,可选方法是通过之前的备份重建控制文件:

alter database backup controlfile to trace;

6.0 skip 和 seek选项

=================

 dd命令使用skip和seek去读写在redo和数据文件中的第一个块。目的也在于避免覆盖操作系统在'文件头'块中的控制信息。

通过指定skip和seek,dd从oracle块开始操作。这种方法得到了验证,并请记住,关键在于这两个选项要么都用,要么都不用,其实两种方法都能成功,其实第一个块(os块)的内容并不重要,或者说hp_ux也没有只用这个块。但是本文的意义在于,当然使用seek和skip选项,是一种更谨慎的做法,因为这完全是基于oracle的(将来lvm使用这个块时也不会影响oracle)

Ref:

Metalink.oracle.com

Note:146384.1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: