Todos os produtos
Search
Central de documentação

PolarDB:Criar uma partição somente leitura

Última atualização: Jul 02, 2026

Partições somente leitura protegem dados históricos, de arquivamento ou sensíveis a conformidade contra modificações acidentais. Marque partições individuais ou a tabela inteira como somente leitura para bloquear operações INSERT, UPDATE e DELETE — incluindo aquelas disparadas automaticamente.

A figura a seguir ilustra as partições somente leitura.Read-only partition

Sintaxe

Definir o modo somente leitura no nível da tabela durante a criação

Aplique READ ONLY ou READ WRITE no nível da tabela para configurar o modo padrão de todas as partições. As partições individuais herdam esse padrão, a menos que haja uma substituição explícita.

CREATE TABLE [IF NOT EXISTS] [schema.]table_name
    table_definition [READ {ONLY | WRITE}]
    partition_options;

Sintaxe de partition_options:

PARTITION BY
    { RANGE{(expr) | COLUMNS(column_list)} }
    [(partition_definition [, partition_definition] ...)]

Sintaxe de partition_definition:

PARTITION partition_name
        [VALUES LESS THAN {expr | MAXVALUE}]
        [READ {ONLY | WRITE}]
        [[STORAGE] ENGINE [=] engine_name]
        [COMMENT [=] 'string' ]
        [DATA DIRECTORY [=] 'data_dir']
        [INDEX DIRECTORY [=] 'index_dir']
        [MAX_ROWS [=] max_number_of_rows]
        [MIN_ROWS [=] min_number_of_rows]
        [TABLESPACE [=] tablespace_name]

Adicionar uma partição somente leitura a uma tabela existente

Utilize ALTER TABLE com ADD PARTITION para incluir uma partição que herda o modo somente leitura definido no nível da tabela.

ALTER TABLE tbl_name
    [alter_option [, alter_option] ...]
    [partition_options]

Sintaxe de partition_options e partition_option:

partition_options:
    partition_option [partition_option] ...

partition_option: {
    ADD PARTITION (partition_definition)

Sintaxe de partition_definition:

PARTITION partition_name
        [VALUES LESS THAN {expr | MAXVALUE}]
        [READ {ONLY | WRITE}]
        [[STORAGE] ENGINE [=] engine_name]
        [COMMENT [=] 'string' ]
        [DATA DIRECTORY [=] 'data_dir']
        [INDEX DIRECTORY [=] 'index_dir']
        [MAX_ROWS [=] max_number_of_rows]
        [MIN_ROWS [=] min_number_of_rows]
        [TABLESPACE [=] tablespace_name]

Sintaxe de alter_option:

alter_option: {
    table_options
  | ADD [COLUMN] col_name column_definition
            [FIRST | AFTER col_name]
  | ADD [COLUMN] (col_name column_definition,...)
  | ADD {INDEX | KEY} [index_name]
            [index_type] (key_part,...) [index_option] ...
  | ADD {FULLTEXT | SPATIAL} [INDEX | KEY] [index_name]
            (key_part,...) [index_option] ...
  | ADD [CONSTRAINT [symbol]] PRIMARY KEY
            [index_type] (key_part,...)
            [index_option] ...
  | ADD [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY]
            [index_name] [index_type] (key_part,...)
            [index_option] ...
  | ADD [CONSTRAINT [symbol]] FOREIGN KEY
            [index_name] (col_name,...)
            reference_definition
  | ADD [CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]
  | DROP {CHECK | CONSTRAINT} symbol
  | ALTER {CHECK | CONSTRAINT} symbol [NOT] ENFORCED
  | ALGORITHM [=] {DEFAULT | INSTANT | INPLACE | COPY}
  | ALTER [COLUMN] col_name {
            SET DEFAULT {literal | (expr)}
          | SET {VISIBLE | INVISIBLE}
          | DROP DEFAULT
        }
  | ALTER INDEX index_name {VISIBLE | INVISIBLE}
  | CHANGE [COLUMN] old_col_name new_col_name column_definition
            [FIRST | AFTER col_name]
  | [DEFAULT] CHARACTER SET [=] charset_name [COLLATE [=] collation_name]
  | CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
  | {DISABLE | ENABLE} KEYS
  | {DISCARD | IMPORT} TABLESPACE
  | DROP [COLUMN] col_name
  | DROP {INDEX | KEY} index_name
  | DROP PRIMARY KEY
  | DROP FOREIGN KEY fk_symbol
  | FORCE
  | LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}
  | MODIFY [COLUMN] col_name column_definition
            [FIRST | AFTER col_name]
  | ORDER BY col_name [, col_name] ...
  | RENAME COLUMN old_col_name TO new_col_name
  | RENAME {INDEX | KEY} old_index_name TO new_index_name
  | RENAME [TO | AS] new_tbl_name
  | {WITHOUT | WITH} VALIDATION
}

Parâmetros

Parâmetro

Descrição

table_name

Nome da tabela.

expr

Expressão das colunas de chave de partição.

column_list

Lista de colunas de chave de partição. Não há suporte para expressões.

MAXVALUE

Valor máximo permitido na partição.

partition_name

Nome da partição. Deve ser único dentro da tabela.

engine_name

Nome do mecanismo de armazenamento.

table_options

Opções de configuração da tabela.

col_name

Nome da coluna.

Notas de uso

Operações permitidas e bloqueadas

Operação

Permitida em partições somente leitura

SELECT

Sim

INSERT

Não

UPDATE

Não

DELETE

Não

DDL que altera dados

Não

ALTER TABLE ... ADD COLUMN

Sim — a adição de uma coluna não modifica os dados existentes

Ao tentar executar uma operação bloqueada, o sistema retorna o seguinte erro:

ERROR HY000: Data in a read-only partition or subpartition cannot be modified.

Exemplo de uma operação DDL permitida em uma tabela com partições somente leitura:

ALTER TABLE [schema.]table_name ADD col_new varchar(100) DEFAULT 'i am not empty';

Exemplos

Criar uma tabela com todas as partições somente leitura

Aplique READ ONLY no nível da tabela. Todas as partições herdarão esse modo.

CREATE TABLE t1 (
  id INT,
  year_col INT
) READ ONLY
PARTITION BY RANGE (year_col) (
  PARTITION p0 VALUES LESS THAN (2001),
  PARTITION p1 VALUES LESS THAN (2010),
  PARTITION p2 VALUES LESS THAN (2020)
);

Adicionar uma partição somente leitura a uma tabela existente

Uma nova partição adicionada a uma tabela READ ONLY herda automaticamente o modo definido no nível da tabela.

ALTER TABLE t1 ADD PARTITION (PARTITION p3 VALUES LESS THAN (2030));

Saída esperada:

Query OK, 0 rows affected (0.22 sec)
Records: 0  Duplicates: 0  Warnings: 0

Verifique se p3 herdou o modo READ ONLY do nível da tabela:

SHOW CREATE TABLE t1;

Saída esperada:

+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `id` int(11) DEFAULT NULL,
  `year_col` int(11) DEFAULT NULL
) /*!99990 800020201 READ ONLY */ ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
/*!50100 PARTITION BY RANGE (`year_col`)
(PARTITION p0 VALUES LESS THAN (2001) ENGINE = InnoDB,
 PARTITION p1 VALUES LESS THAN (2010) ENGINE = InnoDB,
 PARTITION p2 VALUES LESS THAN (2020) ENGINE = InnoDB,
 PARTITION p3 VALUES LESS THAN (2030) ENGINE = InnoDB) */ |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

O marcador READ ONLY no bloco de comentários /*!99990 800020201 ... */ confirma que o modo no nível da tabela está ativo e que todas as quatro partições o herdaram.

Criar uma tabela com partições mistas (somente leitura e leitura/gravação)

Defina a tabela como READ WRITE e substitua o modo em partições específicas com READ ONLY.

CREATE TABLE t1 (
    id INT,
    year_col INT
) READ WRITE
PARTITION BY RANGE (year_col) (
    PARTITION p0 VALUES LESS THAN (2001) READ ONLY,
    PARTITION p1 VALUES LESS THAN (2010),
    PARTITION p2 VALUES LESS THAN (2020) READ ONLY
);

Verifique quais partições estão configuradas como somente leitura:

SHOW CREATE TABLE t1;

Saída esperada:

+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `id` int(11) DEFAULT NULL,
  `year_col` int(11) DEFAULT NULL
) /*!99990 800020201 READ WRITE */ ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
/*!50100 PARTITION BY RANGE (`year_col`)
(PARTITION p0 VALUES LESS THAN (2001) */ /*!99990 800020201  READ ONLY */
/*!50100  ENGINE = InnoDB,
 PARTITION p1 VALUES LESS THAN (2010) ENGINE = InnoDB,
 PARTITION p2 VALUES LESS THAN (2020) */ /*!99990 800020201  READ ONLY */
/*!50100  ENGINE = InnoDB) */ |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

As partições p0 e p2 exibem READ ONLY em seus respectivos blocos de comentários, enquanto p1 não possui substituição e assume o padrão READ WRITE.