Todos os produtos
Search
Central de documentação

PolarDB:Arquivar tabelas particionadas no X-Engine

Última atualização: Jun 29, 2026

À medida que o volume de dados em uma tabela particionada aumenta, os dados históricos mais antigos (dados frios) ocupam espaço significativo de armazenamento e elevam custos. Para reduzir despesas sem perder o acesso às informações, use uma política de Data Lifecycle Management (DLM) para arquivar automaticamente as partições mais antigas no formato do mecanismo de alta compressão (X-Engine). Esse recurso permite separar dados quentes e mornos no nível da partição. Os dados quentes permanecem em partições InnoDB de alto desempenho, enquanto os dados mornos arquivados no X-Engine reduzem substancialmente os custos de armazenamento e continuam a suportar gravações DML e alterações Online DDL.

Como funciona

O recurso de arquivamento automático de partições utiliza uma política de Data Lifecycle Management (DLM) definida na tabela. O funcionamento ocorre da seguinte forma:

  1. Definição da política: Configure uma política DLM ao criar uma tabela com CREATE TABLE ou ao modificar uma tabela existente com ALTER TABLE. O núcleo da política é uma condição que determina quando arquivar. Por exemplo, se o número de partições ultrapassar um limiar, o sistema marca a partição mais antiga para arquivamento.

  2. Disparo da execução: A política não é acionada automaticamente. Inicie a tarefa de arquivamento de uma das duas maneiras abaixo:

    • Execução manual: Chame um procedimento armazenado do sistema para executar imediatamente todas as políticas DLM definidas.

    • Execução agendada: Crie um EVENT para chamar automaticamente o procedimento armazenado e executar as políticas conforme um cronograma predefinido, como diariamente fora do horário de pico.

  3. Realização do arquivamento: Durante a execução da política, o sistema identifica as partições da tabela que atendem às condições de arquivamento e altera online o mecanismo de armazenamento de InnoDB para X-Engine, concluindo o processo.

Pré-requisitos

Antes de utilizar este recurso, verifique se o seu cluster atende aos seguintes requisitos:

  • Edição: Cluster Edition.

  • Versão do kernel:

    • Para arquivar no formato baseado em linhas do X-Engine:

      • MySQL 8.0.2, versão de revisão 8.0.2.2.34.1 ou posterior.

    • Para arquivar no formato de tabela colunar do X-Engine:

      • MySQL 8.0.2, versão de revisão 8.0.2.2.34.1 ou posterior.

Configurar e executar o arquivamento de partições

Esta seção orienta você na criação, execução e verificação de uma política de arquivamento.

Visão geral do processo

  1. Crie uma política de arquivamento DLM: Defina as regras de arquivamento na tabela particionada de destino.

  2. Execute a política de arquivamento DLM: Dispare o processo de arquivamento manualmente ou por meio de uma tarefa agendada.

  3. Visualize o status e os resultados do arquivamento: Verifique se as partições foram convertidas com sucesso para o mecanismo X-Engine.

Etapa 1: Criar uma política de arquivamento DLM

Defina uma política de arquivamento ao criar uma tabela particionada ou adicione-a a uma tabela existente.

  • Método 1: Definir uma política ao criar uma nova tabela

    Use a cláusula DLM ADD POLICY ao final da instrução CREATE TABLE. O exemplo abaixo cria uma tabela sales que usa a coluna order_time como chave de particionamento. Esta tabela possui duas políticas: uma política INTERVAL e uma política DLM.

    • Política INTERVAL: Cria automaticamente novas partições para intervalos de um ano quando os dados inseridos estão fora dos intervalos de partição existentes.

    • Política DLM: Define uma política chamada policy_part2part. Essa política especifica que, quando o número total de partições exceder três, o sistema marca a partição mais antiga para arquivamento no X-Engine.

    CREATE TABLE `sales` (
      `id` int DEFAULT NULL,
      `name` varchar(20) DEFAULT NULL,
      `order_time` datetime NOT NULL,
      primary key (order_time)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    PARTITION BY RANGE  COLUMNS(order_time) INTERVAL(YEAR, 1)
    (PARTITION p20200101000000 VALUES LESS THAN ('2020-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION p20210101000000 VALUES LESS THAN ('2021-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION p20220101000000 VALUES LESS THAN ('2022-01-01 00:00:00') ENGINE = InnoDB)
    DLM ADD POLICY policy_part2part TIER TO PARTITION ENGINE=XENGINE READ WRITE ON (PARTITIONS OVER 3);
  • Método 2: Adicionar uma política a uma tabela existente

    Use a instrução ALTER TABLE para adicionar uma política DLM a uma tabela particionada existente. Para mais informações, consulte Criar ou excluir uma política DLM no ALTER TABLE.

    ALTER TABLE sales
    DLM ADD POLICY policy_part2part TIER TO PARTITION ENGINE=XENGINE ON (PARTITIONS OVER 3);

    Descrição da sintaxe: ON (PARTITIONS OVER N) representa o núcleo da política, onde N é a quantidade de partições recentes a serem mantidas no mecanismo InnoDB. Quando o total de partições supera N, o sistema marca as partições mais antigas além desse limite para arquivamento.

Inserir dados de teste

  1. Use o procedimento armazenado proc_batch_insert para inserir dados de teste na tabela particionada sales. Isso aciona a política INTERVAL para criar novas partições automaticamente.

    DROP PROCEDURE IF EXISTS proc_batch_insert;
    delimiter $$
    CREATE PROCEDURE proc_batch_insert(IN begin INT, IN end INT, IN name VARCHAR(20))
    BEGIN
    SET @insert_stmt = concat('INSERT INTO ', name, ' VALUES(? , ?, ?);');
    PREPARE stmt from @insert_stmt;
    WHILE begin <= end DO
    SET @ID1 = begin;
    SET @NAME = CONCAT(begin+begin*281313, '@stiven');
    SET @TIME = from_days(begin + 737600);
    EXECUTE stmt using @ID1, @NAME, @TIME;
    SET begin = begin + 1;
    END WHILE;
    END;
    $$
    delimiter ;
    
    CALL proc_batch_insert(1, 3000, 'sales');

    O resultado a seguir indica que os dados foram inseridos com sucesso:

    Query OK, 1 row affected (0.50 sec)
  2. Execute o comando abaixo para visualizar a estrutura da tabela sales.

    SHOW CREATE TABLE sales \G

    A saída exibe a estrutura da tabela, na qual todas as partições utilizam atualmente o mecanismo InnoDB.

    mysql> SHOW CREATE TABLE sales \G
    *************************** 1. row ***************************
           Table: sales
    Create Table: CREATE TABLE `sales` (
      `id` int(11) DEFAULT NULL,
      `name` varchar(20) DEFAULT NULL,
      `order_time` datetime NOT NULL,
      PRIMARY KEY (`order_time`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
    /*!50500 PARTITION BY RANGE  COLUMNS(order_time) */ /*!99990 800020200 INTERVAL(YEAR, 1) */
    /*!50500 (PARTITION p20200101000000 VALUES LESS THAN ('2020-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION p20210101000000 VALUES LESS THAN ('2021-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION p20220101000000 VALUES LESS THAN ('2022-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION _p20230101000000 VALUES LESS THAN ('2023-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION _p20240101000000 VALUES LESS THAN ('2024-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION _p20250101000000 VALUES LESS THAN ('2025-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION _p20260101000000 VALUES LESS THAN ('2026-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION _p20270101000000 VALUES LESS THAN ('2027-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION _p20280101000000 VALUES LESS THAN ('2028-01-01 00:00:00') ENGINE = InnoDB) */

Etapa 2: Executar a política de arquivamento DLM

Dispare a política de arquivamento definida para iniciar o processo de conversão do mecanismo das partições. Escolha entre a execução manual ou o agendamento de tarefas, conforme as necessidades do seu negócio.

  • Método 1: Execução agendada (Recomendado): Em ambientes de produção que exigem arquivamento regular de dados, recomenda-se o uso do recurso EVENT do MySQL para executar a tarefa automaticamente fora do horário de pico, como nas primeiras horas da manhã. Essa abordagem automatiza o processo.

    O exemplo a seguir cria um evento que começa em 01/02/2026 e roda diariamente à 01:00 para executar todas as políticas DLM.

    CREATE EVENT dlm_system_base_event
           ON SCHEDULE EVERY 1 DAY
        STARTS '2026-02-01 01:00:00'
        do CALL 
    dbms_dlm.execute_all_dlm_policies();
  • Método 2: Execução manual: Ideal para tarefas únicas de arquivamento ou para tentar novamente uma tarefa após a solução de problemas.

    Chame o procedimento armazenado abaixo para disparar imediatamente todas as políticas DLM definidas.

    CALL dbms_dlm.execute_all_dlm_policies();

Etapa 3: Visualizar o status e os resultados do arquivamento

Monitore o progresso da tarefa de arquivamento. Após a conclusão, verifique se houve alteração nos mecanismos das partições.

  1. Visualize a definição da política

    Consulte a tabela de sistema mysql.dlm_policies para confirmar a criação da política.

    SELECT * FROM mysql.dlm_policies WHERE Table_schema = 'your_database' AND Table_name = 'sales'\G

    O resultado retornado é semelhante ao seguinte:

    *************************** 1. row ***************************
                       Id: 1
             Table_schema: your_database
               Table_name: sales
              Policy_name: policy_part2part
              Policy_type: PARTITION
             Archive_type: PARTITION COUNT
             Storage_mode: READ WRITE
           Storage_engine: XENGINE
            Storage_media: DISK
      Storage_schema_name: NULL
       Storage_table_name: NULL
          Data_compressed: ON
     Compressed_algorithm: Zstandard
                  Enabled: ENABLED
          Priority_number: 200
    Tier_partition_number: 3
           Tier_condition: NULL
               Extra_info: {"oss_file_filter": "order_time"}
                  Comment: NULL

    Descrição dos campos principais:

    Campo

    Descrição

    Table_schema, Table_name

    Banco de dados e tabela aos quais a política pertence.

    Policy_name

    Nome personalizado da política.

    Storage_engine

    Mecanismo de armazenamento de destino para as partições arquivadas. Neste exemplo, trata-se do XENGINE.

    Tier_partition_number

    Quantidade de partições InnoDB a serem retidas conforme definido pela política. Corresponde ao valor N em PARTITIONS OVER N.

  2. Acompanhe o progresso da execução

    Durante ou após a execução da política, consulte a tabela de sistema mysql.dlm_progress para rastrear o status da tarefa.

    SELECT * FROM mysql.dlm_progress WHERE Table_schema = 'your_database' AND Table_name = 'sales' ORDER BY Id DESC LIMIT 1\G

    O resultado retornado é semelhante ao seguinte:

    *************************** 1. row ***************************
                      Id: 1
            Table_schema: your_database
              Table_name: sales
             Policy_name: policy_part2part
             Policy_type: PARTITION
          Archive_option: PARTITIONS OVER 3
          Storage_engine: XENGINE
           Storage_media: DISK
         Data_compressed: ON
    Compressed_algorithm: Zstandard
      Archive_partitions: p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, _p20250101000000
           Archive_stage: ARCHIVE_COMPLETE
      Archive_percentage: 100
      Archived_file_info: null
              Start_time: 2026-02-06 10:50:00
                End_time: 2026-02-06 10:50:00
              Extra_info: null

    Descrição dos campos principais:

    Campo

    Descrição

    Archive_partitions

    Partições arquivadas nesta tarefa.

    Archive_stage

    Status atual da tarefa de arquivamento. ARCHIVE_COMPLETE indica sucesso, enquanto ARCHIVE_ERROR sinaliza falha.

    Archive_percentage

    Percentual de conclusão da tarefa.

    Start_time, End_time

    Horários de início e término da tarefa.

    Extra_info

    Informações adicionais. Caso Archive_stage seja ARCHIVE_ERROR, este campo contém os detalhes do erro.

  3. Verifique a estrutura da tabela

    Após a conclusão da tarefa de arquivamento, use o comando SHOW CREATE TABLE para visualizar a estrutura da tabela e confirmar que o ENGINE das partições arquivadas mudou para XENGINE.

    SHOW CREATE TABLE sales\G

    O resultado retornado é semelhante ao seguinte:

    *************************** 1. row ***************************
           Table: sales
    Create Table: CREATE TABLE `sales` (
      `id` int(11) DEFAULT NULL,
      `name` varchar(20) DEFAULT NULL,
      `order_time` datetime NOT NULL,
      PRIMARY KEY (`order_time`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
    /*!99990 800020216 PARTITION BY RANGE  COLUMNS(order_time) */ /*!99990 800020200 INTERVAL(YEAR, 1) */
    /*!99990 800020216 (PARTITION p20200101000000 VALUES LESS THAN ('2020-01-01 00:00:00') ENGINE = XENGINE,
     PARTITION p20210101000000 VALUES LESS THAN ('2021-01-01 00:00:00') ENGINE = XENGINE,
     PARTITION p20220101000000 VALUES LESS THAN ('2022-01-01 00:00:00') ENGINE = XENGINE,
     PARTITION _p20230101000000 VALUES LESS THAN ('2023-01-01 00:00:00') ENGINE = XENGINE,
     PARTITION _p20240101000000 VALUES LESS THAN ('2024-01-01 00:00:00') ENGINE = XENGINE,
     PARTITION _p20250101000000 VALUES LESS THAN ('2025-01-01 00:00:00') ENGINE = XENGINE,
     PARTITION _p20260101000000 VALUES LESS THAN ('2026-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION _p20270101000000 VALUES LESS THAN ('2027-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION _p20280101000000 VALUES LESS THAN ('2028-01-01 00:00:00') ENGINE = InnoDB) */

Considerações para produção

  • Design da política: Escolha um valor apropriado para N em PARTITIONS OVER N com base no seu cenário de negócios. Por exemplo, para dados de pedidos, pode ser interessante manter os últimos seis meses em partições InnoDB para garantir a performance das consultas. Já para dados de log, talvez baste reter apenas os últimos 30 dias.

  • Monitoramento e alertas: Acompanhe o campo Archive_stage na tabela mysql.dlm_progress. Se o status for ARCHIVE_ERROR, dispare um alerta imediato para permitir uma intervenção rápida.