コアバリュー
APシナリオ(分析系シナリオ)では、通常、以下の課題に直面します:
- 膨大なデータの増加: ログ、ユーザー行動、センサーデータなどが継続的に書き込まれます。
- リソース管理の複雑さ: パーティションの手動作成・削除は時間がかかり、エラーが発生しやすいです。
- ストレージコストの圧力: ストレージの膨張を防ぐため、履歴データを自動的にクリーンアップする必要があります。
動的パーティショニングのソリューション
事前設定されたルール(時間単位、事前作成サイクル、有効期限など)に基づき、OceanBaseはパーティションを自動管理し、以下を実現します:
- ゼロオペレーションでの拡張: スケジュールタスクにより事前にパーティションを作成するため、手動での介入は不要です。(動的パーティショニングでは、スケジュールタスクにより事前設定されたルールに従ってパーティションを事前作成します。OceanBase 4.4.2/4.5.0バージョンで追加されたIntervalパーティションは、データ書き込み時に自動的にパーティションを作成することをサポートします。)
- インテリジェントなクリーンアップ: 必要に応じて古いパーティションを削除し、ストレージ容量を解放します。
- クエリの高速化: パーティションのトリミングにより、スキャンするデータ量が削減されます。
機能
TIME_UNIT(時間、日、月など)に基づいて定期的に新しいパーティションを作成し、データが時間範囲に応じて自動的に拡張されることを保証します。- パーティション境界は時間単位(例:
hour、day)に基づいて分割され、時間系列データを格納するシナリオ(ログ、取引記録など)に適しています。 PRECREATE_TIMEを使用して、将来いつまでのパーティションを事前作成するかを指定することで、データの急増によるパーティション不足を回避します。EXPIRE_TIMEに基づいて定期的に期限切れのパーティションをクリーンアップし、ストレージ容量を解放します。- カスタムタイムゾーン(
TIME_ZONE)をサポートし、タイムゾーンをまたいだデータの一貫性を確保します。 bigint型のタイムスタンプの精度設定(例:BIGINT_PRECISION)をサポートし、異なる時間精度要件に対応します。
主なユースケース
動的パーティションのプロパティを変更する
ビジネス要件の変更
- 動的パーティション管理を有効または無効にする必要がある場合は、PARAMETER ENABLEのプロパティを調整します。
- データの保持期間を延長する必要がある場合(例:30日から90日への延長)、動的パーティションの
EXPIRE_TIMEプロパティを調整します。
ビジネスのピーク時対応
- セール期間中にパーティション不足を避けるため、より多くのパーティションを事前作成する必要がある場合、動的パーティションの
PRECREATE_TIMEプロパティを調整します。
- セール期間中にパーティション不足を避けるため、より多くのパーティションを事前作成する必要がある場合、動的パーティションの
動的パーティションのプロパティを変更する例:
-- 事前作成期間を3日、有効期限を90日に変更し、動的パーティションを有効にする
ALTER TABLE user_behavior DYNAMIC_PARTITION_POLICY(
PRECREATE_TIME = '3 DAY',
EXPIRE_TIME = '90 DAY',
ENABLE = TRUE
);
-- 動的パーティション管理を一時的に無効にする
ALTER TABLE user_behavior DYNAMIC_PARTITION_POLICY(ENABLE = FALSE);
動的パーティションの拡張設定シナリオ
シナリオ:コンプライアンス要件によるデータ保持期間の延長
-- 有効期限を90日に延長する ALTER TABLE user_behavior DYNAMIC_PARTITION_POLICY( EXPIRE_TIME = '90 DAY' );
パーティション管理
OceanBaseは組み込みのスケジュールタスクによって動的パーティション管理を行いますが、以下のシナリオでは手動での調整もサポートしています:
スケジュールタスクの実行時間を変更し、ビジネスのピーク時を避ける:
CALL DBMS_SCHEDULER.SET_ATTRIBUTE( 'SCHEDULED_MANAGE_DYNAMIC_PARTITION_DAILY', 'START_DATE', '2025-11-14 02:00:00' );- 現在時刻が
2025-11-13 15:00:00、デフォルトの次回スケジュール時間が2025-11-14 00:00:00と仮定した場合、毎日午前2時にスケジュールを変更したい場合は、次回のスケジュール時間を2025-11-14 02:00:00に変更します。
- 現在時刻が
特別なビジネス要件:
CALL DBMS_PARTITION.MANAGE_DYNAMIC_PARTITION();- 動的パーティション管理タスクを1回手動で実行し、期限切れのパーティションを即座にクリーンアップしたり、将来のパーティションを事前作成したりします(緊急ストレージ回収など)。
動的パーティションテーブルの設計
CREATE TABLE user_behavior (
user_id BIGINT,
event_time DATETIME NOT NULL,
event_type VARCHAR(50),
device_info VARCHAR(255)
)
DYNAMIC_PARTITION_POLICY(
ENABLE = TRUE,
TIME_UNIT = 'hour',
PRECREATE_TIME = '3 hour',
EXPIRE_TIME = '1 DAY',
TIME_ZONE = '+8:00'
)
PARTITION BY RANGE COLUMNS(event_time) (
PARTITION p_start VALUES LESS THAN ('2025-11-13 13:30:00')
);
動的パーティショニングポリシーの検証
ステップ1:テーブル設定の確認
show create table user_behavior\G
出力結果は次のとおりです:
*************************** 1. row ***************************
Table: user_behavior
Create Table: CREATE TABLE `user_behavior` (
`user_id` bigint(20) DEFAULT NULL,
`event_time` datetime NOT NULL,
`event_type` varchar(50) DEFAULT NULL,
`device_info` varchar(255) DEFAULT NULL
) ORGANIZATION INDEX DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE ENABLE_MACRO_BLOCK_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 DYNAMIC_PARTITION_POLICY = (ENABLE = TRUE, TIME_UNIT = 'HOUR', PRECREATE_TIME = '3HOUR', EXPIRE_TIME = '1DAY', TIME_ZONE = '+8:00', BIGINT_PRECISION = 'NONE')
partition by range columns(`event_time`)
(partition `p_start` values less than ('2025-11-13 13:30:00'))
1 row in set
パーティションの確認:
-- パーティション拡張をトリガーし、システムの自動スケジューリングを待つか、テスト環境で手動で1回実行します。
CALL DBMS_PARTITION.MANAGE_DYNAMIC_PARTITION();
SHOW CREATE TABLE user_behavior\G
少なくとも1つのパーティション定義が指定されている場合、事前作成されたパーティションはテーブル作成後すぐには作成されません。動的パーティション管理のスケジューリングを待つか、手動で動的パーティション管理を1回実行する必要があります。動的パーティション管理を実行すると、システムは time_unit の間隔でパーティションを作成し続け、最大パーティションの境界が now() + precreate_time を超えるまで続けます。最初に作成されるパーティションの境界は、現存する最大パーティションの境界を time_unit で切り上げた値となります。例えば、現在時刻が 2025-11-13 14:50:00 の場合、動的パーティション管理を1回スケジュールした後の予想されるパーティションの結果は次のとおりです:
*************************** 1. row ***************************
Table: user_behavior
Create Table: CREATE TABLE `user_behavior` (
`user_id` bigint(20) DEFAULT NULL,
`event_time` datetime NOT NULL,
`event_type` varchar(50) DEFAULT NULL,
`device_info` varchar(255) DEFAULT NULL
) ORGANIZATION INDEX DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE ENABLE_MACRO_BLOCK_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 DYNAMIC_PARTITION_POLICY = (ENABLE = TRUE, TIME_UNIT = 'HOUR', PRECREATE_TIME = '3HOUR', EXPIRE_TIME = '1DAY', TIME_ZONE = '+8:00', BIGINT_PRECISION = 'NONE')
partition by range columns(`event_time`)
(partition `p_start` values less than ('2025-11-13 13:30:00'),
partition `P2025111313` values less than ('2025-11-13 14:00:00'),
partition `P2025111314` values less than ('2025-11-13 15:00:00'),
partition `P2025111315` values less than ('2025-11-13 16:00:00'),
partition `P2025111316` values less than ('2025-11-13 17:00:00'),
partition `P2025111317` values less than ('2025-11-13 18:00:00'))
1 row in set
既存の最大パーティションの境界が現在時刻より小さい場合、事前作成されたパーティションは過去のパーティションを補完しようと試みます。例えば、既存の最大パーティションが PARTITION P0 VALUES LESS THAN ('2025-11-13 11:30:00') で、現在時刻が 2025-11-13 12:34:56 の場合、動的パーティション管理を1回スケジュールした後のパーティションは次のとおりです:
PARTITION P0 VALUES LESS THAN ('2025-11-13 11:30:00'),
PARTITION P2025111311 VALUES LESS THAN ('2025-11-13 12:00:00'),
PARTITION P2025111312 VALUES LESS THAN ('2025-11-13 13:00:00'),
PARTITION P2025111313 VALUES LESS THAN ('2025-11-13 14:00:00'),
PARTITION P2025111314 VALUES LESS THAN ('2025-11-13 15:00:00'),
PARTITION P2025111315 VALUES LESS THAN ('2025-11-13 16:00:00')
ステップ2:テストデータを挿入する
-- 様々な種類のテストデータを挿入し、異なる時間範囲をカバーする
-- 現在時刻は2025-11-13 15:00:00と仮定する
-- (a) 現在時刻のデータを挿入する(P2025111315に該当する)
INSERT INTO user_behavior (user_id, event_time, event_type, device_info)
VALUES (1001, '2025-11-13 15:25:00', 'click', 'iPhone15');
-- (b) 1時間後のデータを挿入する(P2025111316に該当する、事前に作成済み)
INSERT INTO user_behavior (user_id, event_time, event_type, device_info)
VALUES (1002, '2025-11-13 16:10:00', 'purchase', 'MacBook');
-- (c) 25時間前の期限切れデータを挿入する(2025-11-12 13:00:00、最初のパーティションに該当する)
INSERT INTO user_behavior (user_id, event_time, event_type, device_info)
VALUES (1003, '2025-11-12 13:00:00', 'old_event', 'Android');
-- (d) 初期パーティション内にちょうど収まるデータを挿入する(< 13:30)
INSERT INTO user_behavior (user_id, event_time, event_type, device_info)
VALUES (1004, '2025-11-13 13:20:00', 'view', 'iPad');
-- パーティションの拡張を確認する
SHOW CREATE TABLE user_behavior\G
出力例:
*************************** 1. row ***************************
Table: user_behavior
Create Table: CREATE TABLE `user_behavior` (
`user_id` bigint(20) DEFAULT NULL,
`event_time` datetime NOT NULL,
`event_type` varchar(50) DEFAULT NULL,
`device_info` varchar(255) DEFAULT NULL
) ORGANIZATION INDEX DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE ENABLE_MACRO_BLOCK_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 DYNAMIC_PARTITION_POLICY = (ENABLE = TRUE, TIME_UNIT = 'HOUR', PRECREATE_TIME = '3HOUR', EXPIRE_TIME = '1DAY', TIME_ZONE = '+8:00', BIGINT_PRECISION = 'NONE')
partition by range columns(`event_time`)
(partition `p_start` values less than ('2025-11-13 13:30:00'),
partition `P2025111313` values less than ('2025-11-13 14:00:00'),
partition `P2025111314` values less than ('2025-11-13 15:00:00'),
partition `P2025111315` values less than ('2025-11-13 16:00:00'),
partition `P2025111316` values less than ('2025-11-13 17:00:00'),
partition `P2025111317` values less than ('2025-11-13 18:00:00'),
partition `P2025111318` values less than ('2025-11-13 19:00:00'))
1 row in set
ステップ3:クエリ検証
-- 過去2時間のアクティブユーザーを照会する
SELECT
DATE_FORMAT(event_time, '%Y-%m-%d %H:00') AS hour_slot,
COUNT(*) AS event_count,
COUNT(DISTINCT user_id) AS active_users
FROM user_behavior
WHERE event_time >= NOW() - INTERVAL 2 HOUR
GROUP BY hour_slot
ORDER BY hour_slot;
データ結果:
+------------------+-------------+--------------+
| hour_slot | event_count | active_users |
+------------------+-------------+--------------+
| 2025-11-13 13:00 | 1 | 1 |
| 2025-11-13 15:00 | 1 | 1 |
| 2025-11-13 16:00 | 1 | 1 |
+------------------+-------------+--------------+
3 rows in set
ステップ4:期限切れデータのクリーンアップ検証(オプション)
24時間以上経過するか、手動でシステム時刻を進めて(テスト環境)、再度管理をトリガーします。
-- 現在が2025-11-14 15:00:00であると仮定する
CALL DBMS_PARTITION.MANAGE_DYNAMIC_PARTITION();
-- パーティションが2025-11-13 14:00より前のデータを削除したかどうか確認する
SHOW CREATE TABLE user_behavior\G
ステップ5:パーティション管理タスクの監視
出力例:
SELECT JOB_NAME, ENABLED, NEXT_RUN_DATE
FROM oceanbase.DBA_SCHEDULER_JOBS
WHERE JOB_NAME = 'SCHEDULED_MANAGE_DYNAMIC_PARTITION_HOURLY';
想定される出力結果は次のとおりです:
+-------------------------------------------+---------+----------------------------+
| JOB_NAME | ENABLED | NEXT_RUN_DATE |
+-------------------------------------------+---------+----------------------------+
| SCHEDULED_MANAGE_DYNAMIC_PARTITION_HOURLY | 1 | 2025-11-13 16:00:00.000000 |
+-------------------------------------------+---------+----------------------------+
1 row in set
ステップ6:タスクの実行履歴を確認する
SELECT
TIMESTAMP,
VALUE1 AS success_tables,
VALUE2 AS failed_tables,
COST_TIME,
RET_CODE
FROM oceanbase.DBA_OB_TENANT_EVENT_HISTORY
WHERE event = 'MANAGE_DYNAMIC_PARTITION'
ORDER BY TIMESTAMP DESC
LIMIT 3;
期待される出力結果は次のとおりです:
+----------------------------+--------------------------+---------------+-----------+----------+
| TIMESTAMP | success_tables | failed_tables | COST_TIME | RET_CODE |
+----------------------------+--------------------------+---------------+-----------+----------+
| 2025-11-13 15:00:00.173069 | [500020, 500053] | [] | 164938 | 0 |
| 2025-11-13 14:47:56.816717 | [500003, 500020, 500053] | [] | 63801 | 0 |
| 2025-11-13 14:00:00.125075 | [500020] | [] | 117113 | 0 |
+----------------------------+--------------------------+---------------+-----------+----------+
3 rows in set
これにより、パーティション管理が正常に実行されたかどうかをトラブルシューティングできます。
ステップ7:挿入時の境界動作を検証する(オプション)
事前に作成した範囲を超えるデータの挿入を試みます(現在時刻が2025-11-13 15:07:00、挿入する時間が2025-11-13 20:00:00、事前作成の上限時間が2025-11-13 19:00:00と仮定します):
INSERT INTO user_behavior VALUES (999, '2025-11-13 20:00:00', 'future', 'test');
-- エラーが発生します:ERROR 1526 (HY000): Table has no partition for value
関連ビュー
データディクショナリビュー
データディクショナリビュー DBA_OB_DYNAMIC_PARTITION_TABLES を照会することで、動的パーティションテーブルの関連属性を確認できます。
DBA_OB_DYNAMIC_PARTITION_TABLESビューはすべてのテナントから参照可能で、現在のテナントの動的パーティションテーブルデータが含まれます。oceanbase.CDB_OB_DYNAMIC_PARTITION_TABLESビューはsysテナントでのみ参照可能で、すべてのテナントの動的パーティションテーブルデータが含まれます。
動的性能ビュー
動的性能ビュー V$OB_DYNAMIC_PARTITION_TABLES を照会することで、メモリから動的パーティションテーブルの関連属性を読み取り、読み取り性能は良好です。
- sysテナントでは、
V$OB_DYNAMIC_PARTITION_TABLESがすべてのテナントの動的パーティションテーブルデータを表示します。 - ユーザーテナントでは、現在のテナントの動的パーティションテーブルデータのみが表示されます。