天天看點

dataguard備庫的資料檔案的遷移

關于移動資料庫檔案,之前寫了一篇博文,http://blog.itpub.net/23718752/viewspace-1127910/

但是在備庫中還是有一些的差别。最近因為對備庫做了一些規劃,新增加了幾個分區,想把資料庫的一部分檔案放到SSD上。是以這個時候在現有的備庫基礎上需要移動備庫的資料庫檔案。這裡就不局限于資料檔案了,不過目前的測試情況來說,還是資料檔案是重點,還是主要以資料檔案為例。

在備庫中目前嘗試了兩種方式,可以采用rename datafile的方式或者使用rman的方式,對于日志檔案還是直接重建會比較友善。

采用rename datafile的方式。

首先在備庫取消日志應用

SQL> recover managed standby database cancel;

Media recovery complete.

作業系統級移動資料檔案。

SQL> host mv /home/U01/app/oracle/oradata/test04/testdata01.dbf /home/U01/testdata01.dbf

使用rename datafile來移動資料檔案,其實就是建立一個映射關系。

SQL> alter database rename file '/home/U01/app/oracle/oradata/test04/testdata01.dbf'  to '/home/U01/testdata01.dbf';

Database altered.

修改完畢後,就可以修改備庫檔案管理模式為auto了。

SQL> alter system set standby_file_management=auto;

System altered.

修改完成之後,檢視資料檔案的情況,發現資料字典層面已經改過來了。

SQL> select name from v$datafile;

NAME

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

/home/U01/app/oracle/oradata/test04/system01.dbf

/home/U01/app/oracle/oradata/test04/sysaux01.dbf

/home/U01/app/oracle/oradata/test04/undotbs01.dbf

/home/U01/app/oracle/oradata/test04/users01.dbf

/home/U01/testdata01.dbf

/home/U01/app/oracle/oradata/test04/testidx01.dbf

6 rows selected.

把備庫啟動到open,即read only狀态

SQL> alter database open;

11g的備庫還是啟用ADG。

SQL> recover managed standby database disconnect from session using current logfile;

然後再次檢視資料檔案的細節。

SQL> col file_name format a50

SQL> select file_name,status,online_status from dba_data_files;

FILE_NAME                                          STATUS             ONLINE_STATUS

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

/home/U01/app/oracle/oradata/test04/users01.dbf    AVAILABLE          ONLINE

/home/U01/app/oracle/oradata/test04/undotbs01.dbf  AVAILABLE          ONLINE

/home/U01/app/oracle/oradata/test04/sysaux01.dbf   AVAILABLE          ONLINE

/home/U01/app/oracle/oradata/test04/system01.dbf   AVAILABLE          SYSTEM

/home/U01/testdata01.dbf                           AVAILABLE          ONLINE

/home/U01/app/oracle/oradata/test04/testidx01.dbf  AVAILABLE          ONLINE

由此可以看出檔案遷移已經成功。

另外一種是使用rman的方式,但是原理還是相通的。

如果在主庫中移動資料檔案,可以采用如下的方式。

rman target /

COPY DATAFILE 5 to '/DATA/app/testdata01.dbf';

sql 'alter database datafile 5 offline';

switch datafile 5 to copy;

recover datafile 5;

sql 'alter database datafile 5 online';

在備庫中不能這麼使用,還是有一些不同之處,首先檢視資料檔案的情況。

FILE_NAME                                                       FILE_ID

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

/home/U01/app/oracle/oradata/test04/users01.dbf                       4

/home/U01/app/oracle/oradata/test04/undotbs01.dbf                     3

/home/U01/app/oracle/oradata/test04/sysaux01.dbf                      2

/home/U01/app/oracle/oradata/test04/system01.dbf                      1

/home/U01/testdata01.dbf                                              5

/home/U01/app/oracle/oradata/test04/testidx01.dbf                     6

然後在mount狀态下,這個時候備庫檔案管理模式為auto或者manual就沒有直接的影響了。

SQL> show parameter standby

NAME                                 TYPE                   VALUE

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

standby_archive_dest                 string                 ?/dbs/arch

standby_file_management              string                 AUTO

還是手工聲明取消日志應用

然後開始rman中的資料檔案遷移,把5号資料檔案遷移到某個指定的路徑下。

RMAN> COPY DATAFILE 5 to '/home/U01/app/oracle/oradata/test04/testdata01.dbf';

Starting backup at 2016-02-26 16:19:24

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=102 device type=DISK

channel ORA_DISK_1: starting datafile copy

input datafile file number=00005 name=/home/U01/testdata01.dbf

output file name=/home/U01/app/oracle/oradata/test04/testdata01.dbf tag=TAG20160226T161925 RECID=14 STAMP=904839566

channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01

Finished backup at 2016-02-26 16:19:26

上面的日志其實在搭建dataguard的時候會看到,是不是很熟悉。然後聲明一個切換結束。

RMAN> switch datafile 5 to copy;

datafile 5 switched to datafile copy "/home/U01/app/oracle/oradata/test04/testdata01.dbf"

然後聲明資料檔案為Online狀态。

>sql 'alter database datafile 5 online';  --不運作實際上也會是Online

移動完成之後,開始檢視遷移的情況,發現已經沒有問題了。

FILE_NAME                                               BYTES ONLINE_STATUS

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

/home/U01/app/oracle/oradata/test04/users01.dbf      10485760 ONLINE

/home/U01/app/oracle/oradata/test04/undotbs01.dbf    73400320 ONLINE

/home/U01/app/oracle/oradata/test04/sysaux01.dbf    796917760 ONLINE

/home/U01/app/oracle/oradata/test04/system01.dbf    786432000 SYSTEM

/home/U01/app/oracle/oradata/test04/testdata01.dbf  209715200 ONLINE

/home/U01/app/oracle/oradata/test04/testidx01.dbf   104857600 ONLINE

是以綜上的感覺來看,rman的方式還是比較推薦,至少操作友善快捷,而且dataguard的原生支援就是如此,而且限制也少。