---
title: "为已有表设置存储加密 | OceanBase 文档中心"
description: 为已有表设置存储加密 本节主要介绍如何为已有表开启存储加密。 使用限制及说明 系统租户不能开启加密。 背景信息 本节以在加密表空间 sectest_ts1 上为已有表 t1 开启加密为例，提供数据存储加密的操作指导。 配置 internal 方式的存储加密 internal 方式的存储主密钥，其加密信息主要在内部表中…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 3.2.3 企业版 LTS

# 为已有表设置存储加密

更新时间：2023-09-04 18:05:34

本节主要介绍如何为已有表开启存储加密。

## 使用限制及说明

系统租户不能开启加密。

## 背景信息

本节以在加密表空间 `sectest_ts1` 上为已有表 `t1` 开启加密为例，提供数据存储加密的操作指导。

## 配置 internal 方式的存储加密

internal 方式的存储主密钥，其加密信息主要在内部表中进行管理。为了避免日志回放时的循环依赖，该加密方式下的 Clog 不做加密。

1. 管理员登录到数据库的 MySQL 租户。
 2. 执行以下语句，开启 internal 方式的存储加密。

   配置项 `tde_method` 用于设置透明表空间加密的方式，默认为 `none` ，表示关闭透明表空间加密。

   更多配置项 `tde_method` 的说明信息请参见 [tde_method](https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000356318)。

   ```sql
   obclient> ALTER SYSTEM SET tde_method='internal';

   ```
 3. 执行以下语句，确认该租户上所有 OBServer 节点上的配置项 `tde_method` 的值均为 `internal`。

   ```sql
   obclient> SHOW PARAMETERS LIKE 'tde_method';

   ```
 4. 确认后，执行以下语句，生成主密钥。

   > **说明**
   >
   >  
   >
   > 仅当租户上所有 OBServer 节点上的配置项 `tde_method` 的值均为 `internal`，该语句才能执行成功。

   ```sql
   obclient> ALTER INSTANCE ROTATE INNODB MASTER KEY;

   ```
 5. 创建表空间并指定加密算法。

   可以指定加密算法 `'aes-256'`、`'aes-128'`、`'aes-192'`、`'sm4-cbc'`，如果使用 `'y'`，则表示默认使用 aes-256。

   示例如下：

   ```sql
   obclient> CREATE TABLESPACE sectest_ts1 encryption = 'y';

   ```

## 将已有表移入加密表空间

1. 普通用户登录到数据库的 MySQL 租户。
 2. 进入表所在的数据库后，将表 `t1` 移入表空间 `sectest_ts1` 中。

   ```sql
   obclient> ALTER TABLE t1 TABLESPACE sectest_ts1;

   ```

## 对表进行存储加密

1. 普通用户登录到数据库的 MySQL 租户。
 2. 设置表的 `progressive_merge_num` 值，给表做全量合并或者渐进合并。

   `progressive_merge_num` 用于设置表的渐进合并的轮次，默认为 `0`，表示进行增量合并。如果值设置为 `1`，则表示进行全量合并。

   在给表做合并操作时，通常使用全量合并方式，如果表中的数据量很大，开启全量合并可能会导致单次合并时间过长，则建议使用渐进合并。

      - 对表执行全量合并

            1. 将 `progressive_merge_num` 的值设置为 `1`。

              ```sql
              obclient> ALTER TABLE t1 set progressive_merge_num = 1;

              ```
            2. 使用 `root` 用户登录到数据库的 `sys` 租户，手动发起一轮合并。

              手动发起合并的操作请参见 [手动触发合并](https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000355962)。

              > **说明**
              >
              >  
              >
              > 对表执行全量合并后，待全量合并完成，所有表数据均已加密完成，您可以直接通过查看 `oceanbase.v$encrypted_tables` 视图来确认加密完成情况。
            3. 待合并完成后，再将 `progressive_merge_num` 的值设置为 `0`。

              ```sql
              obclient> ALTER TABLE t1 set progressive_merge_num = 0;

              ```
      - 对表执行渐进合并

            1. 将 `progressive_merge_num` 的值设置为大于 `1` 的数，并执行 `OPTIMIZE` 命令，准备做渐进合并。

              示例如下：

              ```sql
              obclient> ALTER TABLE t1 SET progressive_merge_num = 3;

              obclient> OPTIMIZE TABLE t1;

              ```
            2. 使用 `root` 用户登录数据库的 `sys` 租户，手动发起多轮渐进合并，使表和其上的索引的所有存量宏块完成加密。

              发起一轮渐进合并的语句如下：

              ```sql
              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](https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000355980)。
 3. 完成后，您可以查看以下视图，确认所有宏块是否已完成加密。

   示例如下：

   ```sql
   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](https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000356413)。

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
