

# Mover dados entre volumes de armazenamento no RDS para Oracle
<a name="Appendix.Oracle.CommonDBATasks.MovingDataBetweenVolumes"></a>

Você pode mover arquivos de dados e objetos de banco de dados entre seus volumes de armazenamento principal e adicional. Antes de mover dados, pense nos seguintes pontos:
+ Os volumes de origem e de destino devem ter espaço livre suficiente.
+ As operações de movimentação de dados consomem E/S em ambos os volumes.
+ Grandes movimentações de dados podem afetar a performance do banco de dados.
+ Se você restaurar um snapshot, a movimentação de dados entre volumes de armazenamento poderá ser lenta se for afetada pelo carregamento lento do EBS.

**Topics**
+ [

## Mover arquivos de dados entre volumes no RDS para Oracle
](#Appendix.Oracle.CommonDBATasks.MovingDatafiles)
+ [

## Mover dados e índices da tabela entre volumes no RDS para Oracle
](#Appendix.Oracle.CommonDBATasks.MovingTableData)
+ [

## Gerenciar o armazenamento LOB usando volumes adicionais
](#Appendix.Oracle.CommonDBATasks.ManagingLargeLOBStorage)

## Mover arquivos de dados entre volumes no RDS para Oracle
<a name="Appendix.Oracle.CommonDBATasks.MovingDatafiles"></a>

Para mover arquivos de dados entre volumes de armazenamento, use o procedimento `rdsadmin.rdsadmin_util.move_datafile` do Amazon RDS. Observe os seguintes requisitos:
+ Você deve usar o Oracle Enterprise Edition para executar o procedimento `move_datafile`.
+ Você não pode mover o espaço para tabela `SYSTEM` e `RDSADMIN`.

O procedimento `move_datafile` tem os seguintes parâmetros.


****  

| Nome do parâmetro | Tipo de dados | Obrigatório | Descrição | 
| --- | --- | --- | --- | 
|  `p_data_file_id`  |  número  |  Sim  |  O ID do arquivo de dados a ser movido.  | 
|  `p_location`  |  varchar2  |  Sim  |  O volume de armazenamento para o qual você deseja mover o arquivo de dados.  | 

O exemplo a seguir move um espaço para tabela do volume padrão `rdsdbdata` para o volume adicional `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
```

## Mover dados e índices da tabela entre volumes no RDS para Oracle
<a name="Appendix.Oracle.CommonDBATasks.MovingTableData"></a>

Você pode otimizar o armazenamento do banco de dados criando espaços para tabela em volumes de armazenamento adicionais. Depois, você pode mover objetos, como tabelas, índices e partições, para esses espaços para tabela usando o Oracle SQL padrão. Essa abordagem é valiosa para o ajuste de performance quando seu banco de dados contém dados com diferentes padrões de acesso. Por exemplo, você pode armazenar dados operacionais acessados com frequência em volumes de armazenamento de alta performance e, ao mesmo tempo, mover dados históricos raramente acessados para volumes de armazenamento de menor custo.

No exemplo a seguir, você vai criar um espaço para tabela em um volume de alta performance `rdsdbdata2`. Depois, você vai mover uma tabela para o volume de armazenamento adicional enquanto ela está on-line. Você também vai mover o índice para o mesmo volume. A movimentação de tabelas e a recompilação de índices on-line exigem o 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;
```

No exemplo a seguir, você vai criar um espaço para tabela em um volume de baixo custo. Depois, você vai mover uma partição da tabela para seu volume de armazenamento de baixo custo usando uma operação on-line.

```
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;
```

No exemplo a seguir, você vai consultar operações longas de sessões ativas.

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

Você pode conferir o uso de espaços para tabela com a consulta a seguir.

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

## Gerenciar o armazenamento LOB usando volumes adicionais
<a name="Appendix.Oracle.CommonDBATasks.ManagingLargeLOBStorage"></a>

Seu banco de dados pode conter tabelas com objetos BLOB ou CLOB que consomem armazenamento substancial, mas são acessados com pouca frequência. Para otimizar o armazenamento, você pode realocar esses segmentos LOB em um espaço para tabela em um volume de armazenamento adicional.

No exemplo a seguir, você vai criar um espaço para tabela para dados LOB em um volume de baixo custo destinado a dados de baixo acesso. Depois, você vai criar uma tabela que armazene dados nesse volume.

```
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);
```