無外網Oracle資料庫遷移

持續高溫發表於2018-09-15

        資料庫遷移有多種方法可以實現,在有網路的情況下可以通過工具實現資料庫遷移,簡單穩定高效,而且停機時間可以控制在很短的時間甚至不需要停機。但是當沒有外網的情況下就方式就比較少了,下面介紹通過Rman備份恢復的方式來遷移Oracle資料庫,將停機時間最小化。

一、收集源庫資訊

1、檢視當前資料庫的實際大小

select sum(a.bytes - b.bytes)/1024/ 1024 "sum_used MB"
   from (select tablespace_name, sum(bytes) bytes  
               from dba_data_files  
                  group by tablespace_name) a,  
           (select tablespace_name, sum(bytes) bytes  
               from dba_free_space  
                  group by tablespace_name) b  
  where a.tablespace_name = b.tablespace_name;

2、檢視資料庫安裝目錄

  ①通過.bash_profile檢視ORACLE_SID、ORACLE_HOME、ORACLE_BASE的路徑
  ②檢視源資料庫的審計檔案目錄
        show parameter audit
  ③檢視控制檔案的路徑和數量、資料檔案的路徑
        控制檔案:show parameter control
        資料檔案:select name from v$datafile;
  ④檢視是否開啟閃回區,如果開啟檢視對應路徑和大小
        show parameter recover
  ⑤檢視歸檔檔案路徑
        show parameter log_archive_dest
  ⑥檢視資料庫伺服器記憶體,目標例項配置要大於等於這個配置,否則在還原引數檔案時可能會出現SGA不夠的情況
        檢視伺服器記憶體:grep MemTotal /proc/meminfo
        檢視SGA大小:show parameter sga

二、準備目標伺服器環境

        根據上面源庫的資訊安裝Oracle軟體(不需要dbca建立資料庫),需要注意的是要提前建立審計目錄,在建立的時候要和源庫查詢出來的目錄一致,同時歸檔日誌目錄、資料檔案目錄、閃回區的目錄也一併建立完成。

三、遷移資料庫

        在環境全部準備完成後,開始準備遷移資料庫。遷移的策略為:遷移開始–全備–傳輸–恢復–增量備份–傳輸–增量恢復–增量歸檔恢復–關閉資料庫–拷貝redolog–完全恢復–遷移結束。

1、源庫進行0級全量備份

[oracle@vbox66 ~]$ rman target /

恢復管理器: Release 11.2.0.4.0 - Production on 星期六 9月 15 15:54:15 2018

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

已連線到目標資料庫: VBOX66DB (DBID=3269052407)

RMAN> run {
2>     allocate channel c1 device type disk;
3>     allocate channel c2 device type disk;
4>     allocate channel c3 device type disk;
5>     backup incremental level 0 database format `/u01/backup/all_db_%U.bak`;
6>       }

具體選擇channel可以根據資料庫表空間的大小和數量,此時檢視下當前資料庫的日誌資訊,以便之後拷貝增量日誌。

2、通過中間介質傳輸到目標伺服器進行恢復

①這裡我通過scp來代替中間介質傳輸

目標庫
  scp 192.168.3.66:/u01/backup/* ./

②全備檔案傳輸完成後首先還原引數檔案

a、首先建立一個啞參,目標資料庫啟動到nomount狀態,登入Rman恢復源庫spfile

cd $ORACLE_HOME
cd dbs
vi ceshi.ora
db_name=`aaa`
sqlplus / as sysdba
startup nomount pfile=`/u01/app/oracle/product/11.2.0/db_1/dbs/ceshi.ora`

b、從全備檔案中還原引數檔案

RMAN> restore spfile to `/u01/app/oracle/product/11.2.0/db_1/dbs/spfilevbox66in.ora` from `/u01/backup/all_db_1rtd6bac_1_1.bak`;

啟動 restore 於 2018-09-15 17:44:06
使用目標資料庫控制檔案替代恢復目錄
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=19 裝置型別=DISK

通道 ORA_DISK_1: 正在從 AUTOBACKUP /u01/backup/all_db_1rtd6bac_1_1.bak 還原 spfile
通道 ORA_DISK_1: 從 AUTOBACKUP 還原 SPFILE 已完成
完成 restore 於 2018-09-15 17:44:08

RMAN> 

spfile在那個備份集中可以在源庫Rman中執行list backup進行檢視

③、目標例項在還原完引數檔案之後還原控制檔案

a、在還原控制檔案之間先將以ceshi.ora引數檔案啟動的例項關閉,以還原的引數檔案啟動到nomount進行還原控制檔案


shutdown immediate;
exit;
sqlplus / as sysdba
startup nomount;

b、還原控制檔案


RMAN> restore controlfile from `/u01/backup/all_db_1qtd6b8b_1_1.bak`;

啟動 restore 於 2018-09-15 17:51:15
使用目標資料庫控制檔案替代恢復目錄
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=19 裝置型別=DISK

通道 ORA_DISK_1: 正在還原控制檔案
通道 ORA_DISK_1: 還原完成, 用時: 00:00:03
輸出檔名=/u01/app/oracle/oradata/vbox66db/control01.ctl
輸出檔名=/u01/app/oracle/oradata/vbox66db/control02.ctl
完成 restore 於 2018-09-15 17:51:19

RMAN> 

④、控制檔案還原完成之後開始還原全備資料檔案

a、控制檔案還原完成將資料庫啟動到mount狀態

SYS@vbox66in>alter database mount;

b、還原資料檔案


先將備份集註冊到控制檔案中
RMAN> catalog start with `/u01/backup`;

使用目標資料庫控制檔案替代恢復目錄
搜尋與樣式 /u01/backup 匹配的所有檔案

資料庫未知檔案的列表
=====================================
檔名: /u01/backup/all_db_1rtd6bac_1_1.bak
檔名: /u01/backup/all_db_1qtd6b8b_1_1.bak
檔名: /u01/backup/all_db_1otd6b7h_1_1.bak
檔名: /u01/backup/all_db_1ntd6b7g_1_1.bak

是否確實要將上述檔案列入目錄 (輸入 YES 或 NO)? yes
正在編制檔案目錄...
目錄編制完畢

已列入目錄的檔案的列表
=======================
檔名: /u01/backup/all_db_1rtd6bac_1_1.bak
檔名: /u01/backup/all_db_1qtd6b8b_1_1.bak
檔名: /u01/backup/all_db_1otd6b7h_1_1.bak
檔名: /u01/backup/all_db_1ntd6b7g_1_1.bak

開始還原資料檔案:


RMAN> restore database;

啟動 restore 於 2018-09-15 17:57:01
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=17 裝置型別=DISK

通道 ORA_DISK_1: 正在開始還原資料檔案備份集
通道 ORA_DISK_1: 正在指定從備份集還原的資料檔案
通道 ORA_DISK_1: 將資料檔案 00006 還原到 /u01/app/oracle/oradata/vbox66db/testdb01.dbf
通道 ORA_DISK_1: 將資料檔案 00007 還原到 /u01/app/oracle/oradata/vbox66db/JRJCTEST.dbf
通道 ORA_DISK_1: 將資料檔案 00008 還原到 /u01/app/oracle/oradata/vbox66db/oggtbs.dbf
通道 ORA_DISK_1: 正在讀取備份片段 /u01/backup/all_db_1ptd6b7h_1_1.bak
通道 ORA_DISK_1: 段控制程式碼 = /u01/backup/all_db_1ptd6b7h_1_1.bak 標記 = TAG20180915T155528
通道 ORA_DISK_1: 已還原備份片段 1
通道 ORA_DISK_1: 還原完成, 用時: 00:00:35
通道 ORA_DISK_1: 正在開始還原資料檔案備份集
通道 ORA_DISK_1: 正在指定從備份集還原的資料檔案
通道 ORA_DISK_1: 將資料檔案 00001 還原到 /u01/app/oracle/oradata/vbox66db/system01.dbf
通道 ORA_DISK_1: 將資料檔案 00004 還原到 /u01/app/oracle/oradata/vbox66db/users01.dbf
通道 ORA_DISK_1: 將資料檔案 00009 還原到 /u01/app/oracle/oradata/vbox66db/migtbs.dbf
通道 ORA_DISK_1: 正在讀取備份片段 /u01/backup/all_db_1otd6b7h_1_1.bak
通道 ORA_DISK_1: 段控制程式碼 = /u01/backup/all_db_1otd6b7h_1_1.bak 標記 = TAG20180915T155528
通道 ORA_DISK_1: 已還原備份片段 1
通道 ORA_DISK_1: 還原完成, 用時: 00:01:15
通道 ORA_DISK_1: 正在開始還原資料檔案備份集
通道 ORA_DISK_1: 正在指定從備份集還原的資料檔案
通道 ORA_DISK_1: 將資料檔案 00002 還原到 /u01/app/oracle/oradata/vbox66db/sysaux01.dbf
通道 ORA_DISK_1: 將資料檔案 00003 還原到 /u01/app/oracle/oradata/vbox66db/undotbs01.dbf
通道 ORA_DISK_1: 將資料檔案 00005 還原到 /u01/app/oracle/oradata/vbox66db/test01.dbf
通道 ORA_DISK_1: 正在讀取備份片段 /u01/backup/all_db_1ntd6b7g_1_1.bak
通道 ORA_DISK_1: 段控制程式碼 = /u01/backup/all_db_1ntd6b7g_1_1.bak 標記 = TAG20180915T155528
通道 ORA_DISK_1: 已還原備份片段 1
通道 ORA_DISK_1: 還原完成, 用時: 00:01:45
完成 restore 於 2018-09-15 18:00:37

RMAN> 

3、對源庫進行1級增量備份

①此次為模擬,在全備之後在源庫進行操作模擬正常資料庫工作

SYS@vbox66in>create table scott.gaowen(id int,name varchar(30));
SYS@vbox66in>insert into scott.gaowen values(1,`aaa`);
SYS@vbox66in>insert into scott.gaowen values(2,`bbb`);
SYS@vbox66in>insert into scott.gaowen values(3,`ccc`);
SYS@vbox66in>commit;
SYS@vbox66in>alter system archive log current;
系統已更改。
SYS@vbox66in>alter system archive log current;
系統已更改。
SYS@vbox66in>alter system archive log current;
系統已更改。
SYS@vbox66in>

②進行1級增量備份

RMAN> backup incremental level 1 database format `/u01/backup/incr_db_%U.bak`;

啟動 backup 於 15-9月 -18
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在啟動增量級別 1 資料檔案備份集
通道 ORA_DISK_1: 正在指定備份集內的資料檔案
輸入資料檔案: 檔案號=00002 名稱=/u01/app/oracle/oradata/vbox66db/sysaux01.dbf
輸入資料檔案: 檔案號=00001 名稱=/u01/app/oracle/oradata/vbox66db/system01.dbf
輸入資料檔案: 檔案號=00008 名稱=/u01/app/oracle/oradata/vbox66db/oggtbs.dbf
輸入資料檔案: 檔案號=00006 名稱=/u01/app/oracle/oradata/vbox66db/testdb01.dbf
輸入資料檔案: 檔案號=00007 名稱=/u01/app/oracle/oradata/vbox66db/JRJCTEST.dbf
輸入資料檔案: 檔案號=00009 名稱=/u01/app/oracle/oradata/vbox66db/migtbs.dbf
輸入資料檔案: 檔案號=00003 名稱=/u01/app/oracle/oradata/vbox66db/undotbs01.dbf
輸入資料檔案: 檔案號=00004 名稱=/u01/app/oracle/oradata/vbox66db/users01.dbf
輸入資料檔案: 檔案號=00005 名稱=/u01/app/oracle/oradata/vbox66db/test01.dbf
通道 ORA_DISK_1: 正在啟動段 1 於 15-9月 -18
通道 ORA_DISK_1: 已完成段 1 於 15-9月 -18
段控制程式碼=/u01/backup/incr_db_1std6jag_1_1.bak 標記=TAG20180915T181335 註釋=NONE
通道 ORA_DISK_1: 備份集已完成, 經過時間:00:01:35
通道 ORA_DISK_1: 正在啟動增量級別 1 資料檔案備份集
通道 ORA_DISK_1: 正在指定備份集內的資料檔案
備份集內包括當前控制檔案
備份集內包括當前的 SPFILE
通道 ORA_DISK_1: 正在啟動段 1 於 15-9月 -18
通道 ORA_DISK_1: 已完成段 1 於 15-9月 -18
段控制程式碼=/u01/backup/incr_db_1ttd6jdf_1_1.bak 標記=TAG20180915T181335 註釋=NONE
通道 ORA_DISK_1: 備份集已完成, 經過時間:00:00:01
完成 backup 於 15-9月 -18
RMAN> 

4、通過中間介質將增量備份傳輸到目標例項進行恢復

①這裡通過scp來模擬代替中間介質傳輸

scp 192.168.3.66:/u01/backup/inc* ./

②還原增量備份

a、先將備份集註冊到控制檔案中

RMAN> catalog start with `/u01/backup`;

搜尋與樣式 /u01/backup 匹配的所有檔案

資料庫未知檔案的列表
=====================================
檔名: /u01/backup/incr_db_1std6jag_1_1.bak
檔名: /u01/backup/incr_db_1ttd6jdf_1_1.bak

是否確實要將上述檔案列入目錄 (輸入 YES 或 NO)? yes
正在編制檔案目錄...
目錄編制完畢

已列入目錄的檔案的列表
=======================
檔名: /u01/backup/incr_db_1std6jag_1_1.bak
檔名: /u01/backup/incr_db_1ttd6jdf_1_1.bak

RMAN> 

b、恢復增量備份

RMAN> catalog start with `/u01/backup`;

搜尋與樣式 /u01/backup 匹配的所有檔案

資料庫未知檔案的列表
=====================================
檔名: /u01/backup/incr_db_1std6jag_1_1.bak
檔名: /u01/backup/incr_db_1ttd6jdf_1_1.bak

是否確實要將上述檔案列入目錄 (輸入 YES 或 NO)? yes
正在編制檔案目錄...
目錄編制完畢

已列入目錄的檔案的列表
=======================
檔名: /u01/backup/incr_db_1std6jag_1_1.bak
檔名: /u01/backup/incr_db_1ttd6jdf_1_1.bak

RMAN> recover database;

啟動 recover 於 2018-09-15 18:22:01
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在開始還原增量資料檔案備份集
通道 ORA_DISK_1: 正在指定從備份集還原的資料檔案
資料檔案 00001 的還原目標: /u01/app/oracle/oradata/vbox66db/system01.dbf
資料檔案 00002 的還原目標: /u01/app/oracle/oradata/vbox66db/sysaux01.dbf
資料檔案 00003 的還原目標: /u01/app/oracle/oradata/vbox66db/undotbs01.dbf
資料檔案 00004 的還原目標: /u01/app/oracle/oradata/vbox66db/users01.dbf
資料檔案 00005 的還原目標: /u01/app/oracle/oradata/vbox66db/test01.dbf
資料檔案 00006 的還原目標: /u01/app/oracle/oradata/vbox66db/testdb01.dbf
資料檔案 00007 的還原目標: /u01/app/oracle/oradata/vbox66db/JRJCTEST.dbf
資料檔案 00008 的還原目標: /u01/app/oracle/oradata/vbox66db/oggtbs.dbf
資料檔案 00009 的還原目標: /u01/app/oracle/oradata/vbox66db/migtbs.dbf
通道 ORA_DISK_1: 正在讀取備份片段 /u01/backup/incr_db_1std6jag_1_1.bak
通道 ORA_DISK_1: 段控制程式碼 = /u01/backup/incr_db_1std6jag_1_1.bak 標記 = TAG20180915T181335
通道 ORA_DISK_1: 已還原備份片段 1
通道 ORA_DISK_1: 還原完成, 用時: 00:00:15

正在開始介質的恢復

無法找到歸檔日誌
歸檔日誌執行緒=1 序列=56
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: recover 命令 (在 09/15/2018 18:22:19 上) 失敗
RMAN-06054: 介質恢復正在請求未知的執行緒 1 序列 56 的歸檔日誌以及起始 SCN 2027595

RMAN> 

        從恢復的資訊中我們可以看到資料沒有完全恢復,需要增量歸檔日誌檔案。接下來需要將全備之後生成的增量日誌傳輸到目標例項

5、傳輸源庫增量日誌到目標例項進行資料恢復

①從增量恢復資訊中我們可以看到需要56號歸檔日誌,那麼就需要將56號之後的歸檔日誌傳輸到目標例項,我這裡通過scp代替中間介質

scp 192.168.3.66:/u01/app/oracle/oradata/arch/1_56_974146828.dbf ./
scp 192.168.3.66:/u01/app/oracle/oradata/arch/1_57_974146828.dbf ./
scp 192.168.3.66:/u01/app/oracle/oradata/arch/1_58_974146828.dbf ./

②進行增量日誌恢復

RMAN> recover database;

啟動 recover 於 2018-09-15 18:33:38
使用通道 ORA_DISK_1

正在開始介質的恢復

歸檔日誌檔名=/u01/app/oracle/oradata/arch/1_56_974146828.dbf 執行緒=1 序列=56
歸檔日誌檔名=/u01/app/oracle/oradata/arch/1_57_974146828.dbf 執行緒=1 序列=57
歸檔日誌檔名=/u01/app/oracle/oradata/arch/1_58_974146828.dbf 執行緒=1 序列=58
無法找到歸檔日誌
歸檔日誌執行緒=1 序列=59
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: recover 命令 (在 09/15/2018 18:33:39 上) 失敗
RMAN-06054: 介質恢復正在請求未知的執行緒 1 序列 59 的歸檔日誌以及起始 SCN 2040040

RMAN> 

從增量日誌恢復資訊中可以看到還需要59號日誌檔案,如果此時59號檔案就是當前redo log檔案的話就關閉源例項資料庫,將redo file檔案拷貝到目標例項進行恢復,如果不是那就重複上訴步驟直到是redo file檔案為止,這樣就可以最小化停機時間。

③由於這裡是模擬,59號檔案就是當前redo file,現在關閉遠視力資料庫進行拷貝redo file檔案到目標例項

a、源例項關閉資料庫

shutdown immediate;

b、將當前redo file傳輸到目標例項

scp 192.168.3.66:/u01/app/oracle/oradata/vbox66db/redo* ./

6、當redo file拷貝完成後進行最後的恢復資料庫

①進行恢復資料庫

RMAN> recover database;

啟動 recover 於 2018-09-15 18:42:00
使用通道 ORA_DISK_1

正在開始介質的恢復

執行緒 1 序列 59 的歸檔日誌已作為檔案 /u01/app/oracle/oradata/vbox66db/redo02.log 存在於磁碟上
歸檔日誌檔名=/u01/app/oracle/oradata/vbox66db/redo02.log 執行緒=1 序列=59
介質恢復完成, 用時: 00:00:00
完成 recover 於 2018-09-15 18:42:01

RMAN> 

②以resetlogs方式開啟資料庫


SYS@vbox66in>alter database open resetlogs;

資料庫已更改。

SYS@vbox66in>

③檢視之前建立的表資料

SYS@vbox66in>select * from scott.gaowen;

    ID NAME
---------- ------------------------------
     1 aaa
     2 bbb
     3 ccc

SYS@vbox66in>

7、重建臨時表空間

由於備份恢復時不備份臨時表空間,所以還原之後臨時表空間檔案就沒有,需要重建。

SYS@vbox66in>create temporary tablespace temp2 tempfile `/u01/app/oracle/oradata/vbox66db/temp02.dbf` size 10M autoextend on;
SYS@vbox66in>alter database default temporary tablespace temp2;
SYS@vbox66in>drop tablespace temp including contents and datafiles;
SYS@vbox66in>create temporary tablespace temp tempfile `/u01/app/oracle/oradata/vbox66db/temp01.dbf` size 10M autoextend on;
SYS@vbox66in>alter database default temporary tablespace temp;
SYS@vbox66in>drop tablespace temp2 including contents and datafiles;

至此資料庫遷移完畢!


相關文章