首批通过分布式安全可靠测评,为关键业务系统打造
为已有表设置存储加密
更新时间:2023-09-04 18:05:34
本节主要介绍如何为已有表开启存储加密。
使用限制及说明
系统租户不能开启加密。
背景信息
本节以在加密表空间 sectest_ts1 上为已有表 t1 开启加密为例,提供数据存储加密的操作指导。
配置 internal 方式的存储加密
internal 方式的存储主密钥,其加密信息主要在内部表中进行管理。为了避免日志回放时的循环依赖,该加密方式下的 Clog 不做加密。
管理员登录到数据库的 MySQL 租户。
执行以下语句,开启 internal 方式的存储加密。
配置项
tde_method用于设置透明表空间加密的方式,默认为none,表示关闭透明表空间加密。更多配置项
tde_method的说明信息请参见 tde_method。obclient> ALTER SYSTEM SET tde_method='internal';执行以下语句,确认该租户上所有 OBServer 节点上的配置项
tde_method的值均为internal。obclient> SHOW PARAMETERS LIKE 'tde_method';确认后,执行以下语句,生成主密钥。
说明
仅当租户上所有 OBServer 节点上的配置项
tde_method的值均为internal,该语句才能执行成功。obclient> ALTER INSTANCE ROTATE INNODB MASTER KEY;创建表空间并指定加密算法。
可以指定加密算法
'aes-256'、'aes-128'、'aes-192'、'sm4-cbc',如果使用'y',则表示默认使用 aes-256。示例如下:
obclient> CREATE TABLESPACE sectest_ts1 encryption = 'y';
将已有表移入加密表空间
普通用户登录到数据库的 MySQL 租户。
进入表所在的数据库后,将表
t1移入表空间sectest_ts1中。obclient> ALTER TABLE t1 TABLESPACE sectest_ts1;
对表进行存储加密
普通用户登录到数据库的 MySQL 租户。
设置表的
progressive_merge_num值,给表做全量合并或者渐进合并。progressive_merge_num用于设置表的渐进合并的轮次,默认为0,表示进行增量合并。如果值设置为1,则表示进行全量合并。在给表做合并操作时,通常使用全量合并方式,如果表中的数据量很大,开启全量合并可能会导致单次合并时间过长,则建议使用渐进合并。
对表执行全量合并
将
progressive_merge_num的值设置为1。obclient> ALTER TABLE t1 set progressive_merge_num = 1;使用
root用户登录到数据库的sys租户,手动发起一轮合并。手动发起合并的操作请参见 手动触发合并。
说明
对表执行全量合并后,待全量合并完成,所有表数据均已加密完成,您可以直接通过查看
oceanbase.v$encrypted_tables视图来确认加密完成情况。待合并完成后,再将
progressive_merge_num的值设置为0。obclient> ALTER TABLE t1 set progressive_merge_num = 0;
对表执行渐进合并
将
progressive_merge_num的值设置为大于1的数,并执行OPTIMIZE命令,准备做渐进合并。示例如下:
obclient> ALTER TABLE t1 SET progressive_merge_num = 3; obclient> OPTIMIZE TABLE t1;使用
root用户登录数据库的sys租户,手动发起多轮渐进合并,使表和其上的索引的所有存量宏块完成加密。发起一轮渐进合并的语句如下:
obclient> ALTER SYSTEM MAJOR FREEZE;具体手动发起合并的次数为
progressive_merge_num*max_kept_major_version_number。说明
渐进合并过程中,您可以通过查询
oceanbase.v$encrypted_tables视图来实时关注加密的完成情况。配置项
max_kept_major_version_number用于设置数据保留的冻结版本数量,取值范围为 [1,16],默认值为2。更多配置项
max_kept_major_version_number的说明信息请参见 max_kept_major_version_number。
完成后,您可以查看以下视图,确认所有宏块是否已完成加密。
示例如下:
obclient> SELECT * FROM oceanbase.v$encrypted_tables; +-----------+------------------+------------+------------------+---------------+-----------+----------------------------------+------------------+------------------+------------------+--------+ | TENANT_ID | TABLE_ID | TABLE_NAME | TABLESPACE_ID | ENCRYPTIONALG | ENCRYPTED | ENCRYPTEDKEY | MASTERKEYID | BLOCKS_ENCRYPTED | BLOCKS_DECRYPTED | STATUS | +-----------+------------------+------------+------------------+---------------+-----------+----------------------------------+------------------+------------------+------------------+--------+ | 1003 | 1102810162709330 | t1 | 1102810162660329 | aes-256 | YES | 4B0C00AFEFEEF506D4AB804E5071A733 | 1102810162660329 | 2 | 0 | NORMAL | +-----------+------------------+------------+------------------+---------------+-----------+----------------------------------+------------------+------------------+------------------+--------+ 1 row in set根据查询结果,如果
BLOCKS_DECRYPTED字段的值为0,则表示所有宏块都已完成加密。更多视图
v$encrypted_tables的字段及说明信息请参见 v$encrypted_tables。