Esta é uma tradução da página de documentação original em inglês. Ajude-nos a torná-la melhor.

3 Atualização de banco de dados para chaves primárias

Visão geral

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

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

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

The instructions provided on this page are designed for advanced users. Note that these instructions might need to be adjusted for your specific configuration.

Anotações importantes

  • Certifique-se de fazer backup do banco de dados antes da atualização
  • Se seu banco de dados usa partições, entre em contato com o administrador do banco de dados ou com a equipe de suporte do Zabbix para obter ajuda
  • Os arquivos CSV podem ser removidos após uma atualização bem-sucedida para as chaves primárias

MySQL

A exportação e importação devem ser realizadas no tmux/screen, para que a sessão não seja descartada.

Veja também: Notas importantes

MySQL 5.7+/8.0+
  • Renomeie tabelas antigas, crie novas tabelas executando history_pk_prepare.sql.
mysql -uzabbix -p<senha> zabbix < /usr/share/doc/zabbix-sql-scripts/mysql/history_pk_prepare.sql
  • Exportar e importar dados

mysqlsh deve ser instalado. mysqlsh deve ser capaz de se conectar ao banco de dados. Se a conexão for feita através do socket, pode ser necessário indicar explicitamente um caminho para ele.

Conecte-se via mysqlsh:

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

Executar (CSVPATH deve/pode ser ajustado de acordo com as necessidades):

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

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

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

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

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

       util.exportTable("history_text_old", CSVPATH + "/history_text.csv", { dialeto: "csv" });
       util.importTable(CSVPATH + "/history_text.csv", {"dialect": "csv", "table": "history_text" });
  • Verifique se tudo funciona como esperado

  • Derrube tabelas antigas

DROP TABLE history_old;
       DROP TABLE history_uint_old;
       DROP TABLE history_str_old;
       DROP TABLE history_log_old;
       DROP TABLE history_text_old;
MySQL <5.7, MariaDB (ou se mysqlsh não puder ser usado por algum motivo)

Esta opção é mais lenta e demorada, use somente se há uma razão para não usar o mysqlsh.

  • Renomeie tabelas antigas, crie novas tabelas executando history_pk_prepare.sql.
mysql -uzabbix -p<senha> zabbix < /usr/share/doc/zabbix-sql-scripts/mysql/history_pk_prepare.sql
  • Exportar e importar dados

Verifique se a importação/exportação está habilitada apenas para arquivos no caminho específico:

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

Se o valor for um caminho para o diretório, a exportação/importação poderá ser executada para arquivos nesse diretório. Neste caso, caminhos para arquivos em consultas devem ser editado em conformidade. Alternativamente, secure_file_priv pode ser desabilitado (definido como string vazia) durante a atualização. Se o valor estiver vazio, exportar/importar pode ser executado de/para arquivos que podem estar localizados em qualquer lugar.

max_execution_time deve ser desabilitado antes de exportar os dados para evitar o tempo limite durante a exportação.

SET @@max_execution_time=0;

       SELECT * INTO OUTFILE '/var/lib/mysql-files/history.csv' CAMPOS TERMINADOS POR ',' ESCAPED POR '"' LINHAS TERMINADAS POR '\n' FROM history_old;
       LOAD DATA INFILE '/var/lib/mysql-files/history.csv' IGNORE INTO TABLE history CAMPOS TERMINADOS POR ',' ESCAPED POR '"' LINHAS TERMINADAS POR '\n';

       SELECT * INTO OUTFILE '/var/lib/mysql-files/history_uint.csv' CAMPOS TERMINADOS POR ',' ESCAPED POR '"' LINHAS TERMINADAS POR '\n' FROM history_uint_old;
       LOAD DATA INFILE '/var/lib/mysql-files/history_uint.csv' IGNORE INTO TABLE history_uint CAMPOS TERMINADOS POR ',' ESCAPADO POR '"' LINHAS TERMINADAS POR '\n';

       SELECT * INTO OUTFILE '/var/lib/mysql-files/history_str.csv' CAMPOS TERMINADOS POR ',' ESCAPED POR '"' LINHAS TERMINADAS POR '\n' FROM history_str_old;
       LOAD DATA INFILE '/var/lib/mysql-files/history_str.csv' IGNORE INTO TABLE history_str CAMPOS TERMINADOS POR ',' ESCAPED POR '"' LINHAS TERMINADAS POR '\n';

       SELECT * INTO OUTFILE '/var/lib/mysql-files/history_log.csv' CAMPOS TERMINADOS POR ',' ESCAPED POR '"' LINHAS TERMINADAS POR '\n' FROM history_log_old;
       LOAD DATA INFILE '/var/lib/mysql-files/history_log.csv' IGNORE INTO TABLE history_log CAMPOS TERMINADOS POR ',' ESCAPED POR '"' LINHAS TERMINADAS POR '\n';

       SELECT * INTO OUTFILE '/var/lib/mysql-files/history_text.csv' CAMPOS TERMINADOS POR ',' ESCAPED POR '"' LINHAS TERMINADAS POR '\n' FROM history_text_old;
       LOAD DATA INFILE '/var/lib/mysql-files/history_text.csv' IGNORE INTO TABLE history_text CAMPOS TERMINADOS POR ',' ESCAPED POR '"' LINHAS TERMINADAS POR '\n';
  • Verifique se tudo funciona como esperado

  • Derrube tabelas antigas

DROP TABLE history_old;
       DROP TABLE history_uint_old;
       DROP TABLE history_str_old;
       DROP TABLE history_log_old;
       DROP TABLE history_text_old;
Melhorando a performance

Dicas adicionais para melhorar o desempenho em ambos os casos:

  • Aumente o buffer bulk_insert_buffer_size na configuração arquivo dentro da seção [mysqld] ou defina-o antes de importar com SET:
[mysqld]
       bulk_insert_buffer_size=256M

       mysql cli > SET SESSION bulk_insert_buffer_size= 1024 * 1024 * 256;
       mysql cli > ... importar consultas ...
  • Consulte "Otimizando o carregamento de dados em massa do InnoDB": (MySQL 5.7, MySQL 8.0)

  • Desabilite o log binário (não deve ser usado no caso de servidores escravos, uma vez que não irá replicar dados):

mysql cli > SET SESSION SQL_LOG_BIN=0;
       mysql cli > ... importar consultas ...

MySQL 8.0+ with mysqlsh

This method can be used with a running Zabbix server, but it is recommended to stop the server for the time of the upgrade. The MySQL Shell (mysqlsh) must be installed and able to connect to the DB.

  • Log in to MySQL console as root (recommended) or as any user with FILE privileges.

  • Start MySQL with local_infile variable enabled.

  • Rename old tables and create new tables by running history_pk_prepare.sql.

mysql -uzabbix -p<password> zabbix < /usr/share/doc/zabbix-sql-scripts/mysql/history_pk_prepare.sql
  • Export and import data.

Connect via mysqlsh. If using a socket connection, specifying the path might be required.

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

Run (CSVPATH can be changed as needed):

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

MariaDB/MySQL 8.0+ without mysqlsh

This upgrade method takes more time and should be used only if an upgrade with mysqlsh is not possible.

Table upgrade
  • Log in to MySQL console as root (recommended) or any user with FILE privileges.

  • Start MySQL with local_infile variable enabled.

  • Rename old tables and create new tables by running history_pk_prepare.sql:

mysql -uzabbix -p<password> zabbix < /usr/share/doc/zabbix-sql-scripts/mysql/history_pk_prepare.sql
Migration with stopped server

max_execution_time must be disabled before migrating data to avoid timeout during migration.

SET @@max_execution_time=0;
       
       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;

Follow post-migration instructions to drop the old tables.

Migration with running server

Check for which paths import/export is enabled:

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

If secure_file_priv value is a path to a directory, export/import will be performed for files in that directory. In this case, edit paths to files in queries accordingly or set the secure_file_priv value to an empty string for the upgrade time.

If secure_file_priv value is empty, export/import can be performed from any location.

If secure_file_priv value is NULL, set it to the path that contains exported table data ('/var/lib/mysql-files/' in the example above).

For more information, see MySQL documentation.

max_execution_time must be disabled before exporting data to avoid timeout during export.

SET @@max_execution_time=0;
       
       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';

Follow post-migration instructions to drop the old tables.

PostgreSQL

A exportação e importação devem ser realizadas no tmux/screen, para que a sessão não seja descartada.

Veja também: Notas importantes

Atualizando tabelas
  • Renomeie tabelas usando history_pk_prepare.sql.
sudo -u zabbix psql zabbix < /usr/share/doc/zabbix-sql-scripts/postgresql/history_pk_prepare.sql
  • Exporte o histórico atual, importe-o para a tabela temporária, e insira-o em novas tabelas enquanto ignora duplicatas
\copy history_old TO '/tmp/history.csv' DELIMITER ',' CSV
       CRIAR TABELA TEMP temp_history (
       itemid bigint NÃO NULO,
       clock integer DEFAULT '0' NOT NULL,
       valor PRECISÃO DUPLA PADRÃO '0.0000' NÃO NULO,
       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) NÃO FAÇA NADA;

       \copy history_uint_old TO '/tmp/history_uint.csv' DELIMITER ',' CSV
       CRIAR TABELA TEMP temp_history_uint (
       itemid bigint NÃO NULO,
       clock integer DEFAULT '0' NOT NULL,
       valor numérico(20) PADRÃO '0' NÃO NULO,
       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) NÃO FAÇA NADA;

       \copy history_str_old TO '/tmp/history_str.csv' DELIMITER ',' CSV
       CRIAR TABELA TEMP temp_history_str (
       itemid bigint NÃO NULO,
       clock integer DEFAULT '0' NOT NULL,
       valor varchar(255) DEFAULT '' NÃO NULO,
       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) NÃO FAÇA NADA;

       \copy history_log_old TO '/tmp/history_log.csv' DELIMITER ',' CSV
       CRIAR TABELA TEMP temp_history_log (
       itemid bigint NÃO NULO,
       clock integer DEFAULT '0' NOT NULL,
       timestamp integer DEFAULT '0' NOT NULL,
       fonte varchar(64) DEFAULT '' NÃO NULO,
       severidade integer DEFAULT '0' NOT NULL,
       valor texto DEFAULT '' NÃO NULO,
       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) NÃO FAÇA NADA;

       \copy history_text_old TO '/tmp/history_text.csv' DELIMITER ',' CSV
       CRIAR TABELA TEMP temp_history_text (
       itemid bigint NÃO NULO,
       clock integer DEFAULT '0' NOT NULL,
       valor texto DEFAULT '' NÃO NULO,
       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) NÃO FAÇA NADA;
  • Verifique se tudo funciona como esperado

  • Derrube tabelas antigas

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

Considere usar as seguintes dicas para melhorar o desempenho da pastilha:

Migration with running server

  • Export current history, import it to the temp table, then insert the data into new tables while ignoring duplicates:
\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;

TimescaleDB v1.x

A exportação e importação devem ser realizadas no tmux/screen, para que a sessão não seja descartada.

Veja também: Notas importantes

Atualizando tabelas
  • Renomeie tabelas usando history_pk_prepare.sql.
sudo -u zabbix psql zabbix < /usr/share/doc/zabbix-sql-scripts/postgresql/history_pk_prepare.sql
  • Exemplo de atualização para uma tabela:
-- Verifique se há espaço suficiente para permitir a exportação de dados não compactados
       selecione sum(before_compression_total_bytes)/1024/1024 como before_compression_total_mbytes, sum(after_compression_total_bytes)/1024/1024 como after_compression_total_mbytes FROM chunk_compression_stats('history_uint_old');

       -- Exportar dados
       \copy (selecione * from history_uint_old) TO '/tmp/history_uint.csv' DELIMITER ',' CSV

       CRIAR TABELA TEMP temp_history_uint (
       itemid bigint NÃO NULO,
       clock integer DEFAULT '0' NOT NULL,
       valor numérico(20) PADRÃO '0' NÃO NULO,
       ns integer DEFAULT '0' NOT NULL
       );
       -- Importar dados
       \copy temp_history_uint FROM '/tmp/history_uint.csv' DELIMITER ',' CSV

       -- Criar hipertabela e preenchê-la
       selecione create_hypertable('history_uint', 'clock', chunk_time_interval => 86400, migrate_data => true);
       INSERT INTO history_uint SELECT * FROM temp_history_uint ON CONFLICT (itemid,clock,ns) NÃO FAÇA NADA;

       -- Ativar a compactação
       selecione set_integer_now_func('history_uint', 'zbx_ts_unix_now', true);
       alter table history_uint set (timescaledb.compress,timescaledb.compress_segmentby='itemid',timescaledb.compress_orderby='clock,ns');

       -- O ID do trabalho será retornado, deve ser passado para run_job
       selecione add_compress_chunks_policy('history_uint', (
       selecione (p.older_than).integer_interval de _timescaledb_config.bgw_policy_compress_chunks p
       junção interna _timescaledb_catalog.hypertable h on (h.id=p.hypertable_id) onde h.table_name='history_uint'
       )::inteiro
       );

       select alter_job((selecione job_id de timescaledb_information.jobs onde hypertable_schema='public' e hypertable_name='history_uint'), schedule => true);

       -- Executar trabalho de compactação
       chame run_job(<JOB_ID>);
       -- Pode mostrar 'NOTICE: nenhum chunks for hypertable public.history_uint que satisfaça a política de compressão de chunks', tudo bem.
  • Verifique se tudo funciona como esperado

  • Derrube tabelas antigas

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

Veja também: Dicas para melhorar o desempenho de inserção do PostgreSQL

TimescaleDB v2.x

A exportação e importação devem ser realizadas no tmux/screen, para que a sessão não seja descartada.

Veja também: Notas importantes

Atualizando tabelas
  • Renomeie tabelas usando history_pk_prepare.sql.
sudo -u zabbix psql zabbix < /usr/share/doc/zabbix-sql-scripts/postgresql/history_pk_prepare.sql
  • Exemplo de atualização para uma tabela:
-- Verifique se há espaço suficiente para permitir a exportação de dados não compactados
       selecione sum(before_compression_total_bytes)/1024/1024 como before_compression_total_mbytes, sum(after_compression_total_bytes)/1024/1024 como after_compression_total_mbytes FROM chunk_compression_stats('history_uint_old');

       -- Exportar dados
       \copy (selecione * from history_uint_old) TO '/tmp/history_uint.csv' DELIMITER ',' CSV

       CRIAR TABELA TEMP temp_history_uint (
       itemid bigint NÃO NULO,
       clock integer DEFAULT '0' NOT NULL,
       valor numérico(20) PADRÃO '0' NÃO NULO,
       ns integer DEFAULT '0' NOT NULL
       );
       -- Importar dados
       \copy temp_history_uint FROM '/tmp/history_uint.csv' DELIMITER ',' CSV

       -- Criar hipertabela e preenchê-la
       selecione create_hypertable('history_uint', 'clock', chunk_time_interval => 86400, migrate_data => true);
       INSERT INTO history_uint SELECT * FROM temp_history_uint ON CONFLICT (itemid,clock,ns) NÃO FAÇA NADA;

       -- Ativar a compactação
       selecione set_integer_now_func('history_uint', 'zbx_ts_unix_now', true);
       alter table history_uint set (timescaledb.compress,timescaledb.compress_segmentby='itemid',timescaledb.compress_orderby='clock,ns');

       -- Substitui seu esquema em hypertable_schema
       -- O ID do trabalho será retornado, deve ser passado para run_job
       selecione add_compression_policy('history_uint', (
       selecione extract(epoch from (config::json->>'compress_after')::interval) de timescaledb_information.jobs onde application_name como 'Compression%%' e hypertable_schema='public' e hypertable_name='history_uint_old'
       )::inteiro
       );

       select alter_job((selecione job_id de timescaledb_information.jobs onde hypertable_schema='public' e hypertable_name='history_uint'), schedule => true);

       -- Executar trabalho de compactação
       chame run_job(<JOB_ID>);
       -- Pode mostrar 'NOTICE: nenhum chunks for hypertable public.history_uint que satisfaça a política de compressão de chunks', tudo bem.
  • Verifique se tudo funciona como esperado

  • Derrube tabelas antigas

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

Veja também: Dicas para melhorar o desempenho de inserção do PostgreSQL

Batch migration of history tables

  • Prepare directories for Data Pump.

Data Pump must have read and write permissions to these directories.

Example:

mkdir -pv /export/history
       chown -R oracle:oracle /export
  • Create a directory object and grant read and write permissions to this object to the user used for Zabbix authentication ('zabbix' in the example below). Under sysdba role, run:
create directory history as '/export/history';
       grant read,write on directory history to zabbix;
  • Export tables. Replace N with the desired thread count.
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
  • Import tables. Replace N with the desired thread count.
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

Oracle

A exportação e importação devem ser realizadas no tmux/screen, para que a sessão não seja descartada.

Veja também: Notas importantes

Importar/exportar tabelas de histórico em uma tentativa

Além disso, considere dicas de desempenho para o Oracle Data Pump.

  • Renomeie tabelas usando history_pk_prepare.sql.
shell> cd /path/to/zabbix-sources/database/oracle
       shell> sqlplus zabbix/senha@oracle_host/ORCL
       sqlplus> @history_pk_prepare.sql
  • Preparar diretórios para datapump

Exemplo:

# mkdir -pv /exportar/histórico
       # chown -R oracle: oracle /export
  • Crie um objeto de diretório, conceda permissões a ele. Execute o seguinte na função sysdba:
crie o histórico do diretório como '/export/history';
       conceder leitura, gravação no histórico do diretório para o zabbix;
  • Exportar tabelas. Substitua N pela contagem de linhas desejada.
expdp zabbix/[email protected]:1521/z \
       DIRETÓRIO=histórico \
       TABLES=history_old,history_uint_old,history_str_old,history_log_old,history_text_old \
       PARALELO=N
  • Importar tabelas. Substitua N pela contagem de linhas desejada.
impdp zabbix/[email protected]:1521/z \
       DIRETÓRIO=histórico \
       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
  • Verifique se tudo funciona como esperado

  • Derrube tabelas antigas

DROP TABLE history_old;
       DROP TABLE history_uint_old;
       DROP TABLE history_str_old;
       DROP TABLE history_log_old;
       DROP TABLE history_text_old;
Importar/exportar tabelas de histórico individualmente

Além disso, considere dicas de desempenho para o Oracle Data Pump.

  • Renomeie tabelas usando history_pk_prepare.sql.
shell> cd /path/to/zabbix-sources/database/oracle
       shell> sqlplus zabbix/senha@oracle_host/ORCL
       sqlplus> @history_pk_prepare.sql
  • Preparar diretórios para datapump

Exemplo:

# 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, conceda permissões a ele. Execute o seguinte na função sysdba:
crie o histórico do diretório como '/export/history';
       conceder leitura, gravação no histórico do diretório para o zabbix;

       crie o diretório history_uint como '/export/history_uint';
       concede leitura, gravação no diretório history_uint para zabbix;

       crie o diretório history_str como '/export/history_str';
       conceder leitura, gravação no diretório history_str para zabbix;

       crie o diretório history_log como '/export/history_log';
       conceder leitura, gravação no diretório history_log para zabbix;

       crie o diretório history_text como '/export/history_text';
       conceder leitura, gravação no diretório history_text para zabbix;
  • Exporte e importe cada tabela. Substitua N pela contagem de linhas desejada.
expdp zabbix/[email protected]:1521/xe DIRECTORY=histórico TABLES=history_old PARALLEL=N

       impdp zabbix/[email protected]: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/[email protected]:1521/xe DIRECTORY=history_uint TABLES=history_uint_old PARALLEL=N

       impdp zabbix/[email protected]: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/[email protected]:1521/xe DIRECTORY=history_str TABLES=history_str_old PARALLEL=N

       impdp zabbix/[email protected]: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/[email protected]:1521/xe DIRECTORY=history_log TABLES=history_log_old PARALLEL=N

       impdp zabbix/[email protected]: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/[email protected]:1521/xe DIRECTORY=history_text TABLES=history_text_old PARALLEL=N

       impdp zabbix/[email protected]: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
  • Verifique se tudo funciona como esperado

  • Derrube tabelas antigas

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

Post-migration

For all databases, once the migration is completed, do the following:

  • Verify that everything works as expected.

  • Drop old tables:

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