幾種ASM與File System資料檔案轉移方法

不一樣的天空w發表於2018-01-26

 

Oracle 10g 引入 ASM 全新的檔案管理系統。進入 11g 之後, ASM+RAC+DG 成為標準 MAA 的配置結構。簡單的說, ASM 就是一種軟體的實現的分散式儲存結構,和傳統的檔案系統有一定差距。

 

在實踐中,我們會遇到 ASM File System 之間檔案轉儲過程。同檔案系統不同, ASM 是不能夠直接訪問的。本篇介紹幾種實現 ASM File System 資料檔案轉儲策略。

 

1 、環境介紹

 

實驗使用 Oracle Linux 環境,對應底層 Oracle 11g 單例項 +ASM 儲存方案。

 

 

[root@SimpleLinux ~]# uname -r

2.6.18-128.el5

[root@SimpleLinux ~]# ps -ef | grep pmon

grid      3214     1  0 13:53 ?        00:00:00 asm_pmon_+ASM

oracle    3294     1  0 13:53 ?        00:00:00 ora_pmon_ora11g

root      3376  3107  0 13:53 pts/0    00:00:00 grep pmon

 

資料庫使用 11gR2 版本。

 

SQL> select * from v$version;

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production

PL/SQL Release 11.2.0.3.0 - Production

CORE  11.2.0.3.0 Production

TNS for Linux: Version 11.2.0.3.0 - Production

NLSRTL Version 11.2.0.3.0 – Production

 

建立一個資料檔案目錄。

 

[oracle@SimpleLinux oracle]$ cd $ORACLE_HOME

[oracle@SimpleLinux db_1]$ mkdir oradata

[oracle@SimpleLinux db_1]$ ls -l | grep oradata

drwxr-xr-x  2 oracle oinstall  4096 Dec 27 13:56 oradata

 

資料庫採用歸檔模式, 注意:下述實驗要求在歸檔模式才能實現。

 

 

SQL> archive log list;

Database log mode              Archive Mode

Automatic archival             Enabled

Archive destination            USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence     25

Next log sequence to archive   27

Current log sequence           27

 

建立一個實驗檔案表空間。

 

 

SQL> create tablespace test datafile '/u01/app/oracle/product/11.2.0/db_1/oradata/testtbl.dbf' size 100m

  2  extent management local uniform size 1m

  3  segment space management auto;

 

Tablespace created

 

 

SQL> select file_name, tablespace_name from dba_data_files;

 

FILE_NAME                                          TABLESPACE_NAME

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

+DATA/ora11g/datafile/users.259.825944329          USERS

+DATA/ora11g/datafile/undotbs1.258.825944329       UNDOTBS1

+DATA/ora11g/datafile/sysaux.257.825944327         SYSAUX

+DATA/ora11g/datafile/system.256.825944325         SYSTEM

+DATA/ora11g/datafile/example.265.825944513        EXAMPLE

/u01/app/oracle/product/11.2.0/db_1/oradata/testtb TEST

l.dbf                                              

 

6 rows selected

 

2 ASMCMD 命令

 

ASMCMD Oracle 提供的管理 ASM 的命令列工具。進入 11g 之後, ASMCMD 提供了 cp 命令,仿照 Linux 平臺的 cp 命令。 ASMCMD 是我們事先複製的一種選擇。

 

我們實驗是將檔案系統的 TEST 檔案,轉移到 +DATA ASM DiskGroup 中。

 

首先切換一下 logfile

 

 

SQL> alter system switch logfile;

System altered

 

-- 我們事先 online 移動,是進行 offline 之後才行;

SQL> alter database datafile '/u01/app/oracle/product/11.2.0/db_1/oradata/testtbl.dbf' offline;

Database altered

 

SQL> select file_name, online_status from dba_data_files where file_id=6;

 

FILE_NAME                                          ONLINE_STATUS

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

/u01/app/oracle/product/11.2.0/db_1/oradata/testtb RECOVER

l.dbf                                             

 

進入 ASMCMD 命令列進行處理。

 

-- 使用 grid 使用者,注意這個過程是伴隨著登入 ASM 例項過程的。

[oracle@SimpleLinux oradata]$ su - grid

Password:

[grid@SimpleLinux ~]$ asmcmd

ASMCMD> cp /u01/app/oracle/product/11.2.0/db_1/oradata/testtbl.dbf +DATA/ora11g/datafile/testtbl.dbf

copying /u01/app/oracle/product/11.2.0/db_1/oradata/testtbl.dbf -> +DATA/ora11g/datafile/testtbl.dbf

 

ASM 中,檢視到檔案的確儲存在目錄了。

 

 

ASMCMD> ls -l

Type      Redund  Striped  Time             Sys  Name

DATAFILE  UNPROT  COARSE   DEC 27 13:00:00  Y    EXAMPLE.265.825944513

DATAFILE  UNPROT  COARSE   DEC 27 13:00:00  Y    SYSAUX.257.825944327

DATAFILE  UNPROT  COARSE   DEC 27 13:00:00  Y    SYSTEM.256.825944325

DATAFILE  UNPROT  COARSE   DEC 27 13:00:00  Y    UNDOTBS1.258.825944329

DATAFILE  UNPROT  COARSE   DEC 27 13:00:00  Y    USERS.259.825944329

                                            N    testtbl.dbf => +DATA/ASM/DATAFILE/testtbl.dbf.268.835279797

 

另外在 Oracle 的控制檔案體系中,修改檔名稱。

 

 

SQL> alter database rename file '/u01/app/oracle/product/11.2.0/db_1/oradata/testtbl.dbf' to '+DATA/ora11g/datafile/testtbl.dbf';

 

Database altered

 

SQL> select file_name, file_id from dba_data_files;

 

FILE_NAME                                             FILE_ID

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

(篇幅原因,有省略 ……

+DATA/ora11g/datafile/example.265.825944513                 5

+DATA/ora11g/datafile/testtbl.dbf                           6

 

6 rows selected

 

由於進行 online 操作,對資料檔案 6 進行恢復、上線。

 

SQL> alter database recover datafile 6;

Database altered

 

SQL> alter database datafile 6 online;

Database altered

 

SQL> select file_name, file_id, online_status from dba_data_files;

 

FILE_NAME                                             FILE_ID ONLINE_STATUS

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

(篇幅原因,有省略 ……

+DATA/ora11g/datafile/example.265.825944513                 5 ONLINE

+DATA/ora11g/datafile/testtbl.dbf                           6 ONLINE

 

6 rows selected

 

原來的資料檔案,刪掉就好了。

 

[oracle@SimpleLinux oradata]$ ls -l

total 102512

-rw-r----- 1 oracle asmadmin 104865792 Dec 27 14:02 testtbl.dbf

[oracle@SimpleLinux oradata]$ rm testtbl.dbf

 

試驗成功。

 

3 DBMS_FILE_TRANSFER 包方法

 

Oracle PL/SQL 中包 dbms_file_transfer 也可以實現傳輸。其中的 copy_file 過程,可以實現將檔案傳輸跨越 ASM 和檔案系統。

 

使用 dbms_file_transfer 包前提需要指定檔案目錄,在 Oracle 中是透過 directory 物件實現的。

 

 

SQL> create directory souredir as '+DATA/ora11g/datafile/';

Directory created

 

SQL> create directory destdir as '/u01/app/oracle/product/11.2.0/db_1/oradata';

Directory created

 

本方法我們將上節中的 ASM 檔案傳輸到 File System 中。

 

 

SQL> select file_name, file_id, online_status from dba_data_files;

 

FILE_NAME                                             FILE_ID ONLINE_STATUS

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

(篇幅原因,有省略 ……

+DATA/ora11g/datafile/example.265.825944513                 5 ONLINE

+DATA/ora11g/datafile/testtbl.dbf                           6 RECOVER – 已經被 offline 狀態的資料檔案

 

6 rows selected

 

 

SQL> begin

  2    dbms_file_transfer.copy_file(source_directory_object => 'souredir',

  3                                 source_file_name => 'testtbl.dbf',

  4                                 destination_directory_object => 'destdir',

  5                                 destination_file_name => 'testtbl.dbf');

  6  end;

  7  /

PL/SQL procedure successfully completed

 

檔案系統中檢視到檔案 testtbl.dbf

 

[oracle@SimpleLinux oradata]$ ls -l

total 102512

-rw-r----- 1 oracle asmadmin 104865792 Dec 27 14:34 testtbl.dbf

 

SQL> alter database rename file '+DATA/ora11g/datafile/testtbl.dbf' to '/u01/app/oracle/product/11.2.0/db_1/oradata/testtbl.dbf';

Database altered

 

SQL> alter database recover datafile 6;

Database altered

 

對資料檔案 online 操作。

 

 

SQL> alter database datafile '/u01/app/oracle/product/11.2.0/db_1/oradata/testtbl.dbf' online;

Database altered

 

SQL> select file_name, file_id, online_status from dba_data_files;

 

FILE_NAME                                             FILE_ID ONLINE_STATUS

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

(篇幅原因,有省略 ……

+DATA/ora11g/datafile/example.265.825944513                 5 ONLINE

/u01/app/oracle/product/11.2.0/db_1/oradata/testtb          6 ONLINE

l.dbf                                                       

 

6 rows selected

 

試驗成功。

 

4 RMAN 方法

 

在沒有 cp 命令之前, RMAN 是一種比較常用的方法。我們先將檔案 offline

 

SQL> alter database datafile '/u01/app/oracle/product/11.2.0/db_1/oradata/testtbl.dbf' offline;

Database altered

 

啟動 RMAN copy 過程。

 

 

RMAN> connect target /

 

connected to target database: ORA11G (DBID=4222144573)

using target database control file instead of recovery catalog

 

RMAN> copy datafile '/u01/app/oracle/product/11.2.0/db_1/oradata/testtbl.dbf' to '+RECO'

2> ;

 

Starting backup at 27-DEC-13

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=41 device type=DISK

channel ORA_DISK_1: starting datafile copy

input datafile file number=00006 name=/u01/app/oracle/product/11.2.0/db_1/oradata/testtbl.dbf

output file name=+RECO/ora11g/datafile/test.282.835281667 tag=TAG20131227T144106 RECID=2 STAMP=835281676

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

Finished backup at 27-DEC-13

 

更改檔名,進行資料檔案 online 操作。

 

 

SQL> alter database rename file '/u01/app/oracle/product/11.2.0/db_1/oradata/testtbl.dbf' to '+RECO/ora11g/datafile/test.282.835281667';

Database altered

 

SQL> alter database recover datafile 6;

Database altered

 

SQL> alter database datafile 6 online;

Database altered

 

試驗成功。

 

5 、結論

 

隨著 ASM 的日益普及,我們進行檔案系統和 ASM 之間遷移的過程越來越多。使用好現有工具,可以簡化我們的操作過程。

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31397003/viewspace-2150537/,如需轉載,請註明出處,否則將追究法律責任。

相關文章