本文档介绍了开启冷数据归档功能后,冷数据归档和OSS表原地转换的操作方法。

前提条件

  • 产品系列需为集群版,集群版本需为如下版本之一:
    • PolarDB MySQL版8.0.1版本且修订版本为8.0.1.1.32及以上。
    • PolarDB MySQL版8.0.2版本且修订版本为8.0.2.2.10及以上。
      说明 集群版本为PolarDB MySQL版8.0.2版本且修订版本为8.0.2.2.11.1或以上时,手动归档冷数据不记录Binlog日志。
    您可以通过查询版本号来确认集群版本。
  • 开启冷数据归档功能。
  • 连接数据库集群

冷数据归档

冷数据归档执行的是表归档操作,执行冷数据归档操作后的表称为归档表(只读),归档表的引擎为OSS引擎,归档表的数据文件存储在OSS上。执行冷数据归档操作后,原来本地表在PFS上占用的空间将被释放。

您可以通过以下两种方式来归档冷数据:
  • 通过内置存储过程dbms_dlm.execute_tier_dlm_policy()归档冷数据。您只需要在执行内置存储过程时指定归档的库名和表名,即可将PolarStore上的表原地转换成CSV格式的OSS表,归档到OSS对象存储中。语法如下:
    CALL dbms_dlm.execute_tier_dlm_policy(schema_name, table_name, force);
  • 通过ALTER命令归档冷数据。语法如下:
    ALTER TABLE table_name ENGINE = CSV CONNECTION = 'default_oss_server' [, FORCE];
语法中的参数说明见下表:
参数说明
schema_name需要归档到OSS对象存储中的库名。
table_name需要归档到OSS对象存储中的表名。
force是否直接覆盖OSS对象存储中的数据。取值如下:
  • 'force':表示对于OSS对象存储中已经存在的数据文件,可以直接覆盖,重新写入;
  • '':表示对于OSS对象存储中已经存在的数据文件,系统会报文件已经存在的错误。
注意事项
  • 支持对InnoDB引擎和XEngine引擎上的表使用冷数据归档功能。
  • 目前归档到OSS上的冷数据格式只支持CSV格式。
  • 目前冷数据归档过程中不支持对表进行修改。
  • 冷数据归档功能不支持将数据文件归档到用户自建的OSS Server中。
  • 冷数据归档后只会保留主键信息,不会保留其它索引信息,建议您保留原有的表定义。
  • 使用内置存储过程进行冷数据归档时,不支持原子性。如果发生操作异常,存储过程中的多个步骤,可能会有部分步骤已经执行成功,执行成功的步骤不会回滚。
示例
在数据库oss_test中创建InnoDB表t
CREATE TABLE t(a int, b int, c int, primary key(a)) ENGINE = INNODB;
  • 通过内置存储过程dbms_dlm.execute_tier_dlm_policy()归档冷数据。
    CALL dbms_dlm.execute_tier_dlm_policy('oss_test', 't', '');
  • 通过ALTER命令归档冷数据。
    ALTER TABLE t ENGINE = CSV CONNECTION = 'DEFAULT_OSS_SERVER';

OSS表原地转换

如果您有低频修改归档到OSS上冷数据的需求,通过ALTER ENGINE语法可以将OSS表原地转换。然后就可以修改转换后的表数据,修改完数据之后,可以再次将修改后的表原地归档成OSS表。
  • 语法
    ALTER TABLE tbl_name ENGINE[=]engine_name;
  • 参数说明
    参数参数说明
    table_name需要转换的OSS表的表名。
    engine_name转换后的引擎类型。
  • 注意事项
    • OSS表原地转换后的表,只保留归档前的表主键。
    • OSS表为只读状态时,不支持执行修改操作(INSERTUPDATEDELETE)。如需修改已经归档的冷数据,您需要将OSS表转换成可读可写的表,如InnoDB表。修改只读状态下的OSS表时,报错信息如下:
      1036 - Table 't1' is read only
    • OSS表原地转换后只会保留主键信息,不会保留其它索引信息。如果需要使用其它的索引信息,需要您手动来创建。
  • 示例
    在数据库oss_test中将OSS表t转换成InnoDB表t
    ALTER TABLE `oss_test`.`t` ENGINE = InnoDB;
    然后就可以修改InnoDB表t的数据,修改完数据之后,再次将InnoDB表t原地归档成OSS表t。由于归档到OSS上的数据文件默认不会被删除,再次归档时,就需要通过指定force参数为'force'来覆盖已经归档的数据文件。例如:
    CALL dbms_dlm.execute_tier_dlm_policy('oss_test', 't', 'force');