全部產品
Search
文件中心

PolarDB:建立混合分區

更新時間:Aug 01, 2026

您可以通過建立混合分區(Hybrid Partition)的方式來訪問儲存在不同引擎中的資料。

混合分區原理如下圖所示:

混合分區的基本原理是將分區表中的分區儲存在不同的儲存介質上,以達到冷熱資料分離管理的目的。比如將熱資料存放區在本地PFS上,冷資料存放區在OSS上,這樣可以極大地降低冷資料的儲存成本,且不影響熱資料的查詢效能,也不影響對熱資料執行DML操作。

說明

將分區表歸檔為混合分區表,則需要滿足以下條件:

  • MySQL 8.0.2且修訂版本為8.0.2.2.34.1及以上版本,您需設定loose_allow_create_hybrid_partition參數的值為ON

  • MySQL 8.0.2且修訂版本為8.0.2.2.34.1以下版本,請升級對應的小版本。

適用範圍

  • 叢集版本需為PolarDB MySQL版8.0.2版本且核心小版本需為8.0.2.2.34.1及以上。您可以通過查詢版本號碼來確認叢集版本。

  • OSS上已存在需要建立的分區的資料檔案,且資料檔案名稱需要符合以下命名規則:

    • 副檔名和分區標記需大寫。

    • 表名和分區名與資料庫中的名稱保持一致。

    樣本:假設表t1p1分區為CSV引擎,則該分區的資料檔案命名為:t1#P#p1.CSV

  • 支援通過冷資料歸檔功能將分區表歸檔為混合分區表。

注意事項

  • 建立的混合分區表至少需要包含一個在InnoDB引擎上建立的分區。表級引擎必須為InnoDB引擎。

  • 建立包含二級分區的混合分區表時,一級分區的引擎必須和表的引擎保持一致,且二級分區至少需要包含一個在InnoDB引擎上建立的分區。

  • 混合分區表的分區類型目前僅支援RANGELIST 類型。

  • 不支援對混合分區表中的CSV/ORC分區執行DML操作(包括INSERTUPDATEDELETELOAD)。

參數說明

使用混合分區表時,您可以根據實際使用情境在PolarDB叢集的参数配置設定以下參數。

參數名

層級

參數說明

loose_polar_dlm_storage_mode

Global

自動歸檔冷資料(DLM)功能的開啟參數。取值如下:

  • OFF(預設):DLM 儲存禁用。調度器不啟動,不執行任何歸檔操作。

  • RO(不推薦):DLM 儲存唯讀。可查詢已歸檔的冷資料分區,但不執行新的歸檔寫入操作,生產環境很少用到。

  • RW(推薦):DLM 儲存讀寫。調度器啟動,支援按照 DLM Policy 自動執行歸檔操作,同時支援查詢已歸檔資料。

說明
  • 當前參數僅適用於MySQL 8.0.2且修訂版本為8.0.2.2.34.1及以上版本。

  • 開啟冷資料歸檔功能後,系統會自動將此參數設定為RW,您無需手動修改。

  • 若僅使用XEngine高壓縮引擎進行分區表歸檔(不使用 OSS 冷資料歸檔),需手動將此參數設定為RW來啟用 DLM 調度。

loose_allow_create_hybrid_partition

Global

控制是否允許建立或者歸檔成包含非 InnoDB 引擎分區的分區表的切換參數。取值如下:

  • OFF(預設):禁止建立含非 InnoDB 引擎的分區表。所有分區必須使用 InnoDB 引擎。

  • ON(推薦):允許建立含非 InnoDB 引擎的分區表。支援在分區層級指定 OSS(CSV/ORC)或 XEngine 引擎。

說明
  • 當前參數僅適用於MySQL 8.0.2且修訂版本為8.0.2.2.34.1及以上版本。

  • 開啟冷資料歸檔功能後,某些版本系統會自動將此參數設定為ON

dlm_prune_archiving_oss_partitions

Global / Session

自動歸檔冷資料(DLM)自動裁剪參數開關。DML(UPDATE/DELETE)執行時,系統自動裁剪掉正在歸檔為 OSS(ORC/CSV)的分區和已經歸檔到 OSS 的分區,避免被歸檔阻塞,解決 DML 與 DDL 的衝突。取值如下:

  • ON(預設,推薦):DML(UPDATE/DELETE)自動裁剪正在歸檔為 OSS 的分區。

  • OFF:DML 不做自動裁剪正在歸檔為 OSS 的分區。

hybrid_partition_query_mix_engine_enabled

Global / Session

查詢自動裁剪參數開關。查詢(SELECT)執行時,系統自動裁剪掉 OSS(ORC/CSV)分區,避免常規查詢因為訪問冷資料導致的慢查詢。取值如下:

  • OFF(預設,推薦):查詢自動裁剪 OSS 分區。

  • ON(不推薦):查詢不自動裁剪 OSS 分區。

建立混合分區

您可以通過已有的OSS Server來建立混合分區,如果當前不存在OSS Server,您可以通過以下文法來建立OSS Server:

CREATE SERVER oss_server_name
FOREIGN DATA WRAPPER oss
OPTIONS(EXTRA_SERVER_INFO '{"oss_endpoint": "<my_oss_endpoint>",
"oss_bucket": "<my_oss_bucket>", "oss_access_key_id": "<my_oss_access_key_id>",
"oss_access_key_secret": "<my_oss_access_key_secret>", "oss_prefix":"<my_oss_prefix>", "oss_sts_token": "<my_oss_sts_token>"}');
說明

叢集版本為PolarDB MySQL版8.0.2版本且Revision version為8.0.2.2.6及以上時,支援使用my_oss_sts_token參數。

參數說明如下表所示:

參數

類型

備忘

oss_server_name

字串

OSS server名稱。

說明

該參數為全域參數,且全域唯一。該參數不區分大小寫,最大長度不超過64個字元,超過64個字元的名稱會被自動截斷。您可以將OSS server名稱指定為帶引號的字串。

my_oss_endpoint

字串

OSS對應地區的網域名稱。

說明

如果是從阿里雲的主機訪問資料庫,應該使用內網網域名稱(即帶有“internal”的網域名稱),避免產生公網流量。

my_oss_bucket

字串

資料檔案所在OSS的bucket,需要通過OSS預先建立。

my_oss_access_key_id

字串

OSS帳號ID。

my_oss_access_key_secret

字串

OSS帳號KEY。

my_oss_prefix

字串

OSS路徑首碼。用於指定資料檔案的存放路徑。不能包含特殊字元,也不可為空。

my_oss_sts_token

字串

OSS臨時訪問憑證。擷取OSS臨時訪問憑證詳情請參見擷取臨時訪問憑證

說明

my_oss_sts_token參數值有預設的到期時間。如果my_oss_sts_token已到期,您需要通過以下命令重設EXTRA_SERVER_INFO中的全部參數值。

ALTER SERVER server_name OPTIONS(EXTRA_SERVER_INFO '{"oss_endpoint": "<my_oss_endpoint>",
"oss_bucket": "<my_oss_bucket>", "oss_access_key_id": "<my_oss_access_key_id>",
"oss_access_key_secret": "<my_oss_access_key_secret>", "oss_prefix":"<my_oss_prefix>", "oss_sts_token": "<my_oss_sts_token>"}');

建立混合分區表,樣本如下:

CREATE TABLE t2(a1 INT, a2 VARCHAR(30), a3 VARCHAR(256))
CONNECTION = "oss_server_name"
PARTITION BY RANGE(a1)
(
   PARTITION p1 values less than (1000) ENGINE = CSV,
   PARTITION p2 values less than (2000) ENGINE = CSV,
   PARTITION p3 values less than (3000) ENGINE = INNODB
);

查詢混合分區

您可以通過以下三種方式來查詢不同引擎的分區資料。

  • 設定 hybrid_partition_query_mix_engine_enabled參數為ON。執行查詢語句時,查詢結果中就會包含InnoDB引擎、X-Engine引擎與OSS中的分區資料。樣本如下:

    -- t1為混合分區表
    SELECT * FROM t1;
  • 設定 hybrid_partition_query_mix_engine_enabled參數為OFF。執行查詢語句時,查詢結果中就僅包含InnoDB引擎與X-Engine引擎中的分區資料。樣本如下:

    -- t1為混合分區表
    SELECT * FROM t1;
  • 指定分區名:通過指定分區名稱查詢,您可以擷取任意引擎類型中的分區資料,樣本如下:

    -- t1為混合分區表,p1為查詢的分區名。
    SELECT * FROM t1 partition (p1);