一.數據遷移說明
在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>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可以直接敲命令,如果數據文件很多的話,還是建議用腳本,后台來跑。因為這樣不會因為連接中斷而出現問題,操作也會更安全一些。
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掉之前的數據文件了。
http://blog.csdn.net/tianlesoftware/article/details/4974440
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