読み取り専用パーティションは、履歴データ、アーカイブデータ、またはコンプライアンス関連の機密データを偶発的な変更から保護します。個々のパーティションまたはテーブル全体を読み取り専用としてマークすると、自動的にトリガーされるものを含め、INSERT、UPDATE、DELETE 操作がブロックされます。
次の図は、読み取り専用パーティションを示しています。
構文
作成時のテーブルレベルでの読み取り専用モードの設定
テーブルレベルで READ ONLY または READ WRITE を適用して、すべてのパーティションのデフォルトモードを設定します。個々のパーティションは、オーバーライドされない限り、このデフォルトを継承します。
CREATE TABLE [IF NOT EXISTS] [schema.]table_name
table_definition [READ {ONLY | WRITE}]
partition_options;partition_options の構文:
PARTITION BY
{ RANGE{(expr) | COLUMNS(column_list)} }
[(partition_definition [, partition_definition] ...)]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]既存のテーブルへの読み取り専用パーティションの追加
ALTER TABLE と ADD PARTITION を使用して、テーブルレベルの読み取り専用モードを継承するパーティションを追加します。
ALTER TABLE tbl_name
[alter_option [, alter_option] ...]
[partition_options]partition_options と partition_option の構文:
partition_options:
partition_option [partition_option] ...
partition_option: {
ADD PARTITION (partition_definition)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]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
}パラメーター
| パラメーター | 説明 |
|---|---|
table_name | テーブルの名前。 |
expr | パーティションキー列の式。 |
column_list | パーティションキー列のリスト。式はサポートされていません。 |
MAXVALUE | パーティションの最大値。 |
partition_name | パーティションの名前。テーブル内で一意である必要があります。 |
engine_name | ストレージエンジンの名前。 |
table_options | テーブルオプション。 |
col_name | 列の名前。 |
注意事項
許可される操作とブロックされる操作
| 操作 | 読み取り専用パーティション上で許可される |
|---|---|
SELECT | はい |
INSERT | いいえ |
UPDATE | いいえ |
DELETE | いいえ |
| データを変更する DDL | いいえ |
ALTER TABLE ... ADD COLUMN | はい — 列を追加しても既存のデータは変更されません |
ブロックされた操作が試行されると、次のエラーが返されます:
ERROR HY000: Data in a read-only partition or subpartition cannot be modified.読み取り専用パーティションを持つテーブルで許可される DDL 操作の例:
ALTER TABLE [schema.]table_name ADD col_new varchar(100) DEFAULT 'i am not empty';例
すべてのパーティションが読み取り専用のテーブルの作成
テーブルレベルで READ ONLY を適用します。すべてのパーティションがこのモードを継承します。
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)
);既存のテーブルへの読み取り専用パーティションの追加
READ ONLY テーブルに追加された新しいパーティションは、テーブルレベルのモードを自動的に継承します。
ALTER TABLE t1 ADD PARTITION (PARTITION p3 VALUES LESS THAN (2030));期待される出力:
Query OK, 0 rows affected (0.22 sec)
Records: 0 Duplicates: 0 Warnings: 0p3 がテーブルレベルの READ ONLY モードを継承していることを確認します:
SHOW CREATE TABLE t1;期待される出力:
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 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)/*!99990 800020201 ... */ コメントブロック内の READ ONLY マーカーは、テーブルレベルのモードがアクティブであり、4 つすべてのパーティションがそれを継承していることを示しています。
読み取り専用と読み取り/書き込みが混在するパーティションを持つテーブルの作成
テーブルを READ WRITE に設定し、個々のパーティションを 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
);どのパーティションが読み取り専用であるかを確認します:
SHOW CREATE TABLE t1;期待される出力:
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 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)パーティション p0 と p2 は、それぞれのコメントブロックに READ ONLY と表示されますが、p1 にはオーバーライドがなく、デフォルトで READ WRITE になります。