在UNIX裸设备与文件系统间移动Oracle( 二 )


2.2.3 无论从FILE SYSTEM拷贝到RAW DEVICE还是反之 , 想让ORACLE以新的数据文件打开数据库 , 必须进行RENAME操作 SQL> STARTUP MOUNT; SQL> ALTER DATABASE RENAME FILE "oldfilename" TO "newfilename"; SQL> ALTER DATABASE OPEN; 三、移动联机重作日志(ONLINE REDO LOG) 3.1 在裸设备上建ONLINE REDO LOG 用以下命令增加一组ONLINE REDO LOG: SQL> ALTER DATABASE ADD LOGFILE GROUP 4 "/dev/rlv_redo" SIZE xxxxk; 在裸设备上建REDO LOG时也要计算SIZE子句可使用的最大值 , 方法类似于在2.1中建DATAFILE时的计算方法 , 唯一不同的是要把公式中的DB_BLOCK_SIZE换成REDO_BLOCK_SIZE(即REDO LOG的逻辑块大小) 。这个REDO_BLOCK_SIZE在不同操作系统上取值不同 , 用以下两种方法均可得到这个值 , 同时还可计算出REDO LOG的实际文件大小file_size): 方法1:dump现有的REDO LOG FILE SQL> ALTER SYSTEM DUMP LOGFILE "/oradata/redo01.log"; SQL> SHOW PARAMETER user_dump_dest 查看user_dump_dest目录下刚产生的trc文件: FILE HEADER: Software vsn=135294976=0x8107000, Compatibility Vsn=135290880=0x8106000 Db Id=3227187598=0xc05af98e, Db Name="V817" Control Seq=12474=0x30ba, File size=8192=0x2000 File Number=5, Blksiz=512, File Type=2 LOG 方法2:用ORACLE提供的工具dbfsize , 对文件系统和RAW DEVICE上的文件都适用 $ dbfsize /oradata/redo01.log Database file: /oradata/redo01.log Database file type: file system Database file size: 8192 512 byte blocks 从以上两个输出都可得知REDO_BLOCK_SIZE=512 , blocks=8192 file_size=(blocks1) * REDO_BLOCK_SIZE = (8192 1)*512=4194816 如果已知所在平台的REDO_BLOCK_SIZE , 也可以通过查询数据字典来计算file_size: SQL> SELECT b.member, b.bytes, b.bytes 512 file_size FROM v$logfile a, v$log b WHERE a.group#=b.group# and a.member="/oradata/redo01.log "; MEMBERBYTES FILE_SIZE ------------------------------------- /oradata/redo01.log41943044194816 下表列出了常用OS上的ORACLE REDO_BLOCK_SIZE: OSREDO_BLOCK_SIZE ----------------- --------------- Windows512 SUN Solaris512 HP-UX1024 IBM AIX512 Compaq Tru64 UNIX1024 Linux512 3.2在文件系统和裸设备之间移动ONLINE REDO LOG 参见2.2拷贝DATAFILE的过程 , 唯一不同是要把DB_BLOCK_SIZE换成REDO_BLOCK_SIZE 。另外 , REDO LOG也可以不用dd进行拷贝 , 而采用删除重建的方法: SQL> SELECT * FROM v$log; --be sure it"s not current and archived SQL> ALTER SYSTEM SWITCH LOGFILE; --if it’s current, force switch SQL> ALTER DATABASE DROP LOGFILE GROUP n; SQL> ALTER DATABASE ADD LOGFILE GROUP n "newlogfilename" SIZE xxxxM; 四、移动控制文件(CONTROL FILE) 4.1在裸设备上建控制文件 ORACLE的控制文件是执行CREATE DATABASE或CREATE CONTROLFILE语句时生成的 , 其名字是由初始化参数文件init$ORACLE_SID.ora中的control_files参数指定 。CONTROL FILE的大小不能显式指定 , 而且随着数据库的运行 , 它还会自动增长 , 所以为控制文件划分裸设备时要根据经验 , 留好足够的余量 , 以免不必要的麻烦 。CONTROL FILE的逻辑块大小和DB_BLOCK_SIZE相同 , 而且文件头部也和DATAFILE一样有一块“Oracle OS Header Block” 。
4.2在文件系统和裸设备之间移动控制文件 4.2.1 使用dd复制 拷贝CONTROL FILE的方法基本与2.2中拷贝DATAFILE相同 , 唯一不同是当由裸设备向文件系统拷贝时 , 如何确定CONTROL FILE的实际大小file_size (ORACLE数据字典里没有CONTROL FILE大小的数据) 。下面介绍两个方法: 方法1:执行完下面的SQL语句 , 再到user_dump_dest目录查看刚产生的trc文件 SQL> ALTER SESSION SET EVENTS "IMMEDIATE TRACE NAME CONTROLF LEVEL 10"; FILE HEADER: Software vsn=135266304=0x8100000, Compatibility Vsn=134217728=0x8000000 Db Id=1937054535=0x73751b47, Db Name="O817" Control Seq=5838=0x16ce, File size=476=0x1dc File Number=0, Blksiz=8192, File Type=1 CONTROL 方法2:用Oracle提供的工具dbfsize $ dbfsize /oradata/control01.ctl Database file: /oradata/control01.ctl Database file type: file system Database file size: 476 8192 byte blocks 从以上两个方法的输出结果都可得到file_size=(476 1)*8192=3907584 4.2.2 使用SQL命令复制 相对于4.2.1介绍的用dd拷贝CONTROL FILE , 下面用SQL语句进行复制的方法更为简洁: SQL> STARTUP MOUNT SQL> ALTER DATABASE BACKUP CONTROLFILE TO "newcontrolfile"; 语句中newcontrolfile既可以是文件系统文件 , 也可以是RAW DEVICE , 所以在MOUNT状态下运行这个命令就可以生成一个与现有CONTROL FILE完全相同CONTROL FILE复件 。4.2.3 修改初始化参数文件(init$ORACLE_SID.ora) 无论用4.2.1还是4.2.2的方法产生了新的CONTROL FILE , 为了让数据库使用新的CONTROL FILE , 只要修改init$ORACLE_SID.ora里的control_files参数即可 。五、Recovery Manager (RMAN) RMAN是Oracle提供的备份与恢复工具 , 它能自动正确地跳过裸设备头部的OS Reserved Block , 通过使用RMAN的BACKUP和RESTORE功能 , 可以很方便的将DATAFILE和CONTROL FILE在文件系统和裸设备之间进行移动 。

推荐阅读