裸设备上的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