[Oracle] ASM上でのデータファイルの移動（非ASMからASMもOK）

# RMANを使って、非ASMからASMにデータファイルを移動してみた

## 環境
Oracle Linux 8.8 (Oracle Cloud)　
Oracle Database 19c (ASM環境）
マルチテナント構成
アーカイブログモード

## やったこと
Oracleデータベースで表領域を構成するデータファイルを非ASM領域からASMに移動する。
※ASMからASMでも同じ方法になります。

## 背景
ASMを使ったデータベースなのに、ローカルディスクに表領域（データファイル）を作成した人がいた、、

## 大まかな流れ
1. RMANでデータファイルを新しい場所にコピー
2. データファイルをオフラインにする
3. 制御ファイル内のデータファイルパスを変更する
4. 新しい場所のデータファイルをリカバリして使用できるようにする
5. データファイルをオンラインにする

##### 参考マニュアル
https://docs.oracle.com/cd/F19136_01/ostmg/asm-migration-rman.html#GUID-3B8D0956-0888-452D-A9E4-9FB8D98577E0

マニュアルは非CDB環境の手順のため、以下はCDB対応しています。


## 実行例

RMANでCDBに接続して操作します。（PDBに接続して行うと途中でエラーになります）

まずは状況の確認でREPORT SCHEMAコマンドを実行。
DATA表領域が想定外の場所に作成されています（★の箇所）
```[oracle@db19c oradata]$ rman target /

Recovery Manager: Release 19.0.0.0.0 - Production on Tue Jan 23 12:56:46 2024
Version 19.19.0.0.0

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

connected to target database: DB1129 (DBID=3959008139)

RMAN> report schema;

using target database control file instead of recovery catalog
Report of database schema for database with db_unique_name DB1129_WN6_NRT

List of Permanent Datafiles
===========================
File Size(MB) Tablespace           RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1    1050     SYSTEM               YES     +DATA/DB1129_WN6_NRT/DATAFILE/system.261.1154129965
3    1510     SYSAUX               NO      +DATA/DB1129_WN6_NRT/DATAFILE/sysaux.268.1154129949
4    140      UNDOTBS1             YES     +DATA/DB1129_WN6_NRT/DATAFILE/undotbs1.260.1154129987
5    410      PDB$SEED:SYSTEM      NO      +DATA/DB1129_WN6_NRT/F9D6EA8CCAA09630E0530905F40A5107/DATAFILE/system.264.1154129687
6    390      PDB$SEED:SYSAUX      NO      +DATA/DB1129_WN6_NRT/F9D6EA8CCAA09630E0530905F40A5107/DATAFILE/sysaux.265.1154129687
7    50       PDB$SEED:UNDOTBS1    NO      +DATA/DB1129_WN6_NRT/F9D6EA8CCAA09630E0530905F40A5107/DATAFILE/undotbs1.266.1154129687
8    420      DB1129_PDB1:SYSTEM   YES     +DATA/DB1129_WN6_NRT/0B40016CF0DE0436E0638400000AFBE7/DATAFILE/system.273.1154130319
9    430      DB1129_PDB1:SYSAUX   NO      +DATA/DB1129_WN6_NRT/0B40016CF0DE0436E0638400000AFBE7/DATAFILE/sysaux.271.1154130331
10   70       DB1129_PDB1:UNDOTBS1 YES     +DATA/DB1129_WN6_NRT/0B40016CF0DE0436E0638400000AFBE7/DATAFILE/undotbs1.270.1154130339
11   5        USERS                NO      +DATA/DB1129_WN6_NRT/DATAFILE/users.269.1154130501
12   5        DB1129_PDB1:USERS    NO      +DATA/DB1129_WN6_NRT/0B40016CF0DE0436E0638400000AFBE7/DATAFILE/users.274.1154130501
14   10       B                    NO      +DATA/DB1129_WN6_NRT/DATAFILE/b.dbf
15   10       C                    NO      +DATA/DB1129_WN6_NRT/DATAFILE/c.283.1158983669
★16   10       DB1129_PDB1:DATA     NO      /u01/app/oracle/oradata/data01.dbf　★

List of Temporary Files
=======================
File Size(MB) Tablespace           Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
1    84       TEMP                 32767       +DATA/DB1129_WN6_NRT/TEMPFILE/temp.263.1154130037
2    224      PDB$SEED:TEMP        32767       +DATA/DB1129_WN6_NRT/0B3FDF6CEAAC4F7CE0638400000AF374/TEMPFILE/temp.267.1154129725
4    224      DB1129_PDB1:TEMP     4095        +DATA/DB1129_WN6_NRT/0B40016CF0DE0436E0638400000AFBE7/TEMPFILE/temp.272.1154130315
```


backupコマンドで、データファイルをASM(新しい場所)にコピーします。
```
RMAN> backup as copy datafile "/u01/app/oracle/oradata/data01.dbf" format "+DATA";

Starting backup at 23-JAN-24
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=210 device type=DISK
channel ORA_DISK_1: starting datafile copy
input datafile file number=00016 name=/u01/app/oracle/oradata/data01.dbf
output file name=+DATA/DB1129_WN6_NRT/0B40016CF0DE0436E0638400000AFBE7/DATAFILE/data.282.1159016295 tag=TAG20240123T125814 RECID=6 STAMP=1159016294
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
Finished backup at 23-JAN-24

Starting Control File and SPFILE Autobackup at 23-JAN-24
piece handle=+RECO/DB1129_WN6_NRT/AUTOBACKUP/2024_01_23/s_1159016295.271.1159016295 comment=NONE
Finished Control File and SPFILE Autobackup at 23-JAN-24

RMAN> exit
Recovery Manager complete.
```

SQL*PlusでPDBに接続します。以下の操作ではalter sessionでPDBに切り替えています。
```
[oracle@db19c oradata]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Tue Jan 23 13:01:43 2024
Version 19.19.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.19.0.0.0

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 DB1129_PDB1                    READ WRITE NO
SQL> alter session set container=DB1129_PDB1;

Session altered.

SQL> alter database datafile '/u01/app/oracle/oradata/data01.dbf' offline;

Database altered.

SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.19.0.0.0
[oracle@db19c oradata]$
```

RMANでCDBに接続し、SWITCHコマンドで制御ファイル内のパスを変更します。
★の箇所に新しいデータファイルのパスが表示されるため、控えておきます。（次の手順で使用します）
```
[oracle@db19c ~]$ rman target /

Recovery Manager: Release 19.0.0.0.0 - Production on Tue Jan 23 13:07:55 2024
Version 19.19.0.0.0

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

connected to target database: DB1129 (DBID=3959008139)

RMAN> switch datafile "/u01/app/oracle/oradata/data01.dbf" to copy;

datafile 16 switched to datafile copy  ★"+DATA/DB1129_WN6_NRT/0B40016CF0DE0436E0638400000AFBE7/DATAFILE/data.282.1159016295"

RMAN>
```

RECOVERコマンドで新しいデータファイルを最新化します。
```
RMAN> recover datafile "+DATA/DB1129_WN6_NRT/0B40016CF0DE0436E0638400000AFBE7/DATAFILE/data.282.1159016295";

Starting recover at 23-JAN-24
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=43 device type=DISK

starting media recovery
media recovery complete, elapsed time: 00:00:00

Finished recover at 23-JAN-24


RMAN> exit


Recovery Manager complete.
[oracle@db19c ~]$
```

SQL*PlusでPDBに接続し、新しいデータファイルをオンラインにします。
新しい場所に変わっていることを確認します（★の箇所）
```
[oracle@db19c ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Tue Jan 23 13:12:04 2024
Version 19.19.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.19.0.0.0

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 DB1129_PDB1                    READ WRITE NO
SQL> alter session set container=DB1129_PDB1;

Session altered.

SQL> alter database datafile '+DATA/DB1129_WN6_NRT/0B40016CF0DE0436E0638400000AFBE7/DATAFILE/data.282                   .1159016295' online;

Database altered.

SQL> select tablespace_name,file_name from dba_data_files;

TABLESPACE_NAME                FILE_NAME
------------------------------ ----------------------------------------------------------------------------------------------------
SYSTEM                         +DATA/DB1129_WN6_NRT/0B40016CF0DE0436E0638400000AFBE7/DATAFILE/system.273.1154130319
SYSAUX                         +DATA/DB1129_WN6_NRT/0B40016CF0DE0436E0638400000AFBE7/DATAFILE/sysaux.271.1154130331
UNDOTBS1                       +DATA/DB1129_WN6_NRT/0B40016CF0DE0436E0638400000AFBE7/DATAFILE/undotbs1.270.1154130339
USERS                          +DATA/DB1129_WN6_NRT/0B40016CF0DE0436E0638400000AFBE7/DATAFILE/users.274.1154130501
★DATA                           +DATA/DB1129_WN6_NRT/0B40016CF0DE0436E0638400000AFBE7/DATAFILE/data.282.1159016295

SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.19.0.0.0
[oracle@db19c ~]$
```

最後に、もとのデータファイルを削除します。
```
[oracle@db19c ~]$ cd /u01/app/oracle/oradata
[oracle@db19c oradata]$ ls
data01.dbf
[oracle@db19c oradata]$ rm data01.dbf
[oracle@db19c oradata]$ ls
[oracle@db19c oradata]$

```