Oracle 使用RMAN COPY 移動 整個數據庫 位置 示例


一.數據遷移說明

在DBA的工作中會遇到數據遷移的情況,比如將本地磁盤遷移到ASM,亦或者需要更換存儲設備,那么我就需要遷移整個數據庫的存儲位置。

 

如果只是移動表空間或者數據文件,我們可以將表空間或者數據文件offline 之后,移動位置,在用alter database rename 和alter tablespace rename 來將位置的變化寫入控制文件即可。

 

(1)按數據文件來:

1.先將相應的數據文件 offline  

ALTER DATABASE DATAFILE 'D:/ORACLE/ORADATA/DBA/TEST01.DBF' OFFLINE;

2.把數據文件 copy 到新位置

3. alter database rename file 'D:/ORACLE/ORADATA/DBA/TEST01.DBF' to 'D:/TEST01.DBF';

 

4. 介質恢復(offline 數據文件必須要介質恢復)

recover datafile 'D:/TEST01.DBF'

5. 將相應的數據文件 online 

SQL>ALTER DATABASE DATAFILE 'D:/TEST01.DBF' ONLINE;

 

(2)按表空間來:

1.先將相應的表空間 offline  

SQL>alter tablespace test offline;  

 

2.把數據文件 copy 到新位置

3. alter tablespace TEST  rename datafile 'D:/TEST01.DBF' to 'D:/ORACLE/ORADATA/DBA/TEST01.DBF'

 

4. 將表空間 online 

SQL>alter tablespace test online;   

 

 

ALTERDATABASE 與 ALTERTABLESPACE OFFLINE的區別

http://blog.csdn.net/tianlesoftware/article/details/4898800

 

 

在這里我們演示一下使用RMAN copy遷移整個數據庫的操作。 這個操作數據庫必須在mount 狀態下進行。

 

二.在Mount 狀態下轉移整個數據庫

       如果只是移動數據文件,操作還是比較簡單的,步驟和第一節里講的類似,僅僅是數據庫變成了mount狀態,我們不需要去offline表空間或者數據文件而已。

   如果是整庫的轉移,我們還需要考慮如下文件位置轉移: 數據文件,undo ,Temp,Redo 和控制文件。

 

1. 移動數據文件位置

1.查看datafile 位置:

 

SQL> set lin 120

SQL>col file_name for a70

SQL>select file_name from dba_data_files

  2 union all

  3 select file_name from dba_temp_files;

 

FILE_NAME

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

/u01/app/oracle/oradata/dave/users01.dbf

/u01/app/oracle/oradata/dave/undotbs01.dbf

/u01/app/oracle/oradata/dave/sysaux01.dbf

/u01/app/oracle/oradata/dave/system01.dbf

/u01/app/oracle/oradata/dave/example01.dbf

/u01/app/oracle/oradata/dave/temp01.dbf

 

6 rows selected.

 

2.創建一個新目錄,用來存放數據文件:

[oracle@dave oradata]$ pwd

/u01/app/oracle/oradata

[oracle@dave oradata]$ mkdir -p/u01/app/oracle/oradata/anqing

[oracle@dave oradata]$ ls

anqing dave

 

3.編寫RMAN 腳本:Rcopy.sh:

這里的copy可以直接敲命令,如果數據文件很多的話,還是建議用腳本,后台來跑。因為這樣不會因為連接中斷而出現問題,操作也會更安全一些。

 

#!/bin/ksh

export LANG=en_US

RMAN_LOG_FILE=${0}.out

ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1

export ORACLE_HOME

RMAN=$ORACLE_HOME/bin/rman

export RMAN

ORACLE_SID=dave

export ORACLE_SID

ORACLE_USER=oracle

export ORACLE_USER

 

echo "ORACLE_SID:$ORACLE_SID">>$RMAN_LOG_FILE

echo"ORACLE_HOME:$ORACLE_HOME">>$RMAN_LOG_FILE

echo"ORACLE_USER:$ORACLE_USER">>$RMAN_LOG_FILE

echo"==========================">>$RMAN_LOG_FILE

 

chmod 666 $RMAN_LOG_FILE

 

$RMAN nocatalog TARGET / msglog$RMAN_LOG_FILE append <<EOF

run

{

allocate channel c1 type disk;

allocate channel c2 type disk;

copy datafile'/u01/app/oracle/oradata/dave/users01.dbf' to '/u01/app/oracle/oradata/anqing/users01.dbf';

copy datafile'/u01/app/oracle/oradata/dave/undotbs01.dbf' to'/u01/app/oracle/oradata/anqing/undotbs01.dbf';

copy datafile'/u01/app/oracle/oradata/dave/sysaux01.dbf' to'/u01/app/oracle/oradata/anqing/sysaux01.dbf';

copy datafile '/u01/app/oracle/oradata/dave/system01.dbf'to '/u01/app/oracle/oradata/anqing/system01.dbf';

copy datafile'/u01/app/oracle/oradata/dave/example01.dbf' to'/u01/app/oracle/oradata/anqing/example01.dbf';

copy datafile '/u01/app/oracle/oradata/dave/temp01.dbf' to '/u01/app/oracle/oradata/anqing/temp01.dbf';

 

/u01/app/oracle/oradata/dave/users01.dbf

 

release channel c2;

release channel c1;

}

EOF

 

echo >> $RMAN_LOG_FILE

exit

 

 

--賦執行權限:

[oracle@dave u01]$ chmod 755 rcopy.sh

 

4.將DB 啟動到mount 狀態:

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup mount

ORACLE instance started.

 

Total System Global Area  818401280 bytes

Fixed Size                  2232800 bytes

Variable Size             490737184 bytes

Database Buffers          322961408 bytes

Redo Buffers                2469888 bytes

Database mounted.

 

5.執行rman copy 腳本:

[oracle@dave u01]$ nohup sh /u01/rcopy.sh>rcopy.out 2>&1 &

[1] 5249

[oracle@dave u01]$ jobs

[1]+ Running                 nohup sh/u01/rcopy.sh > rcopy.out 2>&1 &

[oracle@dave u01]$ jobs

[1]+ Done                    nohup sh/u01/rcopy.sh > rcopy.out 2>&1

 

--確認拷貝:

[root@dave anqing]# ls -lh

total 1.7G

-rw-r----- 1 oracle oinstall 347M Sep 1201:27 example01.dbf

-rw-r----- 1 oracle oinstall 571M Sep 12 01:25sysaux01.dbf

-rw-r----- 1 oracle oinstall 721M Sep 1201:26 system01.dbf

-rw-r----- 1 oracle oinstall  96M Sep 12 01:24 undotbs01.dbf

--注意,這里的temp數據文件並沒有copy成功,這個后面在說明.

 

 

6. rename 數據文件

 

還是使用后台操作,腳本rename.sh如下:

#!/bin/ksh

sqlplus / as sysdba<< EOF

alter database rename file'/u01/app/oracle/oradata/dave/users01.dbf' to '/u01/app/oracle/oradata/anqing/users01.dbf';

alter database rename file'/u01/app/oracle/oradata/dave/undotbs01.dbf' to'/u01/app/oracle/oradata/anqing/undotbs01.dbf';

alter database rename file'/u01/app/oracle/oradata/dave/sysaux01.dbf' to'/u01/app/oracle/oradata/anqing/sysaux01.dbf'; 

alter database rename file'/u01/app/oracle/oradata/dave/system01.dbf' to'/u01/app/oracle/oradata/anqing/system01.dbf'; 

alter database rename file'/u01/app/oracle/oradata/dave/example01.dbf' to'/u01/app/oracle/oradata/anqing/example01.dbf';

exit

EOF

 

--給執行權限:

[oracle@dave u01]$ chmod 755 rename.sh

 

[oracle@dave u01]$ nohup sh rename.sh >rename.out 2>&1 &

 

7. open 數據庫驗證

SQL> set lin 120

SQL> col file_name for a70

SQL> select file_name fromdba_data_files

 2  union all

 3  select file_name fromdba_temp_files;

 

FILE_NAME

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

/u01/app/oracle/oradata/anqing/users01.dbf

/u01/app/oracle/oradata/anqing/undotbs01.dbf

/u01/app/oracle/oradata/anqing/sysaux01.dbf

/u01/app/oracle/oradata/anqing/system01.dbf

/u01/app/oracle/oradata/anqing/example01.dbf

/u01/app/oracle/oradata/dave/temp01.dbf

 

6 rows selected.

 

注意這里的temp 表空間,還在原來位置。下面我們來處理temp datafile。

 

8. 對Temp datafile 處理

我們在第五步copy了temp file,但是實際上並沒有copy成功。 RMAN copy 的錯誤如下:

Starting backup at 12-SEP-12

released channel: c1

released channel: c2

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

RMAN-00569: =============== ERROR MESSAGESTACK FOLLOWS ===============

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

RMAN-03002: failure of backup command at09/12/2012 01:27:20

RMAN-20201: datafile not found in therecovery catalog

RMAN-06010: error while looking updatafile: /u01/app/oracle/oradata/dave/temp01.dbf

 

RMAN 在備份的時候也不會備份備份locally managed 的tempfiles。原因如下:

1. Locally managed tempfiles are always setto NOLOGGING mode. So thus will have no undo.

2. Extents are managed by bitmap in each datafile to keep track of free or usedstatus of blocks in that datafile.

3. The data dictionary does not manage the tablespace.

4. Rollback information is not generated because there is no update on the datadictionary.

5. Media recovery does not recognize tempfiles.

 

所以我們這里在copy 數據文件時,不需要copy 臨時表空間。只需要在copy 結束后給臨時表空間添加一個數據文件,然后把原來目錄下的臨時文件drop 掉即可。這個是必須的操作,步驟如下:

 

--這個操作必須在dbopen 狀態下執行:

SQL> alter tablespace temp add tempfile'/u01/app/oracle/oradata/anqing/temp01.dbf' size 500M autoextend off;

 

Tablespace altered.

 

SQL> alter tablespace temp drop tempfile'/u01/app/oracle/oradata/dave/temp01.dbf';

 

Tablespace altered.

 

SQL>

 

在次驗證:

SQL> set lin 120

SQL> col file_name for a70

SQL> select file_name fromdba_data_files

 2  union all

 3  select file_name fromdba_temp_files;

 

FILE_NAME

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

/u01/app/oracle/oradata/anqing/users01.dbf

/u01/app/oracle/oradata/anqing/undotbs01.dbf

/u01/app/oracle/oradata/anqing/sysaux01.dbf

/u01/app/oracle/oradata/anqing/system01.dbf

/u01/app/oracle/oradata/anqing/example01.dbf

/u01/app/oracle/oradata/anqing/temp01.dbf

 

6 rows selected.

 

這次數據文件全部轉移成功,只要不進錯目錄,我們就可以大膽的rm掉之前的數據文件了。

 

Oracle 控制文件

http://blog.csdn.net/tianlesoftware/article/details/4974440

Oracle Temp 臨時表空間

http://blog.csdn.net/tianlesoftware/article/details/4697417

 

 

9. 處理Redo log file:

1.      查看Redo 信息:

SQL> set lin 120

SQL> col member for a60

SQL> select group#,type, member fromv$logfile;

 

   GROUP# TYPE    MEMBER

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

        3 ONLINE /u01/app/oracle/oradata/dave/redo03.log

        2 ONLINE  /u01/app/oracle/oradata/dave/redo02.log

        1 ONLINE /u01/app/oracle/oradata/dave/redo01.log

 

SQL> selectgroup#,thread#,archived,status, bytes/1024/1024 from v$log;  

 

   GROUP#    THREAD# ARC STATUS           BYTES/1024/1024

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

        1          1 NO  CURRENT                       50

        2          1 NO  INACTIVE                      50

        3          1 NO  INACTIVE                      50

 

SQL> select b.group# , b.status ,a.member from v$logfile a , v$log b where a.group# = b.group# order by 1;

 

   GROUP# STATUS           MEMBER

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

        1 CURRENT         /u01/app/oracle/oradata/dave/redo01.log

         2 INACTIVE        /u01/app/oracle/oradata/dave/redo02.log

        3 INACTIVE        /u01/app/oracle/oradata/dave/redo03.log

 

我們這里的處理方法很簡單,給每個group 添加一個redo logfile,然后把舊目錄下的logfile drop掉即可。 當然也可以添加幾個新組,在把舊組drop掉。

注意的是,我們只能drop inactive 和unused 狀態的log file,其他狀態不能drop。

 

操作如下:

 

--先給每組加個成員:

SQL> alter database add logfile member'/u01/app/oracle/oradata/anqing/redo01.log' to group 1;  

 

Database altered.

 

SQL> alter database add logfile member'/u01/app/oracle/oradata/anqing/redo02.log' to group 2;

 

Database altered.

 

SQL> alter database add logfile member'/u01/app/oracle/oradata/anqing/redo03.log' to group 3;

 

Database altered.

 

--驗證:

SQL> select b.group# , b.status ,a.member from v$logfile a , v$log b where a.group# = b.group# order by 1;

 

    GROUP#STATUS           MEMBER

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

        1 CURRENT         /u01/app/oracle/oradata/dave/redo01.log

        1 CURRENT         /u01/app/oracle/oradata/anqing/redo01.log

        2 INACTIVE        /u01/app/oracle/oradata/anqing/redo02.log

        2 INACTIVE        /u01/app/oracle/oradata/dave/redo02.log

        3 INACTIVE        /u01/app/oracle/oradata/anqing/redo03.log

        3 INACTIVE        /u01/app/oracle/oradata/dave/redo03.log

 

6 rows selected.

 

2.      Drop 舊目錄的log file:

這里group 1是ACTIVE,我們不能drop,所以我們先drop 2和3,然后switch logfile,在drop group 1。

 

 

 

SQL> ALTER DATABASE DROP LOGFILE MEMBER '/u01/app/oracle/oradata/dave/redo03.log';

 

Database altered.

 

SQL> ALTER DATABASE DROP LOGFILE MEMBER'/u01/app/oracle/oradata/dave/redo02.log';

 

Database altered.

 

SQL> ALTER DATABASE DROP LOGFILE MEMBER'/u01/app/oracle/oradata/dave/redo01.log';

ALTER DATABASE DROP LOGFILE MEMBER'/u01/app/oracle/oradata/dave/redo01.log'

*

ERROR at line 1:

ORA-01609: log 1 is the current log forthread 1 - cannot drop members

ORA-00312: online log 1 thread 1:'/u01/app/oracle/oradata/dave/redo01.log'

ORA-00312: online log 1 thread 1:'/u01/app/oracle/oradata/anqing/redo01.log'

 

 

SQL> alter system switch logfile;

 

System altered.

 

SQL> ALTER DATABASE DROP LOGFILE MEMBER'/u01/app/oracle/oradata/dave/redo01.log';

 

Database altered.

 

--驗證:

SQL> select b.group# , b.status , a.memberfrom v$logfile a , v$log b where a.group# = b.group# order by 1;

 

   GROUP# STATUS           MEMBER

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

        1 ACTIVE          /u01/app/oracle/oradata/anqing/redo01.log

        2 CURRENT         /u01/app/oracle/oradata/anqing/redo02.log

        3 INACTIVE        /u01/app/oracle/oradata/anqing/redo03.log

 

到這里,redo log 也ok了。還差最后一個,控制文件。

 

10. 處理控制文件

控制文件的處理很簡單,將庫shutdown,然后把控制文件copy 到新位置,修改一下pfile參數就ok了。

 

 

這里要注意控制文件存放位置問題:

*.control_files='/u01/app/oracle/oradata/dave/control01.ctl','/u01/app/oracle/fast_recovery_area/dave/control02.ctl'

 

這里是Oracle 11g的配置,這里的控制文件只有2個,其中一個在FRA目錄下。 而在Oracle 10g中,會有三個控制文件,他們都在一個目錄下面。

 

SQL> create pfile from spfile;

 

File created.

 

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

 

[oracle@dave dave]$ ls

control01.ctl  redo01.log redo03.log    system01.dbf   users01.dbf

example01.dbf  redo02.log sysaux01.dbf  undotbs01.dbf

[oracle@dave dave]$ cp control01.ctl../anqing

[oracle@dave dave]$ cd ..

[oracle@dave oradata]$ cd anqing

[oracle@dave anqing]$ ls

control01.ctl  redo01.log redo03.log    system01.dbf  undotbs01.dbf

example01.dbf  redo02.log sysaux01.dbf  temp01.dbf    users01.dbf

 

SQL> create spfile frompfile='/u01/app/oracle/product/11.2.0/db_1/dbs/initdave.ora';

 

File created.

 

SQL> startup

ORACLE instance started.

 

Total System Global Area  818401280 bytes

Fixed Size                  2232800 bytes

Variable Size             490737184 bytes

Database Buffers          322961408 bytes

Redo Buffers                2469888 bytes

Database mounted.

Database opened.

SQL> show parameter control_files

 

NAME                                 TYPE        VALUE

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

control_files                        string      /u01/app/oracle/oradata/anqing

                                                /control01.ctl, /u01/app/oracl

                                                 e/fast_recovery_area/dave/cont

                                                rol02.ctl

 

 

至此,整個使用RMAN copy 轉移整個數據庫操作結束。 現在我們可以大膽的rm 掉之前的目錄了。

 

[oracle@dave oradata]$ pwd

/u01/app/oracle/oradata

[oracle@dave oradata]$ ls

anqing dave

[oracle@dave oradata]$ rm -rf dave

[oracle@dave oradata]$ ls

anqing

 

 

 轉:http://www.cnblogs.com/tianlesoftware/archive/2012/03/07/3609339.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM