[comment]: # ({e26480a0-e26480a0})
# 3 Atualização do banco de dados para chaves primárias

[comment]: # ({/e26480a0-e26480a0})

[comment]: # ({70ef924c-53564572})
### Visão geral

Esta seção fornece instruções para atualizar manualmente as tabelas em instalações existentes para chaves primárias.

A atualização para chaves primárias otimiza a forma como os dados são indexados e acessados, o que pode acelerar as consultas e economizar espaço.
Também melhora o gerenciamento e a sincronização de dados em ambientes clusterizados, ajudando na escalabilidade e garantindo que o sistema permaneça confiável mesmo que alguns servidores falhem.

::: noteimportant
As instruções fornecidas nesta página são destinadas a usuários avançados e podem precisar ser ajustadas para sua configuração específica.
A atualização para chaves primárias pode ser demorada e consumir muitos recursos.
Certifique-se de que haja espaço livre em disco suficiente; dependendo do tamanho do seu banco de dados e dos dados armazenados, o processo pode exigir até 2,5 vezes o espaço atualmente utilizado pelas tabelas de histórico.
:::

Chaves primárias são usadas para todas as tabelas em novas instalações desde o Zabbix 6.0.

Não há atualização automática do banco de dados para chaves primárias; no entanto, instalações existentes podem ser atualizadas manualmente **após** a atualização do Zabbix server para a versão 6.0 ou superior.

::: noteimportant
Desde o Zabbix 7.0, a atualização das tabelas para chaves primárias também atualiza as tabelas para usar tipos de dados de dupla precisão.
<br><br>
Se você possui o Zabbix 7.0, as tabelas já usam dupla precisão.
No entanto, as instruções desta página ainda podem ser seguidas para atualizar as tabelas para chaves primárias sem afetar as tabelas que já usam dupla precisão.
<br><br>
Se você possui o Zabbix 6.4 (ou anterior), considere atualizar as tabelas para dupla precisão primeiro.
Para mais informações, consulte [Atualizando para valores numéricos de faixa estendida](/manual/appendix/install/db_float_range).
:::

As instruções estão disponíveis para:

* [MySQL](#mysql)
* [PostgreSQL](#postgresql)
* [TimescaleDB](#postgresql-timescaledb)
* [Oracle](#oracle)

[comment]: # ({/70ef924c-53564572})

[comment]: # ({a10a3240-980f7329})
### Observações importantes

Para realizar a atualização do banco de dados:

1. Pare o Zabbix server.

É altamente recomendável parar o Zabbix server durante o tempo da atualização.
No entanto, se for absolutamente necessário, você pode realizar a atualização enquanto o server estiver em execução (somente para MySQL, MariaDB e PostgreSQL sem TimescaleDB).

2. Faça backup do seu banco de dados.

Se estiver usando PostgreSQL ou TimescaleDB, consulte [problemas conhecidos](/manual/installation/known_issues#database-restore-error-with-postgresqltimescaledb-after-upgrade-from) para restaurar um backup do PostgreSQL ou TimescaleDB criado no Zabbix 7.0.0-7.0.4.

3. Instale o pacote zabbix-sql-scripts mais recente compatível com a sua versão do Zabbix (por exemplo, para RHEL: `dnf install zabbix-sql-scripts`).
4. Execute os scripts para o seu banco de dados.
5. Inicie o Zabbix server.

::: notewarning
Execute os scripts somente para o banco de dados do server. O proxy não se beneficiará desta atualização.
:::

Se o banco de dados usar partições, entre em contato com o administrador do banco de dados ou com o Suporte Zabbix para obter ajuda.

Os arquivos CSV podem ser removidos após uma atualização bem-sucedida para chaves primárias.

Opcionalmente, o Zabbix frontend pode ser colocado em [modo de manutenção](/manual/web_interface/maintenance_mode).

[comment]: # ({/a10a3240-980f7329})

[comment]: # ({4f99bcf1-1551eb55})
### MySQL

A exportação e importação devem ser realizadas em tmux/screen para garantir que a sessão não seja encerrada.

Veja também: [Notas importantes](#important-notes)

[comment]: # ({/4f99bcf1-1551eb55})

[comment]: # ({b3eb6d02-dc89d749})
#### MySQL 8.0+ com mysqlsh

Este método pode ser usado com um Zabbix server em execução, mas é recomendável parar o server durante o processo de atualização.
O MySQL Shell (*mysqlsh*) deve estar [instalado](https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-install-linux-quick.html) e conseguir se conectar ao DB. 

* Faça login no console do MySQL como root (recomendado) ou como qualquer usuário com privilégios FILE. 

* Inicie o MySQL com a variável [local_infile](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_local_infile) habilitada.

* Renomeie as tabelas antigas e crie as novas executando `history_upgrade_prepare.sql`.

```bash
mysql -uzabbix -p<password> zabbix < /usr/share/zabbix-sql-scripts/mysql/option-patches/history_upgrade_prepare.sql
```

* Exporte e importe os dados.

Conecte-se via mysqlsh. Se estiver usando uma conexão por socket, pode ser necessário especificar o caminho.

```bash
sudo mysqlsh -uroot -S /run/mysqld/mysqld.sock --no-password -Dzabbix
```

Alterne para o modo JavaScript usando:

```mysql
\js
```

Em seguida, execute o código abaixo (CSVPATH pode ser alterado conforme necessário):

```javascript
CSVPATH="/var/lib/mysql-files";

util.exportTable("history_old", CSVPATH + "/history.csv", { dialect: "csv" });
util.importTable(CSVPATH + "/history.csv", {"dialect": "csv", "table": "history" });

util.exportTable("history_uint_old", CSVPATH + "/history_uint.csv", { dialect: "csv" });
util.importTable(CSVPATH + "/history_uint.csv", {"dialect": "csv", "table": "history_uint" });

util.exportTable("history_str_old", CSVPATH + "/history_str.csv", { dialect: "csv" });
util.importTable(CSVPATH + "/history_str.csv", {"dialect": "csv", "table": "history_str" });

util.exportTable("history_log_old", CSVPATH + "/history_log.csv", { dialect: "csv" });
util.importTable(CSVPATH + "/history_log.csv", {"dialect": "csv", "table": "history_log" });

util.exportTable("history_text_old", CSVPATH + "/history_text.csv", { dialect: "csv" });
util.importTable(CSVPATH + "/history_text.csv", {"dialect": "csv", "table": "history_text" });
```

Se você receber a mensagem "JavaScript is not supported", sua instalação do MySQL Shell não tem suporte a JS. Nesse caso, instale o pacote oficial do [MySQL Shell](https://dev.mysql.com/downloads/shell/) da Oracle (ou compile-o a partir do código-fonte) para que o modo JavaScript seja habilitado.

* Siga as [instruções pós-migração](#postmigration) para remover as tabelas antigas.

[comment]: # ({/b3eb6d02-dc89d749})

[comment]: # ({3466da92-b132f69b})
#### MariaDB/MySQL 8.0+ sem mysqlsh

Este método de upgrade leva mais tempo e deve ser usado somente se um upgrade com *mysqlsh* não for possível.

##### Upgrade das tabelas

* Faça login no console do MySQL como root (recomendado) ou como qualquer usuário com privilégios FILE.

* Se estiver realizando a migração com um server Zabbix em execução, inicie o MySQL com a variável [local_infile](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_local_infile) habilitada.

* Renomeie as tabelas antigas e crie as novas executando `history_upgrade_prepare.sql`:

```bash
mysql -uzabbix -p<password> zabbix < /usr/share/zabbix-sql-scripts/mysql/option-patches/history_upgrade_prepare.sql
```

##### Migração com o server parado

`max_execution_time` (no MySQL) ou `max_statement_time` (no MariaDB) deve ser desabilitado antes de migrar os dados para evitar timeout durante a migração.

Para MySQL:

```sql
SET @@max_execution_time=0;
```

Para MariaDB:

```sql
SET @@max_statement_time=0;
```

```sql
INSERT IGNORE INTO history SELECT * FROM history_old;
INSERT IGNORE INTO history_uint SELECT * FROM history_uint_old;
INSERT IGNORE INTO history_str SELECT * FROM history_str_old;
INSERT IGNORE INTO history_log SELECT * FROM history_log_old;
INSERT IGNORE INTO history_text SELECT * FROM history_text_old;
```

Siga as [instruções pós-migração](#postmigration) para remover as tabelas antigas.

##### Migração com o server em execução

Verifique para quais caminhos a importação/exportação está habilitada:

```sql
mysql> SELECT @@secure_file_priv;
+-----------------------+
| @@secure_file_priv    |
+-----------------------+
| /var/lib/mysql-files/ |
+-----------------------+
```

Se o valor de *secure_file_priv* for um caminho para um diretório, a exportação/importação será realizada para arquivos nesse diretório. Nesse caso, edite os caminhos dos arquivos nas consultas de acordo ou defina o valor de *secure_file_priv* como uma string vazia durante o upgrade.

Se o valor de *secure_file_priv* estiver vazio, a exportação/importação pode ser realizada de qualquer local.

Se o valor de *secure_file_priv* for NULL, defina-o como o caminho que contém os dados exportados da tabela ('/var/lib/mysql-files/' no exemplo acima).

Para mais informações, consulte a [documentação do MySQL](https://dev.mysql.com/doc/refman/8.4/en/server-system-variables.html#sysvar_secure_file_priv) ou a [documentação do MariaDB](https://mariadb.com/docs/server/ha-and-performance/optimization-and-tuning/system-variables/server-system-variables#secure_file_priv).

`max_execution_time` (no MySQL) ou `max_statement_time` (no MariaDB) deve ser desabilitado antes de exportar os dados para evitar timeout durante a exportação.

Para MySQL:

```sql
SET @@max_execution_time=0;
```

Para MariaDB:

```sql
SET @@max_statement_time=0;
```

```sql
SELECT * INTO OUTFILE '/var/lib/mysql-files/history.csv' FIELDS TERMINATED BY ',' ESCAPED BY '"' LINES TERMINATED BY '\n' FROM history_old;
LOAD DATA INFILE '/var/lib/mysql-files/history.csv' IGNORE INTO TABLE history FIELDS TERMINATED BY ',' ESCAPED BY '"' LINES TERMINATED BY '\n';

SELECT * INTO OUTFILE '/var/lib/mysql-files/history_uint.csv' FIELDS TERMINATED BY ',' ESCAPED BY '"' LINES TERMINATED BY '\n' FROM history_uint_old;
LOAD DATA INFILE '/var/lib/mysql-files/history_uint.csv' IGNORE INTO TABLE history_uint FIELDS TERMINATED BY ',' ESCAPED BY '"' LINES TERMINATED BY '\n';

SELECT * INTO OUTFILE '/var/lib/mysql-files/history_str.csv' FIELDS TERMINATED BY ',' ESCAPED BY '"' LINES TERMINATED BY '\n' FROM history_str_old;
LOAD DATA INFILE '/var/lib/mysql-files/history_str.csv' IGNORE INTO TABLE history_str FIELDS TERMINATED BY ',' ESCAPED BY '"' LINES TERMINATED BY '\n';

SELECT * INTO OUTFILE '/var/lib/mysql-files/history_log.csv' FIELDS TERMINATED BY ',' ESCAPED BY '"' LINES TERMINATED BY '\n' FROM history_log_old;
LOAD DATA INFILE '/var/lib/mysql-files/history_log.csv' IGNORE INTO TABLE history_log FIELDS TERMINATED BY ',' ESCAPED BY '"' LINES TERMINATED BY '\n';

SELECT * INTO OUTFILE '/var/lib/mysql-files/history_text.csv' FIELDS TERMINATED BY ',' ESCAPED BY '"' LINES TERMINATED BY '\n' FROM history_text_old;
LOAD DATA INFILE '/var/lib/mysql-files/history_text.csv' IGNORE INTO TABLE history_text FIELDS TERMINATED BY ',' ESCAPED BY '"' LINES TERMINATED BY '\n';
```

Siga as [instruções pós-migração](#postmigration) para remover as tabelas antigas.

[comment]: # ({/3466da92-b132f69b})

[comment]: # ({634df4cd-1139207b})
### PostgreSQL

A exportação e a importação devem ser realizadas em tmux/screen para garantir que a sessão não seja interrompida.
Para instalações com TimescaleDB, pule esta seção e prossiga para [PostgreSQL + TimescaleDB](#postgresql-timescaledb).

Veja também: [Notas importantes](#important-notes)

#### Atualização de tabelas

* Renomeie as tabelas usando `history_upgrade_prepare.sql`:

```bash
sudo -u zabbix psql zabbix < /usr/share/zabbix-sql-scripts/postgresql/option-patches/history_upgrade_prepare.sql
```

#### Migração com server parado

* Exporte o histórico atual, importe-o para a tabela temporária,
  depois insira os dados nas novas tabelas enquanto ignora duplicatas:

```sql
INSERT INTO history SELECT * FROM history_old ON CONFLICT (itemid,clock,ns) DO NOTHING;

INSERT INTO history_uint SELECT * FROM history_uint_old ON CONFLICT (itemid,clock,ns) DO NOTHING;

INSERT INTO history_str SELECT * FROM history_str_old ON CONFLICT (itemid,clock,ns) DO NOTHING;

INSERT INTO history_log SELECT * FROM history_log_old ON CONFLICT (itemid,clock,ns) DO NOTHING;

INSERT INTO history_text SELECT * FROM history_text_old ON CONFLICT (itemid,clock,ns) DO NOTHING;
```

Veja dicas para melhorar o desempenho do INSERT: [PostgreSQL: Bulk Loading Huge Amounts of Data](https://www.cybertec-postgresql.com/en/postgresql-bulk-loading-huge-amounts-of-data), [Checkpoint Distance and Amount of WAL](https://www.cybertec-postgresql.com/en/checkpoint-distance-and-amount-of-wal).

* Siga as [instruções pós-migração](#postmigration) para remover as tabelas antigas.

[comment]: # ({/634df4cd-1139207b})

[comment]: # ({e951ec07-7e590ff3})
#### Migração com o server em execução

* Exporte o histórico atual, importe-o para a tabela temporária e, em seguida, insira os dados nas novas tabelas ignorando duplicatas:

```sql
\copy history_old TO '/tmp/history.csv' DELIMITER ',' CSV
CREATE TEMP TABLE temp_history (
    itemid                   bigint                                    NOT NULL,
    clock                    integer         DEFAULT '0'               NOT NULL,
    value                    DOUBLE PRECISION DEFAULT '0.0000'          NOT NULL,
    ns                       integer         DEFAULT '0'               NOT NULL
);
\copy temp_history FROM '/tmp/history.csv' DELIMITER ',' CSV
INSERT INTO history SELECT * FROM temp_history ON CONFLICT (itemid,clock,ns) DO NOTHING;

\copy history_uint_old TO '/tmp/history_uint.csv' DELIMITER ',' CSV
CREATE TEMP TABLE temp_history_uint (
    itemid                   bigint                                    NOT NULL,
    clock                    integer         DEFAULT '0'               NOT NULL,
    value                    numeric(20)     DEFAULT '0'               NOT NULL,
    ns                       integer         DEFAULT '0'               NOT NULL
);
\copy temp_history_uint FROM '/tmp/history_uint.csv' DELIMITER ',' CSV
INSERT INTO history_uint SELECT * FROM temp_history_uint ON CONFLICT (itemid,clock,ns) DO NOTHING;

\copy history_str_old TO '/tmp/history_str.csv' DELIMITER ',' CSV
CREATE TEMP TABLE temp_history_str (
    itemid                   bigint                                    NOT NULL,
    clock                    integer         DEFAULT '0'               NOT NULL,
    value                    varchar(255)    DEFAULT ''                NOT NULL,
    ns                       integer         DEFAULT '0'               NOT NULL
);
\copy temp_history_str FROM '/tmp/history_str.csv' DELIMITER ',' CSV
INSERT INTO history_str (itemid,clock,value,ns) SELECT * FROM temp_history_str ON CONFLICT (itemid,clock,ns) DO NOTHING;

\copy history_log_old TO '/tmp/history_log.csv' DELIMITER ',' CSV
CREATE TEMP TABLE temp_history_log (
    itemid                   bigint                                    NOT NULL,
    clock                    integer         DEFAULT '0'               NOT NULL,
    timestamp                integer         DEFAULT '0'               NOT NULL,
    source                   varchar(64)     DEFAULT ''                NOT NULL,
    severity                 integer         DEFAULT '0'               NOT NULL,
    value                    text            DEFAULT ''                NOT NULL,
    logeventid               integer         DEFAULT '0'               NOT NULL,
    ns                       integer         DEFAULT '0'               NOT NULL
);
\copy temp_history_log FROM '/tmp/history_log.csv' DELIMITER ',' CSV
INSERT INTO history_log SELECT * FROM temp_history_log ON CONFLICT (itemid,clock,ns) DO NOTHING;

\copy history_text_old TO '/tmp/history_text.csv' DELIMITER ',' CSV
CREATE TEMP TABLE temp_history_text (
    itemid                   bigint                                    NOT NULL,
    clock                    integer         DEFAULT '0'               NOT NULL,
    value                    text            DEFAULT ''                NOT NULL,
    ns                       integer         DEFAULT '0'               NOT NULL
);
\copy temp_history_text FROM '/tmp/history_text.csv' DELIMITER ',' CSV
INSERT INTO history_text SELECT * FROM temp_history_text ON CONFLICT (itemid,clock,ns) DO NOTHING;
```
* Siga as [instruções pós-migração](#postmigration) para remover as tabelas antigas.

[comment]: # ({/e951ec07-7e590ff3})

[comment]: # ({f968af25-589d2f09})
### PostgreSQL + TimescaleDB

A exportação e a importação devem ser realizadas no tmux/screen para garantir que a sessão não seja encerrada.  
O server do Zabbix deve estar desligado durante a atualização.

Veja também: [Notas importantes](#important-notes)

* Renomeie as tabelas usando `history_upgrade_prepare.sql`.
  * Se a compressão estiver habilitada (na instalação padrão), execute o script de `/usr/share/zabbix-sql-scripts/postgresql/timescaledb/option-patches/with-compression`:
    ```bash
    cat /usr/share/zabbix-sql-scripts/postgresql/timescaledb/option-patches/with-compression/history_upgrade_prepare.sql | sudo -u zabbix psql zabbix
    ```
  * Se a compressão estiver desabilitada, execute o script de `/usr/share/zabbix-sql-scripts/postgresql/timescaledb/option-patches/without-compression`:
    ```bash
    cat /usr/share/zabbix-sql-scripts/postgresql/timescaledb/option-patches/without-compression/history_upgrade_prepare.sql | sudo -u zabbix psql zabbix
    ```

* Execute os scripts de migração de hypertable do TimescaleDB com base nas configurações de compressão:
  * Se a compressão estiver habilitada (na instalação padrão), execute os scripts de `/usr/share/zabbix-sql-scripts/postgresql/timescaledb/option-patches/with-compression`:
    ```bash
    cat /usr/share/zabbix-sql-scripts/postgresql/timescaledb/option-patches/with-compression/history_upgrade.sql | sudo -u zabbix psql zabbix
    cat /usr/share/zabbix-sql-scripts/postgresql/timescaledb/option-patches/with-compression/history_upgrade_uint.sql | sudo -u zabbix psql zabbix
    cat /usr/share/zabbix-sql-scripts/postgresql/timescaledb/option-patches/with-compression/history_upgrade_log.sql | sudo -u zabbix psql zabbix
    cat /usr/share/zabbix-sql-scripts/postgresql/timescaledb/option-patches/with-compression/history_upgrade_str.sql | sudo -u zabbix psql zabbix
    cat /usr/share/zabbix-sql-scripts/postgresql/timescaledb/option-patches/with-compression/history_upgrade_text.sql | sudo -u zabbix psql zabbix
    cat /usr/share/zabbix-sql-scripts/postgresql/timescaledb/option-patches/with-compression/trends_upgrade.sql | sudo -u zabbix psql zabbix
    ```
  * Se a compressão estiver desabilitada, execute os scripts de `/usr/share/zabbix-sql-scripts/postgresql/timescaledb/option-patches/without-compression`:
    ```bash
    cat /usr/share/zabbix-sql-scripts/postgresql/timescaledb/option-patches/without-compression/history_upgrade.sql | sudo -u zabbix psql zabbix
    cat /usr/share/zabbix-sql-scripts/postgresql/timescaledb/option-patches/without-compression/history_upgrade_uint.sql | sudo -u zabbix psql zabbix
    cat /usr/share/zabbix-sql-scripts/postgresql/timescaledb/option-patches/without-compression/history_upgrade_log.sql | sudo -u zabbix psql zabbix
    cat /usr/share/zabbix-sql-scripts/postgresql/timescaledb/option-patches/without-compression/history_upgrade_str.sql | sudo -u zabbix psql zabbix
    cat /usr/share/zabbix-sql-scripts/postgresql/timescaledb/option-patches/without-compression/history_upgrade_text.sql | sudo -u zabbix psql zabbix
    cat /usr/share/zabbix-sql-scripts/postgresql/timescaledb/option-patches/without-compression/trends_upgrade.sql | sudo -u zabbix psql zabbix
    ```

Veja também: [Dicas](https://www.tigerdata.com/blog/13-tips-to-improve-postgresql-insert-performance) para melhorar o desempenho de INSERT.

* Siga as [instruções pós-migração](#postmigration) para remover as tabelas antigas.

[comment]: # ({/f968af25-589d2f09})

[comment]: # ({5bbab9b5-4b428c7c})
### Oracle

::: noteimportant
O suporte ao Oracle DB está obsoleto desde o Zabbix 7.0.
:::

A exportação e importação devem ser realizadas em tmux/screen para garantir que a sessão não seja encerrada.
O Zabbix server deve estar desligado durante a atualização.

Veja também: [Notas importantes](#important-notes)

#### Atualização de tabelas

* Instale o Oracle Data Pump (disponível no [pacote Instant Client Tools](https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html)).

Consulte a [documentação](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump-performance-tips.html) do Oracle Data Pump para dicas de desempenho.

* Renomeie as tabelas usando `history_upgrade_prepare.sql`.

```bash
cd /path/to/zabbix-sources/database/oracle/option-patches
sqlplus zabbix/password@oracle_host/service
sqlplus> @history_upgrade_prepare.sql
```

[comment]: # ({/5bbab9b5-4b428c7c})

[comment]: # ({dfc047ec-0dd33561})
#### Migração em lote de tabelas de histórico

* Prepare os diretórios para o Data Pump.

O Data Pump deve ter permissões de leitura e gravação nesses diretórios.

Exemplo:

```bash
mkdir -pv /export/history
chown -R oracle:oracle /export
```

* Crie um objeto de diretório e conceda permissões de leitura e gravação nesse objeto ao usuário usado para autenticação no Zabbix ('zabbix' no exemplo abaixo). Sob a função *sysdba*, execute:

```sql
create directory history as '/export/history';
grant read,write on directory history to zabbix;
```

* Exporte as tabelas. Substitua N pela quantidade desejada de threads.

```bash
expdp zabbix/password@oracle_host/service \
    DIRECTORY=history \
    TABLES=history_old,history_uint_old,history_str_old,history_log_old,history_text_old \
    PARALLEL=N
```

* Importe as tabelas. Substitua N pela quantidade desejada de threads.

```bash
impdp zabbix/password@oracle_host/service \
    DIRECTORY=history \
    TABLES=history_uint_old \
 REMAP_TABLE=history_old:history,history_uint_old:history_uint,history_str_old:history_str,history_log_old:history_log,history_text_old:history_text \
    data_options=SKIP_CONSTRAINT_ERRORS table_exists_action=APPEND  PARALLEL=N CONTENT=data_only
```

* Siga as [instruções pós-migração](#postmigration) para remover as tabelas antigas.

[comment]: # ({/dfc047ec-0dd33561})

[comment]: # ({51b383a5-f0426f06})
#### Migração individual das tabelas de histórico

* Prepare diretórios para o Data Pump para cada tabela de histórico.
O Data Pump deve ter permissões de leitura e gravação nesses diretórios.

Exemplo:

```bash
mkdir -pv /export/history /export/history_uint /export/history_str /export/history_log /export/history_text
chown -R oracle:oracle /export
```

* Crie um objeto de diretório e conceda permissões de leitura e gravação nesse objeto ao usuário usado para autenticação do Zabbix ('zabbix' no exemplo abaixo). Sob a função *sysdba*, execute:

```sql
create directory history as '/export/history';
grant read,write on directory history to zabbix;

create directory history_uint as '/export/history_uint';
grant read,write on directory history_uint to zabbix;

create directory history_str as '/export/history_str';
grant read,write on directory history_str to zabbix;

create directory history_log as '/export/history_log';
grant read,write on directory history_log to zabbix;

create directory history_text as '/export/history_text';
grant read,write on directory history_text to zabbix;
```

* Exporte e importe cada tabela. Substitua N pela quantidade desejada de threads.

```bash
expdp zabbix/password@oracle_host:1521/xe DIRECTORY=history TABLES=history_old PARALLEL=N

impdp zabbix/password@oracle_host:1521/xe DIRECTORY=history TABLES=history_old REMAP_TABLE=history_old:history data_options=SKIP_CONSTRAINT_ERRORS table_exists_action=APPEND PARALLEL=N CONTENT=data_only

expdp zabbix/password@oracle_host:1521/xe DIRECTORY=history_uint TABLES=history_uint_old PARALLEL=N

impdp zabbix/password@oracle_host:1521/xe DIRECTORY=history_uint TABLES=history_uint_old REMAP_TABLE=history_uint_old:history_uint data_options=SKIP_CONSTRAINT_ERRORS table_exists_action=APPEND PARALLEL=N CONTENT=data_only

expdp zabbix/password@oracle_host:1521/xe DIRECTORY=history_str TABLES=history_str_old PARALLEL=N

impdp zabbix/password@oracle_host:1521/xe DIRECTORY=history_str TABLES=history_str_old REMAP_TABLE=history_str_old:history_str data_options=SKIP_CONSTRAINT_ERRORS table_exists_action=APPEND PARALLEL=N CONTENT=data_only

expdp zabbix/password@oracle_host:1521/xe DIRECTORY=history_log TABLES=history_log_old PARALLEL=N

impdp zabbix/password@oracle_host:1521/xe DIRECTORY=history_log TABLES=history_log_old REMAP_TABLE=history_log_old:history_log data_options=SKIP_CONSTRAINT_ERRORS table_exists_action=APPEND PARALLEL=N CONTENT=data_only

expdp zabbix/password@oracle_host:1521/xe DIRECTORY=history_text TABLES=history_text_old PARALLEL=N

impdp zabbix/password@oracle_host:1521/xe DIRECTORY=history_text TABLES=history_text_old REMAP_TABLE=history_text_old:history_text data_options=SKIP_CONSTRAINT_ERRORS table_exists_action=APPEND PARALLEL=N CONTENT=data_only
```

* Siga as [instruções pós-migração](#postmigration) para remover as tabelas antigas.

[comment]: # ({/51b383a5-f0426f06})

[comment]: # ({e73536ae-b041e427})
### Pós-migração

Para todos os bancos de dados, uma vez que a migração seja concluída, faça o seguinte:

* Verifique se tudo está funcionando como esperado.

* Exclua as tabelas antigas:

```sql
DROP TABLE history_old;
DROP TABLE history_uint_old;
DROP TABLE history_str_old;
DROP TABLE history_log_old;
DROP TABLE history_text_old;
```

* Para o TimescaleDB, exclua também a seguinte tabela antiga:

```sql
DROP TABLE trends_old;
```

[comment]: # ({/e73536ae-b041e427})

[comment]: # ({16ed11f0-8ee7d9aa})
#### Veja também

-   [Preparando a tabela auditlog para particionamento](/manual/appendix/install/auditlog_primary_keys)

[comment]: # ({/16ed11f0-8ee7d9aa})
