首批通过分布式安全可靠测评,为关键业务系统打造
为已有表设置透明加密
更新时间:2026-04-07 20:57:20
功能适用性
OceanBase 数据库社区版暂不支持数据透明加密。
本节主要介绍如何为已有表开启透明加密。
OceanBase 数据库的数据加密单位为表空间(Tablespace)。OceanBase 数据库并非一个多数据文件的数据库系统,表空间是为了兼容而设计的概念,可以简单理解为表空间是一组表的集合。
本节以在加密表空间 sectest_ts1 上为已有表 t1 开启加密为例,提供透明加密的操作指导。
使用限制
- 系统租户不能开启加密。
- 租户配置透明加密后,除非租户重建,否则无法再切换为其他加密模式。
前提条件
在配置透明加密之前,需要先生成租户主密钥。请参见 生成租户主密钥(MySQL 模式)。
创建加密表空间
租户主密钥生成完成后,即可创建加密表空间。
管理员用户登录到集群的 MySQL 租户。
创建表空间并指定加密算法。
可以指定加密算法
aes-256、aes-128、aes-192、sm4-cbc、aes-128-gcm、aes-192-gcm、aes-256-gcm、sm4-gcm,如果使用'y',则表示默认使用 aes-256。示例如下:
CREATE TABLESPACE sectest_ts1 encryption = 'y';
将已有表移入加密表空间
普通用户登录到数据库的 MySQL 租户。
进入表所在的数据库后,将表
t1移入表空间sectest_ts1中。ALTER TABLE t1 TABLESPACE sectest_ts1;
对表进行透明加密
普通用户登录到数据库的 MySQL 租户。
设置表的
progressive_merge_num值,给表做全量合并或渐进合并。progressive_merge_num用于设置表的渐进合并的轮次,默认为0,表示进行增量合并,100 轮次完成加密。如果值设置为1,则表示进行全量合并。在给表做合并操作时,通常使用全量合并方式,如果表中的数据量很大,开启全量合并可能会导致单次合并时间过长,则建议使用渐进合并。
对表执行全量合并
a. 将
progressive_merge_num的值设置为1。ALTER TABLE t1 set progressive_merge_num = 1;b. 手动发起一轮合并。
手动发起合并的操作请参见 手动触发合并。
说明
对表执行全量合并后,待全量合并完成,所有表数据均已加密完成,您可以直接通过查看
V$OB_ENCRYPTED_TABLES视图来确认加密完成情况。c. 待合并完成后,再将
progressive_merge_num的值设置为0。ALTER TABLE t1 set progressive_merge_num = 0;对表执行渐进合并
a. 将
progressive_merge_num的值设置为大于1的数。示例如下:
ALTER TABLE t1 SET progressive_merge_num = 3;b. 手动发起多轮渐进合并,使表和其上的索引的所有存量宏块完成加密。
发起一轮渐进合并的语句如下:
ALTER SYSTEM MAJOR FREEZE;说明
渐进合并过程中,您可以通过查询
V$OB_ENCRYPTED_TABLES视图来实时关注加密的完成情况。
完成后,您可以查看以下视图,确认所有宏块是否已完成加密。
示例如下:
SELECT * FROM oceanbase.V$OB_ENCRYPTED_TABLES; +----------+------------+---------------+---------------+-----------+----------------------------------+-------------+------------------+------------------+--------+--------+ | TABLE_ID | TABLE_NAME | TABLESPACE_ID | ENCRYPTIONALG | ENCRYPTED | ENCRYPTEDKEY | MASTERKEYID | BLOCKS_ENCRYPTED | BLOCKS_DECRYPTED | STATUS | CON_ID | +----------+------------+---------------+---------------+-----------+----------------------------------+-------------+------------------+------------------+--------+--------+ | 500010 | t1 | 500009 | aes-256 | YES | xxxxxxxxxxxxxxxxxxxxxxxxxxxx7882 | xxxx08 | 0 | 0 | NORMAL | 0 | +----------+------------+---------------+---------------+-----------+----------------------------------+-------------+------------------+------------------+--------+--------+ 1 row in set根据查询结果,如果
BLOCKS_DECRYPTED字段的值为0,则表示所有宏块都已完成加密。更多视图
V$OB_ENCRYPTED_TABLES的字段及说明信息,参见 V$OB_ENCRYPTED_TABLES。