Sidebar

Become a monitoring expert!
Sign up for Zabbix training

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:

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

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:

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

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/[email protected]_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/[email protected]_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;