有些時候需要將Oracle的多個資料檔案以及記錄檔重定位或者遷移到新的分區或新的位置,比如磁碟空間不足,或因為特殊需求。對於這種情形可以採取批量遷移的方式將多個資料檔案或者記錄檔實現一次性遷移。當然備份恢複也是其中的方式之一。本文主要描述如何使用批量方式來遷移資料檔案,記錄檔。如需要也可以將整個資料庫遷移到新的位置以及重新命名資料庫。
1、環境及需求 robin@SZDB:~> cat /etc/issue Welcome to SUSE Linux Enterprise Server 10 SP3 (x86_64) - Kernel \r (\l). robin@SZDB:~> sqlplus -v SQL*Plus: Release 10.2.0.3.0 - Production 下面的遷移主要是將資料庫/u02/database/SYBO2SZ下的所有檔案遷移到一個新的目錄/u02/database/SY5221BK下面。 源路徑:資料庫SYBO2SZ所有的資料檔案,記錄檔,控制檔案全部位於SYBO2SZ下的相應子目錄。 新路徑:資料庫SYBO2SZ所有的資料檔案,記錄檔,控制檔案全部移動到SY5221BK相應的子目錄下。 2、當前資料庫檔案位置(來源於資料字典) sys@SYBO2SZ> @dba_files_all_2.sql Tablespace Name / File Class Filename File Size Auto ----------------------------- ------------------------------------------------------- --------------- ---- GOEX_ACCOUNT_IDX /u02/database/SYBO2SZ/oradata/SYBO2SZ_account_idx.dbf 16,777,216 YES GOEX_ACCOUNT_TBL /u02/database/SYBO2SZ/oradata/SYBO2SZ_account_tbl.dbf 25,165,824 YES GOEX_ARCHIVE_IDX /u02/database/SYBO2SZ/oradata/SYBO2SZ_archive_idx.dbf 20,971,520 YES -- ......... ......................... SOE /u02/database/SYBO2SZ/oradata/soe.dbf 934,043,648 YES SOEINDEX /u02/database/SYBO2SZ/oradata/soeindex.dbf 713,031,680 YES SYSAUX /u02/database/SYBO2SZ/oradata/sysauxSYBO2SZ.dbf 325,058,560 YES SYSTEM /u02/database/SYBO2SZ/oradata/sysSYBO2SZ.dbf 524,288,000 YES TBST /u02/database/SYBO2SZ/oradata/tbst.dbf 10,485,760 YES TEMP /u02/database/SYBO2SZ/temp/tempSYBO2SZ.dbf 432,013,312 YES UNDOTBS1 /u02/database/SYBO2SZ/undo/undotbsSYBO2SZ.dbf 429,916,160 YES UNDOTBS2 /u02/database/SYBO2SZ/undo/undotbsSYBO2SZ2.dbf 314,572,800 YES [ ONLINE REDO LOG ] /u02/database/SYBO2SZ/redolog/log3aSYBO2SZ.log 20,971,520 [ ONLINE REDO LOG ] /u02/database/SYBO2SZ/redolog/log3bSYBO2SZ.log 20,971,520 [ ONLINE REDO LOG ] /u02/database/SYBO2SZ/redolog/log4aSYBO2SZ.log 20,971,520 [ ONLINE REDO LOG ] /u02/database/SYBO2SZ/redolog/log4bSYBO2SZ.log 20,971,520 --------------- sum 5,107,376,128 41 rows selected. 3、建立相應的目錄 oracle@SZDB:/u02/database/SYBO2SZ> more mkdir_SY5221BK.sh #!/bin/sh rm -rf /u02/database/SY5221BK/archive rm -rf /u02/database/SY5221BK/backup rm -rf /u02/database/SY5221BK/bdump rm -rf /u02/database/SY5221BK/cdump rm -rf /u02/database/SY5221BK/udump rm -rf /u02/database/SY5221BK/controlf rm -rf /u02/database/SY5221BK/oradata rm -rf /u02/database/SY5221BK/redolog rm -rf /u02/database/SY5221BK/undo rm -rf /u02/database/SY5221BK/temp rm -rf /u02/database/SY5221BK/ref_data rm -rf /u02/database/SY5221BK/BNR rm -rf /u02/database/SY5221BK/BNR/full rm -rf /u02/database/SY5221BK/BNR/dump rm -rf /u02/database/SY5221BK/dbcreatelogs mkdir -p /u02/database/SY5221BK/flash_recovery_area mkdir -p /u02/database/SY5221BK mkdir -p /u02/database/SY5221BK/archive mkdir -p /u02/database/SY5221BK/backup mkdir -p /u02/database/SY5221BK/bdump mkdir -p /u02/database/SY5221BK/cdump mkdir -p /u02/database/SY5221BK/udump mkdir -p /u02/database/SY5221BK/controlf mkdir -p /u02/database/SY5221BK/oradata mkdir -p /u02/database/SY5221BK/redolog mkdir -p /u02/database/SY5221BK/undo mkdir -p /u02/database/SY5221BK/temp mkdir -p /u02/database/SY5221BK/ref_data mkdir -p /u02/database/SY5221BK/BNR mkdir -p /u02/database/SY5221BK/BNR/full mkdir -p /u02/database/SY5221BK/BNR/dump mkdir -p /u02/database/SY5221BK/dbcreatelogs oracle@SZDB:/u02/database/SYBO2SZ> ./mkdir_SY5221BK.sh 4、實施遷移 sys@SYBO2SZ> startup mount force; --->切換資料庫到mount狀態 ORACLE instance started. Database mounted. sys@SYBO2SZ> @/users/robin/dba_scripts/custom/sql/transfer_db_files -->呼叫指令碼進行資料及記錄檔的遷移 Step 1, Coping file to destination from source ============================================ Step 2, updating files to control file ============================================ sys@SYBO2SZ> alter database open; -->切換資料庫到open狀態 Database altered. sys@SYBO2SZ> @dba_files_all_2.sql -->驗證切換結果 Tablespace Name / File Class Filename File Size Auto ----------------------------- ---------------------------------------------------------------------- ---- GOEX_ACCOUNT_IDX /u02/database/SY5221BK/oradata/SY5221BK_account_idx.dbf 16,777,216 YES --.......... ................. TEMP /u02/database/SY5221BK/temp/tempSY5221BK.dbf 432,013,312 YES UNDOTBS1 /u02/database/SY5221BK/undo/undotbsSY5221BK.dbf 429,916,160 YES UNDOTBS2 /u02/database/SY5221BK/undo/undotbsSY5221BK2.dbf 314,572,800 YES [ ONLINE REDO LOG ] /u02/database/SY5221BK/redolog/log3aSY5221BK.log 20,971,520 [ ONLINE REDO LOG ] /u02/database/SY5221BK/redolog/log3bSY5221BK.log 20,971,520 [ ONLINE REDO LOG ] /u02/database/SY5221BK/redolog/log4aSY5221BK.log 20,971,520 [ ONLINE REDO LOG ] /u02/database/SY5221BK/redolog/log4bSY5221BK.log 20,971,520 ------------- sum 5,107,376,128 41 rows selected. --如果僅僅是遷移資料檔案以及記錄檔則上述步驟完成即可 --如果需要修改相關的參數檔案以及遷移控制檔案則繼續下面的步驟 --由於控制檔案的在mount狀態下被校正,因此我們在nomount狀態下來處理 sys@SYBO2SZ> shutdown immediate; sys@SYBO2SZ> startup nomount; -->修改參數檔案之前先備份spfile sys@SYBO2SZ> create pfile='/users/oracle/OraHome10g/dbs/initSYBO2SZ_bak.ora' from spfile; File created. -->下面對相關的參數檔案的路徑進行修改,如果不需要修改參數,則跳過下面的步驟 sys@SYBO2SZ> show parameter dump NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ background_core_dump string partial background_dump_dest string /u02/database/SYBO2SZ/bdump core_dump_dest string /u02/database/SYBO2SZ/cdump max_dump_file_size string UNLIMITED shadow_core_dump string partial user_dump_dest string /u02/database/SYBO2SZ/udump sys@SYBO2SZ> alter system set background_dump_dest='/u02/database/SY5221BK/bdump' scope=both sid='*'; System altered. sys@SYBO2SZ> alter system set core_dump_dest='/u02/database/SY5221BK/cdump' scope=both sid='*'; System altered. sys@SYBO2SZ> alter system set user_dump_dest='/u02/database/SY5221BK/udump' scope=both sid='*'; System altered. sys@SYBO2SZ> show parameter db_recovery_file_dest NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_recovery_file_dest string /u02/database/SYBO2SZ/flash_re covery_area db_recovery_file_dest_size big integer 1G sys@SYBO2SZ> alter system set db_recovery_file_dest='/u02/database/SY5221BK/flash_recovery_area' scope=both; System altered. sys@SYBO2SZ> show parameter LOG_ARCHIVE_DEST_1 NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ log_archive_dest_1 string LOCATION=/u02/database/SYBO2SZ /archive/ log_archive_dest_10 string sys@SYBO2SZ> alter system set log_archive_dest_1='LOCATION=/u02/database/SY5221BK/archive' scope=both; System altered. sys@SYBO2SZ> show parameter UTL_FILE_DIR NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ utl_file_dir string /u02/database/SYBO2SZ/udump sys@SYBO2SZ> alter system set UTL_FILE_DIR='/u02/database/SY5221BK/udump' scope=both; alter system set UTL_FILE_DIR='/u02/database/SY5221BK/udump' scope=both * ERROR at line 1: ORA-02095: specified initialization parameter cannot be modified -->該參數不能修改記憶體值 sys@SYBO2SZ> alter system set UTL_FILE_DIR='/u02/database/SY5221BK/udump' scope=spfile; System altered. -->下面對控制檔案位置進行修改 sys@SYBO2SZ> show parameter control_f NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_file_record_keep_time integer 7 control_files string /u02/database/SYBO2SZ/controlf /cntl1SYBO2SZ.ctl, /u02/databa se/SYBO2SZ/controlf/cntl2SYBO2 SZ.ctl, /u02/database/SYBO2SZ/ controlf/cntl3SYBO2SZ.ctl -->將控制檔案複製到新位置 sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/controlf/cntl1SYBO2SZ.ctl /u02/database/SY5221BK/controlf/cntl1SY5221BK.ctl sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/controlf/cntl1SYBO2SZ.ctl /u02/database/SY5221BK/controlf/cntl2SY5221BK.ctl sys@SYBO2SZ> ho cp /u02/database/SYBO2SZ/controlf/cntl1SYBO2SZ.ctl /u02/database/SY5221BK/controlf/cntl3SY5221BK.ctl -->Author : Robinson Cheng -->Blog : http://blog.csdn.net/robinson_0612 -->通過修改control_files參數來修改控制檔案位置 sys@SYBO2SZ> alter system set control_files='/u02/database/SY5221BK/controlf/cntl1SY5221BK.ctl', 2 '/u02/database/SY5221BK/controlf/cntl2SY5221BK.ctl','/u02/database/SY5221BK/controlf/cntl3SY5221BK.ctl' 3 scope=spfile; System altered. sys@SYBO2SZ> shutdown immediate; sys@SYBO2SZ> startup mount; SQL> show parameter control_f NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_file_record_keep_time integer 7 control_files string /u02/database/SY5221BK/control f/cntl1SY5221BK.ctl, /u02/data base/SY5221BK/controlf/cntl2SY 5221BK.ctl, /u02/database/SY52 21BK/controlf/cntl3SY5221BK.ct l sys@SYBO2SZ> show parameter dump background_core_dump string partial background_dump_dest string /u02/database/SY5221BK/bdump core_dump_dest string /u02/database/SY5221BK/cdump max_dump_file_size string UNLIMITED shadow_core_dump string partial user_dump_dest string /u02/database/SY5221BK/udump sys@SYBO2SZ> alter database open; Database altered.5、遷移指令碼 sys@SYBO2SZ> ho more /users/robin/dba_scripts/custom/sql/transfer_db_files.sql Prompt Prompt Step 1, Coping file to destination from source Prompt ============================================ Prompt set linesize 200 set heading off verify off feedback off termout off pagesize 999 define src_dir='SYBO2SZ' define tar_dir='SY5221BK' spool /tmp/cp_files.sql SELECT 'ho cp ' || name || ' ' || REPLACE (name, '&src_dir', '&tar_dir') FROM v$datafile UNION ALL SELECT 'ho cp ' || name || ' ' || REPLACE (name, '&src_dir', '&tar_dir') FROM v$tempfile UNION ALL SELECT 'ho cp ' || MEMBER || ' ' || REPLACE (MEMBER, '&src_dir', '&tar_dir') FROM v$logfile; spool off; @/tmp/cp_files.sql set termout on Prompt Prompt Step 2, updating files to control file Prompt ============================================ Prompt set termout off spool /tmp/update_cntl.sql SELECT 'alter database rename file ''' || name || ''' to ''' || REPLACE (name, '&src_dir', '&tar_dir') || '''' || ';' FROM v$datafile UNION ALL SELECT 'alter database rename file ''' || name || ''' to ''' || REPLACE (name, '&src_dir', '&tar_dir') || '''' || ';' FROM v$tempfile UNION ALL SELECT 'alter database rename file ''' || MEMBER || ''' to ''' || REPLACE (MEMBER, '&src_dir', '&tar_dir') || '''' || ';' FROM v$logfile; spool off; set termout on; @/tmp/update_cntl.sql set heading on verify on feedback on termout on6、後記 a、資料移轉前建議先備份資料庫 b、我們在遷移中使用了複製(cp)方式,實際上可以直接使用移動方式(mv) c、需要理解資料庫的啟動的幾個階段。即nomount狀態時不載入控制檔案,mount狀態時不載入資料檔案及記錄檔 d、對於資料庫啟動階段的深刻理解,有助於弄清楚什麼狀態下我們能做什麼,不能做什麼 e、對於控制檔案位置以及參數中相關dump檔案位置可以直接通過編輯pfile檔案來完成。上例使用的是修改spfile檔案 f、遷移指令碼可以根據需要進行相應的修改,注意我們定義了src_dir與tar_dir g、可將資料庫源檔案夾重新命名,重啟資料庫(open),open會校正所有檔案,以防止遷移中的部分檔案丟失,無誤後可刪除源檔案夾 h、如果需要修改資料庫名,則可以通過使用nid命令修改 db name 及 dbid來完成,相當於產生了一個新的資料庫
更多參考
有關Oracle RAC請參考
使用nid命令修改 db name 及 dbid
使用crs_setperm修改RAC資源的所有者及許可權
使用crs_profile管理RAC資源設定檔
RAC 資料庫的啟動與關閉
再說 Oracle RAC services
Services in Oracle Database 10g
Migrate datbase from single instance to Oracle RAC
Oracle RAC 串連到指定執行個體
Oracle RAC 負載平衡測試(結合伺服器端與用戶端)
Oracle RAC 伺服器端串連負載平衡(Load Balance)
Oracle RAC 用戶端串連負載平衡(Load Balance)
ORACLE RAC 下非預設連接埠監聽配置(listener.ora tnsnames.ora)
ORACLE RAC 監聽配置 (listener.ora tnsnames.ora)
配置 RAC 負載平衡與容錯移轉
CRS-1006 , CRS-0215 故障一例
基於Linux (RHEL 5.5) 安裝Oracle 10g RAC
使用 runcluvfy 校正Oracle RAC安裝環境
有關Oracle 網路設定相關基礎以及概念性的問題請參考:
配置非預設連接埠的動態服務註冊
配置sqlnet.ora限制IP訪問Oracle
Oracle 監聽器日誌配置與管理
設定 Oracle 監聽器密碼(LISTENER)
配置ORACLE 用戶端串連到資料庫
有關基於使用者管理的備份和備份恢複的概念請參考
Oracle 冷備份
Oracle 熱備份
Oracle 備份恢複概念
Oracle 執行個體恢複
Oracle 基於使用者管理恢複的處理
SYSTEM 資料表空間管理及備份恢複
SYSAUX資料表空間管理及恢複
Oracle 基於備份控制檔案的恢複(unsing backup controlfile)
有關RMAN的備份恢複與管理請參考
RMAN 概述及其體繫結構
RMAN 配置、監控與管理
RMAN 備份詳解
RMAN 還原與恢複
RMAN catalog 的建立和使用
基於catalog 建立RMAN儲存指令碼
基於catalog 的RMAN 備份與恢複
RMAN 備份路徑困惑
使用RMAN實現異機備份恢複(WIN平台)
使用RMAN遷移檔案系統資料庫到ASM
linux 下RMAN備份shell指令碼
使用RMAN遷移資料庫到異機
有關ORACLE體繫結構請參考
Oracle 資料表空間與資料檔案
Oracle 密碼檔案
Oracle 參數檔案
Oracle 聯機重做記錄檔(ONLINE LOG FILE)
Oracle 控制檔案(CONTROLFILE)
Oracle 歸檔日誌
Oracle 復原(ROLLBACK)和撤銷(UNDO)
Oracle 資料庫執行個體啟動關閉過程
Oracle 10g SGA 的自動化管理
Oracle 執行個體和Oracle資料庫(Oracle體繫結構)