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.
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 |
|
|
Nome da tabela. |
|
|
Expressão das colunas de chave de partição. |
|
|
Lista de colunas de chave de partição. Não há suporte para expressões. |
|
|
Valor máximo permitido na partição. |
|
|
Nome da partição. Deve ser único dentro da tabela. |
|
|
Nome do mecanismo de armazenamento. |
|
|
Opções de configuração da tabela. |
|
|
Nome da coluna. |
Notas de uso
Operações permitidas e bloqueadas
|
Operação |
Permitida em partições somente leitura |
|
|
Sim |
|
|
Não |
|
|
Não |
|
|
Não |
|
DDL que altera dados |
Não |
|
|
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.