由于安全性考虑,需要把原先建在linux文件系统下的oracle系统数据文件
/opt/oracle/oradata/orcl1/users01.dbf
/opt/oracle/oradata/orcl1/sysaux01.dbf
/opt/oracle/oradata/orcl1/undotbs01.dbf
/opt/oracle/oradata/orcl1/system01.dbf,迁移到裸设备上,请问在不重建数据库的情况下,可以实现吗? 如果可以,请教如何实现,谢谢各位大虾的指教!
环境: linux as4 +  oracle 10g  
网上找到的都是 非系统数据文件的迁移 ,是用 $ dd if=/oradata/test.dbf of=/dev/raw/raw1  bs=1024k ,
然后 recover datafile ,  这方法可以用在 系统数据文件上吗、??

解决方案 »

  1.   

    还是通过备份(exp)还原(imp)保险些.
      

  2.   

    直接迁移文件是不行的,因为它有一个系统改变号SCN,这个SCN是数据文件\日志文件\控制文件的同步号,直接迁移时它的同步号不可能一样;
    你只能先把数据文件备份出来,再通过恢复的方式还原数据库
      

  3.   

    我觉得2楼说的很保险,
    如果想尝试下可以参考下这个文章
    http://www.ixpub.net/viewthread.php?tid=706503&highlight=HP-UX3.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选项没被指定的话
      

  4.   

    我觉得这是不可行的,oracle的数据管理都是需要索引的,每个机器的索引都是不一样的,会造成数据混乱的
      

  5.   

    在unmount状态下 用rman 试验下呢.
    不过没试过系统用的 只迁过非系统的.