

# RDS for Oracle のストレージボリューム間のデータの移動
<a name="Appendix.Oracle.CommonDBATasks.MovingDataBetweenVolumes"></a>

データファイルとデータベースオブジェクトは、プライマリストレージボリュームと追加のストレージボリューム間で移動できます。データを移動する前に、次の点を考慮してください。
+ ソースボリュームとターゲットボリュームには十分な空き領域が必要です。
+ データ移動オペレーションは、両方のボリュームで I/O を消費します。
+ 大きなデータ移動は、データベースのパフォーマンスに影響を与える可能性があります。
+ スナップショットを復元する場合、EBS 遅延ロードの影響を受けると、ストレージボリューム間のデータの移動が遅くなる可能性があります。

**Topics**
+ [RDS for Oracle のボリューム間でのデータファイルの移動](#Appendix.Oracle.CommonDBATasks.MovingDatafiles)
+ [RDS for Oracle のボリューム間でテーブルデータとインデックスを移動する](#Appendix.Oracle.CommonDBATasks.MovingTableData)
+ [追加ボリュームを使用した LOB ストレージの管理](#Appendix.Oracle.CommonDBATasks.ManagingLargeLOBStorage)

## RDS for Oracle のボリューム間でのデータファイルの移動
<a name="Appendix.Oracle.CommonDBATasks.MovingDatafiles"></a>

ストレージボリューム間でデータファイルを移動するには、Amazon RDS プロシージャ `rdsadmin.rdsadmin_util.move_datafile` を使用します。次の要件に注意してください。
+ `move_datafile` プロシージャを実行するには、Oracle Enterprise Edition を使用する必要があります。
+ テーブルスペース `SYSTEM` と `RDSADMIN` を移動することはできません。

`move_datafile` プロシージャには以下のパラメータがあります。


****  

| パラメータ名 | データ型 | 必要 | 説明 | 
| --- | --- | --- | --- | 
|  `p_data_file_id`  |  number  |  はい  |  移動するデータファイルの ID。  | 
|  `p_location`  |  varchar2  |  はい  |  データファイルを移動するストレージボリューム。  | 

次の例では、テーブルスペースをデフォルトボリューム `rdsdbdata` から追加ボリューム `rdsdbdata2` に移動します。

```
SQL> SELECT tablespace_name,file_id,file_name FROM dba_data_files
 WHERE tablespace_name = 'MYNEWTABLESPACE';

TABLESPACE_NAME              FILE_ID FILE_NAME
------------------------- ---------- --------------------------------------------------------------------------------
MYNEWTABLESPACE                    6 /rdsdbdata/db/ORCL_A/datafile/o1_mf_mynewtab_n123abcd_.dbf

EXECUTE rdsadmin.rdsadmin_util.move_datafile( 6, 'rdsdbdata2');

PL/SQL procedure successfully completed.

SQL> SELECT tablespace_name,file_id,file_name FROM dba_data_files
  WHERE tablespace_name = 'MYNEWTABLESPACE';

TABLESPACE_NAME              FILE_ID FILE_NAME
------------------------- ---------- --------------------------------------------------------------------------------
MYNEWTABLESPACE                    6 /rdsdbdata2/db/ORCL_A/datafile/o1_mf_mynewtab_n356efgh_.dbf
```

## RDS for Oracle のボリューム間でテーブルデータとインデックスを移動する
<a name="Appendix.Oracle.CommonDBATasks.MovingTableData"></a>

追加のストレージボリュームにテーブルスペースを作成することで、データベースストレージを最適化できます。その後、標準の Oracle SQL を使用して、テーブル、インデックス、パーティションなどのオブジェクトをこれらのテーブルスペースに移動できます。このアプローチは、データベースにさまざまなアクセスパターンのデータが含まれている場合のパフォーマンス調整に役立ちます。例えば、アクセス頻度の高い運用データを高性能ストレージボリュームに保存しながら、アクセス頻度の低い履歴データを低コストのストレージボリュームに移動できます。

次の例では、高性能ボリューム `rdsdbdata2` に新しいテーブルスペースを作成します。次に、テーブルがオンラインのときに、テーブルを追加のストレージボリュームに移動します。また、インデックスを同じボリュームに移動します。オンライン中にテーブルを移動してインデックスを再構築するには、Oracle Enterprise Edition が必要です。

```
ALTER SESSION SET db_create_file_dest = '/rdsdbdata2/db';
CREATE TABLESPACE perf_tbs DATAFILE SIZE 10G;

ALTER TABLE employees
  MOVE TABLESPACE perf_tbs ONLINE;

ALTER INDEX employees_idx
  REBUILD ONLINE TABLESPACE perf_tbs;
```

次の例では、低コストのボリュームにテーブルスペースを作成します。次に、オンラインオペレーションを使用して、テーブルパーティションを低コストのストレージボリュームに移動します。

```
ALTER SESSION SET db_create_file_dest = '/rdsdbdata3/db';
CREATE TABLESPACE hist_tbs DATAFILE SIZE 10G;

ALTER TABLE orders
  MOVE PARTITION orders_2022
  TABLESPACE hist_tbs ONLINE;
```

次の例では、アクティブなセッションのロングオペレーションをクエリします。

```
SELECT sid,opname,sofar,totalwork,time_remaining,elapsed_seconds 
  FROM v$session_longops 
  WHERE time_remaining > 0;
```

次のクエリを使用して、テーブルスペースの使用状況を確認できます。

```
SELECT tablespace_name, used_percent
  FROM dba_tablespace_usage_metrics
  ORDER BY used_percent DESC;
```

## 追加ボリュームを使用した LOB ストレージの管理
<a name="Appendix.Oracle.CommonDBATasks.ManagingLargeLOBStorage"></a>

データベースには、大量のストレージを消費するが、アクセス頻度が低い BLOB オブジェクトまたは CLOB オブジェクトを含むテーブルが含まれている場合があります。ストレージを最適化するために、これらの LOB セグメントを追加のストレージボリュームのテーブルスペースに再配置できます。

次の例では、低アクセスデータを対象とした低コストのボリュームで LOB データのテーブルスペースを作成します。次に、このボリュームにデータを保存するテーブルを作成します。

```
ALTER SESSION SET db_create_file_dest = '/rdsdbdata3/db';
CREATE TABLESPACE lob_data DATAFILE SIZE 5G AUTOEXTEND ON NEXT 1G;

CREATE TABLE documents (
    doc_id NUMBER PRIMARY KEY,
    doc_date DATE,
    doc_content CLOB
) TABLESPACE user_data
LOB(doc_content) STORE AS (TABLESPACE lob_data);
```