Oracle

使用原始數據文件將數據庫複製到另一台伺服器

  • February 4, 2022

我正在嘗試使用原始數據文件將伺服器 1的數據庫複製到伺服器 2 。我正在使用 Linux 7 和 Oracle 11g R2。我在伺服器 2中使用相同的 SID 執行實例,但文件結構不同。該數據庫約為 85 GB。我有數據文件、控製文件、redolog 文件、spfile 和 init.ora。有人可以向我解釋以這種方式複製的方法嗎?

可以使用 rman 來複製數據庫。這是數據庫備份和恢復使用者指南

但是現在讓我們假設您有這些文件的副本,這些文件是在數據庫關閉時製作的,並且已經復製到目標系統的位置。

在目標伺服器 1 上,您擁有與源伺服器 1 上相同類型的作業系統。在目標伺服器上,您擁有與源伺服器上相同更新檔級別的相同 Oracle 版本。您可以通過設置 oracle 環境並執行命令來檢查這一點

$ORACLE_HOME/OPatch/opatch lsinventory

並比較兩台伺服器的輸出。

如果您沒有合適的環境,您可以使用 Oracle Universal Installer 從源伺服器複製 Oracle 軟體。

因此,假設您安裝了正確的軟體並設置了目標伺服器的 Oracle 實例的正確環境。

如果你startup nomount在 sqlplus 中做一個數據庫會發生什麼?

sqlplus 首先搜尋

${ORACLE_HOME}/dbs/pfile${ORACLE_SID}.ora

如果這樣的文件不存在,它會搜尋

${ORACLE_HOME}/dbs/init${ORACLE_SID}.ora

並使用此文件中給出的參數啟動 oracle。我對此不是 100% 確定的。也許 sqlplus 啟動 oracle 執行檔並且 oracle 執行檔搜尋這些文件。但這對我們的目的無關緊要。

所以這些文件的參數應該有合理的值。這意味著,這些文件中的路徑應該指向正確的文件。

如果沒有,您必須更改它們。可以使用文本編輯器修改 init.ora 文件。必須通過執行將 spfile 轉換為 init.ora 文件

create pfile='/tmp/myfile.txt' from spfile='&absolute_spfile_path';

在實例未執行時在 sqlplus 中。&absolute_spfile_path必須用正確的路徑代替。

然後您可以/tmp/myfile.tx使用文本編輯器編輯文件。您可以更改路徑,如果文件中包含實例名稱,則也必須對其進行修改。可以調整記憶體參數。實例寫入的下劃線參數應該被刪除,例如’_sga_target’和類似的參數。

然後通過發出創建修改後的 spfile

create spfile='&absolute_spfile_path' from pfile='/tmp/myfile.txt';

在開始之前,您可以復製文件,以便在出現問題時重新開始。

複製 init.ora 和 spfile.ora、控製文件、重做日誌文件以及 SYS、SYSAUX 和 undo 表空間的數據文件。其餘表空間的數據文件使用適當的 Linux 命令(chmod)只讀,因此它們不能被 oracle 修改。源數據庫不需要臨時文件。

現在您可以使用

startup mount

如果一切正常,請檢查警報日誌。如果有錯誤,則修復它們。

如果一切正常,則掛載數據庫

alter database mount;

現在讀取控製文件。您現在可以重命名所有文件。在控製文件中儲存了它們的舊名稱。如果你做一個,你可以看到這個

select name
from v$datafile;

發出一個

alter database rename file '&old_name' to '&new_name'; 

直到所有數據文件都被刪除。

可以使用相同的命令重命名日誌文件。

select member
from v$logfile;

顯示控製文件中重做日誌文件的名稱。

您可以將臨時文件離線以避免打開數據庫時出現錯誤消息

select name 
from v$tempfile;

然後顯示臨時文件的名稱。

alter database '&tempfileName' offline;

使文件離線。

現在可以打開數據庫了

alte database open;

現在將具有正確路徑和大小的新臨時文件添加到臨時表空間。

alter tablespace TEMP add tempfile ...;

然後刪除舊的

alter tablespace TEMP drop tempfile ...;

如果您已將數據文件設為只讀,然後關閉數據庫,則將文件設為讀/寫並再次啟動數據庫。

現在你完成了。

作為旁注,如果您想複製所有文件,停止數據庫不是“必須”的,您可以使用:

改變數據庫開始備份;

{複製數據文件}

更改數據庫結束備份;

這樣,您將擁有可用的數據庫,並且您將能夠複製數據文件並按照之前解釋的方式進行複製。

引用自:https://dba.stackexchange.com/questions/197042