Você está visualizando a documentação da versão de desenvolvimento, que pode estar incompleta.
Esta página foi traduzida automaticamente. Se você notar um erro, selecione-o e pressione Ctrl+Enter para reportá-lo aos editores.

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

Visão geral

Esta seção fornece instruções para atualizar manualmente 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.

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 suficiente em disco; 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.

Desde o Zabbix 7.0, a atualização de tabelas para chaves primárias também atualiza as tabelas para usar tipos de dados de precisão dupla.

Se você possui o Zabbix 7.0 (ou posterior), as tabelas já usam precisão dupla. 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 precisão dupla.

Se você possui o Zabbix 6.4 (ou anterior), considere atualizar as tabelas para precisão dupla primeiro. Para mais informações, consulte Atualizando para valores numéricos de faixa estendida na documentação do Zabbix 7.0.

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

Notas importantes

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

  1. Pare o Zabbix server.

Parar o Zabbix server durante a atualização é fortemente recomendado. No entanto, se absolutamente necessário, você pode executar a atualização enquanto o server está em execução (apenas para MySQL, MariaDB e PostgreSQL sem TimescaleDB).

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

Execute os scripts apenas 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 frontend do Zabbix pode ser colocado em modo de manutenção.

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

MySQL 8.4+ com mysqlsh

Este método pode ser usado com um Zabbix server em execução, mas é recomendável parar o server durante o tempo da atualização. O MySQL Shell (mysqlsh) deve estar instalado e capaz de se conectar ao banco de dados.

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

  • Inicie o MySQL com a variável local_infile habilitada.

  • Renomeie as tabelas antigas e crie novas tabelas executando history_upgrade_prepare.sql.

mysql -uzabbix -p<senha> 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 via socket, pode ser necessário especificar o caminho.

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

Altere para o modo JavaScript usando:

\js

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

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 possui suporte a JS. Nesse caso, instale o pacote oficial do MySQL Shell da Oracle (ou compile a partir do código-fonte) para que o modo JavaScript seja habilitado.

MariaDB/MySQL 8.4+ sem mysqlsh

Este método de atualização leva mais tempo e deve ser usado apenas se uma atualização com mysqlsh não for possível.

Atualização de tabelas
  • Faça login no console do MySQL como root (recomendado) ou qualquer usuário com privilégios de FILE.

  • Inicie o MySQL com a variável local_infile habilitada.

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

mysql -uzabbix -p<senha> 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:

SET @@max_execution_time=0;

Para MariaDB:

SET @@max_statement_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;

Siga as instruções pós-migração para remover as tabelas antigas.

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

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

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 para os arquivos nas queries conforme necessário ou defina o valor de secure_file_priv como uma string vazia durante a atualização.

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 para o caminho que contém os dados da tabela exportada ('/var/lib/mysql-files/' no exemplo acima).

Para mais informações, consulte a documentação do MySQL ou a documentação do MariaDB.

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:

SET @@max_execution_time=0;

Para MariaDB:

SET @@max_statement_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';

Siga as instruções pós-migração para remover as tabelas antigas.

PostgreSQL

A exportação e importação devem ser realizadas em tmux/screen para garantir que a sessão não seja encerrada. Para instalações com TimescaleDB, ignore esta seção e prossiga para PostgreSQL + TimescaleDB.

Veja também: Notas importantes

Atualização de tabelas

  • Renomeie as tabelas usando history_upgrade_prepare.sql:
sudo -u zabbix psql zabbix < /usr/share/zabbix/sql-scripts/postgresql/option-patches/history_upgrade_prepare.sql

Migração com o server parado

  • Exporte o histórico atual, importe para a tabela temporária e, em seguida, insira os dados nas novas tabelas ignorando duplicatas:
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, Checkpoint Distance and Amount of WAL.

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:
\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;

PostgreSQL + TimescaleDB

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 parado durante a atualização.

Veja também: Notas importantes

  • Renomeie as tabelas usando history_upgrade_prepare.sql.
    • Se a compactação estiver habilitada (na instalação padrão), execute o script de /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/with-compression:

      cat /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/with-compression/history_upgrade_prepare.sql | sudo -u zabbix psql zabbix
    • Se a compactação estiver desabilitada, execute o script de /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/without-compression:

      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 de acordo com as configurações de compactação:
    • Se a compactação estiver habilitada (na instalação padrão), execute os scripts de /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/with-compression:

      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 compactação estiver desabilitada, execute os scripts de /usr/share/zabbix/sql-scripts/postgresql/timescaledb/option-patches/without-compression:

      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 para melhorar o desempenho de INSERT.

Pós-migração

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

  • Verifique se tudo está funcionando conforme o esperado.

  • Exclua as 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;
  • Para TimescaleDB, exclua também a seguinte tabela antiga:
DROP TABLE trends_old;

Veja também