[comment]: # ({e26480a0-e26480a0})
# 3 Database upgrade to primary keys

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

[comment]: # ({70ef924c-53564572})
### Omówienie

Ta sekcja zawiera instrukcje ręcznej aktualizacji tabel w istniejących instalacjach do kluczy głównych.

Aktualizacja do kluczy głównych optymalizuje sposób indeksowania i dostępu do danych, co może przyspieszyć zapytania i oszczędzić miejsce.
Poprawia również zarządzanie danymi i synchronizację w konfiguracjach klastrowych, pomagając w skalowaniu i zapewniając niezawodność systemu nawet w przypadku awarii niektórych serwerów.

::: noteimportant
Instrukcje podane na tej stronie są przeznaczone dla zaawansowanych użytkowników i mogą wymagać dostosowania do konkretnej konfiguracji.
Aktualizacja do kluczy głównych może być czasochłonna i zasobożerna.
Upewnij się, że dostępna jest wystarczająca ilość wolnego miejsca na dysku; w zależności od rozmiaru bazy danych i przechowywanych danych proces może wymagać nawet do 2,5 razy więcej miejsca niż obecnie zajmują tabele historii.
:::

Klucze główne są używane we wszystkich tabelach w nowych instalacjach od Zabbix 6.0.

Nie ma automatycznej aktualizacji bazy danych do kluczy głównych; istniejące instalacje można jednak zaktualizować ręcznie **po** aktualizacji serwera Zabbix do wersji 6.0 lub nowszej.

::: noteimportant
Od Zabbix 7.0 aktualizacja tabel do kluczy głównych obejmuje również zmianę tabel na typy danych o podwójnej precyzji.
<br><br>
Jeśli używasz Zabbix 7.0, tabele już korzystają z podwójnej precyzji.
Możesz jednak nadal skorzystać z instrukcji na tej stronie, aby zaktualizować tabele do kluczy głównych bez wpływu na tabele, które już używają podwójnej precyzji.
<br><br>
Jeśli używasz Zabbix 6.4 (lub starszej wersji), rozważ najpierw aktualizację tabel do podwójnej precyzji.
Więcej informacji znajdziesz w sekcji [Aktualizacja do wartości numerycznych o rozszerzonym zakresie](/manual/appendix/install/db_float_range).
:::

Dostępne są instrukcje dla:

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

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

[comment]: # ({82c37c9e-980f7329})
### Ważne uwagi

Aby przeprowadzić aktualizację bazy danych:

1. Zatrzymaj serwer Zabbix.

Zdecydowanie zaleca się zatrzymanie serwera Zabbix na czas aktualizacji.
Jeśli jednak jest to absolutnie konieczne, można przeprowadzić aktualizację, gdy serwer działa (tylko dla MySQL, MariaDB i PostgreSQL bez TimescaleDB).

2. Wykonaj kopię zapasową bazy danych.

Jeśli używasz PostgreSQL lub TimescaleDB, zobacz [znane problemy](/manual/installation/known_issues#database-restore-error-with-postgresqltimescaledb-after-upgrade-from-7.0.0-7.0.4) dotyczące przywracania kopii zapasowej PostgreSQL lub TimescaleDB utworzonej w Zabbix 7.0.0-7.0.4.

3. Zainstaluj najnowszy pakiet zabbix-sql-scripts zgodny z Twoją wersją Zabbix (np. dla RHEL: `dnf install zabbix-sql-scripts`).
4. Uruchom skrypty dla swojej bazy danych.
5. Uruchom serwer Zabbix.

::: notewarning
Uruchamiaj skrypty tylko dla bazy danych serwera. proxy nie skorzysta z tej aktualizacji.
:::

Jeśli baza danych używa partycji, skontaktuj się z administratorem DB lub pomocą techniczną Zabbix, aby uzyskać pomoc.

Pliki CSV można usunąć po pomyślnej aktualizacji do kluczy głównych.

Opcjonalnie frontend Zabbix można przełączyć w [tryb konserwacji](/manual/web_interface/maintenance_mode).

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

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

Eksport i import muszą być wykonywane w tmux/screen, aby zapewnić, że sesja nie zostanie przerwana.

Zobacz także: [Ważne uwagi](#important-notes)

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

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

Ta metoda może być używana przy działającym serwerze Zabbix, ale zaleca się zatrzymanie serwera na czas aktualizacji.
MySQL Shell (*mysqlsh*) musi być [zainstalowany](https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-install-linux-quick.html) i musi mieć możliwość połączenia z bazą danych.

* Zaloguj się do konsoli MySQL jako root (zalecane) lub jako dowolny użytkownik z uprawnieniami FILE.

* Uruchom MySQL z włączoną zmienną [local_infile](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_local_infile).

* Zmień nazwy starych tabel i utwórz nowe tabele, uruchamiając `history_upgrade_prepare.sql`.

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

* Wyeksportuj i zaimportuj dane.

Połącz się przez mysqlsh. Jeśli używane jest połączenie przez socket, może być wymagane podanie ścieżki.

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

Przełącz się w tryb JavaScript, używając:

```mysql
\js
```

Następnie uruchom poniższy kod (wartość CSVPATH można w razie potrzeby zmienić):

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

Jeśli pojawi się komunikat "JavaScript is not supported", oznacza to, że instalacja MySQL Shell nie obsługuje JS. W takim przypadku zainstaluj oficjalny [pakiet MySQL Shell](https://dev.mysql.com/downloads/shell/) firmy Oracle (lub zbuduj go ze źródeł), aby włączyć tryb JavaScript.

* Postępuj zgodnie z [instrukcjami po migracji](#postmigration), aby usunąć stare tabele.

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

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

Ta metoda aktualizacji trwa dłużej i powinna być używana tylko wtedy, gdy aktualizacja z użyciem *mysqlsh* nie jest możliwa.

##### Aktualizacja tabel

* Zaloguj się do konsoli MySQL jako root (zalecane) lub dowolny użytkownik z uprawnieniami FILE.

* Jeśli wykonujesz migrację przy działającym serwerze Zabbix, uruchom MySQL z włączoną zmienną [local_infile](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_local_infile).

* Zmień nazwy starych tabel i utwórz nowe tabele, uruchamiając `history_upgrade_prepare.sql`:

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

##### Migracja przy zatrzymanym serwerze

`max_execution_time` (w MySQL) lub `max_statement_time` (w MariaDB) musi zostać wyłączony przed migracją danych, aby uniknąć przekroczenia limitu czasu podczas migracji.

Dla MySQL:

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

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

Postępuj zgodnie z [instrukcjami po migracji](#postmigration), aby usunąć stare tabele.

##### Migracja przy działającym serwerze

Sprawdź, dla których ścieżek włączony jest import/eksport:

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

Jeśli wartość *secure_file_priv* jest ścieżką do katalogu, eksport/import zostanie wykonany dla plików w tym katalogu. W takim przypadku odpowiednio zmień ścieżki do plików w zapytaniach lub ustaw wartość *secure_file_priv* na pusty ciąg na czas aktualizacji.

Jeśli wartość *secure_file_priv* jest pusta, eksport/import można wykonać z dowolnej lokalizacji.

Jeśli wartość *secure_file_priv* wynosi NULL, ustaw ją na ścieżkę zawierającą wyeksportowane dane tabel ('/var/lib/mysql-files/' w powyższym przykładzie).

Więcej informacji znajdziesz w [dokumentacji MySQL](https://dev.mysql.com/doc/refman/8.4/en/server-system-variables.html#sysvar_secure_file_priv) lub [dokumentacji MariaDB](https://mariadb.com/docs/server/ha-and-performance/optimization-and-tuning/system-variables/server-system-variables#secure_file_priv).

`max_execution_time` (w MySQL) lub `max_statement_time` (w MariaDB) musi zostać wyłączony przed eksportem danych, aby uniknąć przekroczenia limitu czasu podczas eksportu.

Dla MySQL:

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

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

Postępuj zgodnie z [instrukcjami po migracji](#postmigration), aby usunąć stare tabele.

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

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

Eksport i import muszą być wykonywane w tmux/screen, aby zapewnić, że sesja nie zostanie przerwana.
W przypadku instalacji z TimescaleDB pomiń tę sekcję i przejdź do [PostgreSQL + TimescaleDB](#postgresql-timescaledb).

Zobacz także: [Ważne uwagi](#important-notes)

#### Aktualizacja tabel

* Zmień nazwy tabel, używając `history_upgrade_prepare.sql`:

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

#### Migracja przy zatrzymanym serwerze

* Wyeksportuj bieżącą historię, zaimportuj ją do tabeli tymczasowej,
  a następnie wstaw dane do nowych tabel, ignorując duplikaty:

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

Zobacz wskazówki dotyczące poprawy wydajności 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).

* Postępuj zgodnie z [instrukcjami po migracji](#postmigration), aby usunąć stare tabele.

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

[comment]: # ({e951ec07-7e590ff3})
#### Migracja z działającym serwerem

* Wyeksportuj bieżącą historię, zaimportuj ją do tabeli tymczasowej, a następnie wstaw dane do nowych tabel, ignorując duplikaty:

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

* Postępuj zgodnie z [instrukcjami po migracji](#postmigration), aby usunąć stare tabele.

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

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

Eksport i import muszą być wykonywane w tmux/screen, aby upewnić się, że sesja nie zostanie przerwana.
serwer Zabbix powinien być wyłączony podczas aktualizacji.

Zobacz także: [Important notes](#important-notes)

* Zmień nazwy tabel, używając `history_upgrade_prepare.sql`.
  * Jeśli kompresja jest włączona (w domyślnej instalacji), uruchom skrypt z `/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
    ```
  * Jeśli kompresja jest wyłączona, uruchom skrypt z `/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
    ```

* Uruchom skrypty migracji hypertable TimescaleDB w zależności od ustawień kompresji:
  * Jeśli kompresja jest włączona (w domyślnej instalacji), uruchom skrypty z `/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
    ```
  * Jeśli kompresja jest wyłączona, uruchom skrypty z `/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
    ```

Zobacz także: [Tips](https://www.tigerdata.com/blog/13-tips-to-improve-postgresql-insert-performance) dotyczące poprawy wydajności INSERT.

* Postępuj zgodnie z [instrukcjami po migracji](#postmigration), aby usunąć stare tabele.

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

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

::: noteimportant
Obsługa Oracle DB jest przestarzała od Zabbix 7.0.
:::

Eksport i import muszą być wykonywane w tmux/screen, aby upewnić się, że sesja nie zostanie przerwana.
Serwer Zabbix powinien być wyłączony podczas aktualizacji.

Zobacz także: [Ważne uwagi](#important-notes)

#### Aktualizacja tabel

* Zainstaluj Oracle Data Pump (dostępny w pakiecie [Instant Client Tools](https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html)). 

Zobacz [dokumentację](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump-performance-tips.html) Oracle Data Pump, aby uzyskać wskazówki dotyczące wydajności.

* Zmień nazwy tabel, używając `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})
#### Migracja wsadowa tabel historii

* Przygotuj katalogi dla Data Pump.

Data Pump musi mieć uprawnienia do odczytu i zapisu w tych katalogach.

Przykład:

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

* Utwórz obiekt katalogu i nadaj uprawnienia do odczytu i zapisu dla tego obiektu użytkownikowi używanemu do uwierzytelniania Zabbix ('zabbix' w poniższym przykładzie). W roli *sysdba* uruchom:

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

* Wyeksportuj tabele. Zastąp N żądaną liczbą wątków.

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

* Zaimportuj tabele. Zastąp N żądaną liczbą wątków.

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

* Postępuj zgodnie z [instrukcjami po migracji](#postmigration), aby usunąć stare tabele.

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

[comment]: # ({51b383a5-f0426f06})
#### Indywidualna migracja tabel historycznych

* Przygotuj katalogi dla Data Pump dla każdej tabeli historycznej.
Data Pump musi mieć uprawnienia do odczytu i zapisu w tych katalogach.

Przykład:

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

* Utwórz obiekt katalogu i przyznaj uprawnienia do odczytu i zapisu do tego obiektu użytkownikowi używanemu do uwierzytelniania Zabbix ('zabbix' w poniższym przykładzie). W roli *sysdba* uruchom:

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

* Wyeksportuj i zaimportuj każdą tabelę. Zastąp N żądaną liczbą wątków.

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

* Postępuj zgodnie z [instrukcjami po migracji](#postmigration), aby usunąć stare tabele.

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

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

Dla wszystkich baz danych, po zakończeniu migracji wykonaj następujące czynności:

* Zweryfikuj, że wszystko działa zgodnie z oczekiwaniami.

* Usuń stare tabele:

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

* W przypadku TimescaleDB usuń również następującą starą tabelę:

```sql
DROP TABLE trends_old;
```

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

[comment]: # ({16ed11f0-8ee7d9aa})
#### Zobacz także

-   [Przygotowanie tabeli auditlog do partycjonowania](/manual/appendix/install/auditlog_primary_keys)

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