Cette rubrique explique comment archiver des données froides au format CSV ou ORC et restaurer les données d'une table OSS vers PolarStore.
Applicabilité
Vous devez d'abord activer l'archivage des données froides. Cette fonctionnalité requiert l'une des révisions de cluster suivantes :
-
Archivage au format CSV
-
L'édition du cluster est Cluster Edition :
-
Archivage d'une table standard :
MySQL 8.0.1 avec une révision 8.0.1.1.47 ou ultérieure.
MySQL 8.0.2 avec une révision 8.0.2.2.10 ou ultérieure.
-
Archivage d'une table partitionnée :
MySQL 8.0.2 avec une révision 8.0.2.2.34.1 ou ultérieure.
-
-
L'édition du cluster est Multi-master Cluster (Limitless) Edition :
MySQL 8.0.1 avec une révision 8.0.1.0.13 ou ultérieure.
-
Archivage au format ORC
-
L'édition du cluster est Cluster Edition :
Archivage d'une table standard : MySQL 8.0.2 avec une révision 8.0.2.2.30 ou ultérieure.
Archivage d'une table partitionnée : MySQL 8.0.2 avec une révision 8.0.2.2.34.1 ou ultérieure.
L'édition du cluster est Multi-master Cluster (Limitless) Edition : MySQL 8.0.2 avec une révision 8.0.2.2.30 ou ultérieure.
PolarDB for MySQL 8.0.1 avec la révision 8.0.1.1.33 ou ultérieure.
PolarDB for MySQL 8.0.2 avec la révision 8.0.2.2.11.1 ou ultérieure.
-
Format 1 :
ALTER TABLE table_name ENGINE = CSV CONNECTION = 'default_oss_server'; -
Format 2 : Votre cluster doit répondre à l'une des exigences de révision suivantes.
-
Cluster Edition :
MySQL 8.0.1 avec la révision 8.0.1.1.33 ou ultérieure.
MySQL 8.0.2 avec la révision 8.0.2.2.13 ou ultérieure.
Multi-master Cluster (Limitless) Edition : La révision doit être 8.0.1.1.15 ou ultérieure.
ALTER TABLE table_name ENGINE = CSV STORAGE OSS; -
Si un fichier de données portant le même nom que le fichier d'archive cible existe déjà dans OSS, l'opération échoue et renvoie une erreur. Exemple :
Target file for archived table exists on oss.-
L'option
FORCE STORAGE OSSpermet de supprimer de force les fichiers OSS lorsque votre cluster exécute MySQL 8.0.2 avec une révision 8.0.2.2.29 ou ultérieure. Ajoutez cette optionFORCE STORAGE OSSà la syntaxe précédente pour supprimer la structure de la table ainsi que les fichiers OSS correspondants. Exemple :DROP TABLE table_name FORCE STORAGE OSS; La fonctionnalité d'archivage des données froides s'applique aux tables utilisant le moteur InnoDB ou X-Engine.
Aucune instruction DDL ou DML ne peut modifier la table pendant le processus d'archivage.
L'archivage de données vers un serveur OSS créé par l'utilisateur n'est pas pris en charge.
Une table InnoDB doit posséder une clé primaire pour pouvoir être archivée.
Après l'archivage, la table dans OSS passe en lecture seule et les performances des requêtes peuvent diminuer. Testez ces performances afin de vérifier qu'elles répondent à vos besoins.
Une table dotée d'un In-Memory Column Index (IMCI) ne peut pas être archivée au format CSV ; elle doit l'être au format ORC.
-
Créez une table InnoDB nommée
tdans la base de donnéesoss_test.CREATE TABLE t(a int, b int, c int, primary key(a)) ENGINE = INNODB; -
Insérez des données dans la table
t.INSERT INTO t VALUES (1,2,3); -
Archivez la table à l'aide de la commande
ALTER TABLE.-
Archivage au format CSV :
ALTER TABLE t ENGINE = CSV CONNECTION = 'default_oss_server'; -
Archivage au format ORC :
ALTER TABLE t ENGINE = ORC STORAGE OSS;
-
-
Une fois l'archivage terminé, consultez les informations de la table archivée depuis la console PolarDB ou interrogez directement les données via SQL :
Pour consulter les informations sur les bases de données et tables archivées dans OSS : Connectez-vous à la console PolarDB. Dans le volet de navigation de gauche du cluster cible, choisissez pour afficher les informations.
-
Interrogez les données de la table archivée comme pour une table standard. Exemple :
SELECT * FROM t;
Cette section s'applique uniquement à PolarDB for MySQL 8.0.2.
-
Si la version mineure du noyau est antérieure à 8.0.2.2.33, configurez les paramètres suivants :
Dans la console PolarDB, définissez le paramètre de cluster
partition_level_mdl_enabledsur ON pour activer la fonctionnalité de verrouillage des métadonnées (MDL) au niveau de la partition.Dans la console PolarDB, définissez le paramètre de cluster
loose_use_oss_metasur ON pour activer la fonctionnalitéuse_oss_meta.
Si la table OSS de destination n'existe pas, elle est créée automatiquement. Afin d'accélérer les requêtes, un
oss_file_filterest également généré automatiquement sur les colonnes spécifiées par le paramètreoss_file_filter. La clé primaire et la clé de partition sont aussi ajoutées automatiquement auoss_file_filter.Si la table OSS cible existe déjà, comparez les noms de colonnes ou les définitions de types de colonnes des deux tables. L'archivage n'est possible que si les définitions sont cohérentes ; sinon, une erreur survient. Utilisez des instructions DDL pour harmoniser les définitions des deux tables. Pour plus d'informations, consultez DDL des données froides. Par ailleurs, si un
oss_file_filterest défini sur la table cible et que sa définition diffère de celle indiquée dans la commandecall dbms_dlm.archive_partition2table, la définition duoss_file_filterde la table cible prévaut.-
Si la table OSS de destination n'existe pas mais qu'un fichier du même nom est présent dans OSS, un message d'erreur s'affiche lors de l'opération d'archivage. Ce message est le suivant :
mysql> CALL dbms_dlm.archive_partition2table('test', 'sales', 'p0', 'test', 'sales_history', 'id'); ERROR 8181 (HY000): [Data Lifecycle Management] errmsg: Target file for archived table exists on oss, please remove it first, or use flag 'FORCE' to overwrite on existing files.Si vous confirmez que les fichiers résiduels dans OSS sont inutiles, utilisez une procédure stockée pour supprimer les données dans OSS avant d'effectuer l'archivage.
-- Delete the OSS data. mysql> CALL dbms_oss.delete_table_file('test', 'sales_history'); Query OK, 0 rows affected (0.76 sec) -- Perform the archiving operation. mysql> CALL dbms_dlm.archive_partition2table('test', 'sales', 'p0', 'test', 'sales_history', 'id'); Query OK, 0 rows affected (4.24 sec) La table OSS de destination prend uniquement en charge les données froides au format CSV.
Après l'archivage d'une partition, la table doit contenir au moins une partition InnoDB.
Les données archivées perdent leurs informations de partitionnement et ne peuvent pas être restaurées directement dans une partition. Vous pouvez toutefois les restaurer dans une table via une instruction
INSERT ... SELECT.L'archivage individuel de partitions de second niveau n'est pas possible. Seule une partition de premier niveau entière, incluant toutes ses partitions de second niveau, peut être archivée.
-
Le tableau ci-dessous liste les types de partition pris en charge par la fonction de partitionnement de PolarDB for MySQL.
Partition de premier niveau
Partition de second niveau
Prise en charge de l'archivage OSS
HASH
Tout type
L'archivage d'une partition de premier niveau HASH vers une table externe OSS n'est pas pris en charge.
LIST
Tout type
Pris en charge.
RANGE
Tout type
Pris en charge.
KEY
Tout type
Pris en charge.
Tout type
L'archivage de la partition DEFAULT n'est pas pris en charge.
-
Créez une table partitionnée InnoDB et insérez-y des données.
DROP TABLE IF EXISTS `sales`; -- Create a partitioned table. CREATE TABLE `sales` ( `id` int DEFAULT NULL, `name` varchar(20) DEFAULT NULL, `order_time` datetime NOT NULL, primary key (order_time) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 PARTITION BY RANGE COLUMNS(order_time) INTERVAL(month, 1) (PARTITION p0 VALUES LESS THAN ('2022-01-01') ENGINE = InnoDB, PARTITION p1 VALUES LESS THAN ('2023-01-01 00:00:00') ENGINE = InnoDB, PARTITION p2 VALUES LESS THAN ('2024-01-01 00:00:00') ENGINE = InnoDB); DROP PROCEDURE IF EXISTS proc_batch_insert; delimiter $$ CREATE PROCEDURE proc_batch_insert(IN begin INT, IN end INT, IN name VARCHAR(20)) BEGIN SET @insert_stmt = concat('INSERT INTO ', name, ' VALUES(? , ?, ?);'); PREPARE stmt from @insert_stmt; WHILE begin <= end DO SET @ID1 = begin; SET @NAME = CONCAT(begin+begin*281313, '@stiven'); SET @TIME = from_days(begin + 738368); EXECUTE stmt using @ID1, @NAME, @TIME; SET begin = begin + 1; END WHILE; END; $$ delimiter ; CALL proc_batch_insert(1, 1000, 'sales'); -
Archivez la partition p0 de la table partitionnée vers une nouvelle table OSS.
-
Exécutez la commande suivante pour afficher le schéma de la table sales.
-- View the status of the current InnoDB table. mysql> SHOW CREATE TABLE sales;Le résultat suivant est retourné :
*************************** 1. row *************************** Table: sales Create Table: CREATE TABLE `sales` ( `id` int(11) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, `order_time` datetime NOT NULL, PRIMARY KEY (`order_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!50500 PARTITION BY RANGE COLUMNS(order_time) */ /*!99990 800020200 INTERVAL(MONTH, 1) */ /*!50500 (PARTITION p0 VALUES LESS THAN ('2022-01-01') ENGINE = InnoDB, PARTITION p1 VALUES LESS THAN ('2023-01-01 00:00:00') ENGINE = InnoDB, PARTITION p2 VALUES LESS THAN ('2024-01-01 00:00:00') ENGINE = InnoDB, PARTITION _p20240201000000 VALUES LESS THAN ('2024-02-01 00:00:00') ENGINE = InnoDB, PARTITION _p20240301000000 VALUES LESS THAN ('2024-03-01 00:00:00') ENGINE = InnoDB, PARTITION _p20240401000000 VALUES LESS THAN ('2024-04-01 00:00:00') ENGINE = InnoDB, PARTITION _p20240501000000 VALUES LESS THAN ('2024-05-01 00:00:00') ENGINE = InnoDB) */ 1 row in set (0.03 sec) -
Exécutez la commande suivante pour archiver la partition p0 vers la table OSS sales_history.
-- Archive the p0 partition to the OSS table sales_history and create an OSS_FILE_FILTER on the id column. mysql> CALL dbms_dlm.archive_partition2table('test', 'sales', 'p0', 'test', 'sales_history', 'id'); Query OK, 0 rows affected (1.86 sec) -
Exécutez la commande suivante pour afficher le schéma de la table sales_history.
SHOW CREATE TABLE sales_history;Le résultat suivant est retourné :
*************************** 1. row ***************************; Table: sales_history Create Table: CREATE TABLE `sales_history` ( `id` int(11) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, `order_time` datetime DEFAULT NULL, PRIMARY KEY (`order_time`) ) /*!99990 800020213 STORAGE OSS */ ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ /*!99990 800020223 OSS META=1 */ /*!99990 800020224 OSS_FILE_FILTER='id,order_time' */ 1 row in set (0.00 sec)
-
-
Interrogez la nouvelle table OSS.
RemarqueActivez la fonctionnalité d'accélération des requêtes OSS_FILE_FILTER pour accélérer les requêtes.
mysql> explain SELECT * FROM sales_history WHERE id = 100; +----+-------------+---------------+------------+------+---------------+------+---------+------+------+----------+-------------------------------------------------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+---------------+------------+------+---------------+------+---------+------+------+----------+-------------------------------------------------------------------------------+ | 1 | SIMPLE | sales_history | NULL | ALL | NULL | NULL | NULL | NULL | 152 | 10.00 | Using where; With pushed engine condition (`test`.`sales_history`.`id` = 100) | +----+-------------+---------------+------------+------+---------------+------+---------+------+------+----------+-------------------------------------------------------------------------------+ 1 row in set, 1 warning (0.00 sec) mysql> SELECT * FROM sales_history WHERE id = 100; +------+-----------------+---------------------+ | id | name | order_time | +------+-----------------+---------------------+ | 100 | 28131400@stiven | 2021-11-09 00:00:00 | +------+-----------------+---------------------+ 1 row in set (0.24 sec) MySQL 8.0.2 avec une version mineure 8.0.2.2.34.1 ou ultérieure. Vous devez définir le paramètre
loose_allow_create_hybrid_partitionsurON.MySQL 8.0.2 avec une version mineure antérieure à 8.0.2.2.34.1. Effectuez une mise à niveau vers une version mineure plus récente.
-
Archivage sous forme de fichier au format CSV :
ALTER TABLE table_name CHANGE PARTITION part_name ENGINE = CSV; -
Archivage sous forme de fichier au format ORC :
ALTER TABLE table_name CHANGE PARTITION part_name ENGINE = ORC; Si un fichier de données portant le même nom que le fichier archivé existe déjà dans OSS, le système signale une erreur indiquant que le fichier existe déjà. Exemple :
Target file for archived table exists on oss.-
Lorsque votre cluster exécute MySQL 8.0.2 avec une révision 8.0.2.2.29 ou ultérieure, l'option
FORCE STORAGE OSSpermet de supprimer de force les fichiers OSS. Ajoutez cette optionFORCE STORAGE OSSaux trois syntaxes mentionnées ci-dessus pour supprimer la structure de la table et les fichiers OSS correspondants. Par exemple, pour archiver une table partitionnée au format CSV avec l'optionFORCE STORAGE OSS, utilisez la syntaxe suivante :ALTER TABLE table_name CHANGE PARTITION part_name ENGINE = CSV FORCE STORAGE OSS; La fonctionnalité d'archivage des données froides s'applique exclusivement aux tables partitionnées InnoDB.
La table devient une table partitionnée hybride après l'archivage. Celle-ci peut contenir des partitions ORC ou CSV. Les opérations DDL en ligne ne sont pas autorisées sur une table partitionnée hybride, à l'exception de l'ajout ou de la suppression de colonnes et d'index. Pour les précautions d'utilisation, consultez Créer une partition hybride.
Les données d'une partition archivée ne peuvent pas être modifiées.
L'archivage des données froides ne s'applique pas aux partitions de second niveau d'une table partitionnée.
L'archivage des données froides ne concerne pas la partition
DEFAULTd'une table partitionnéeLIST DEFAULT HASH.Les tables partitionnées
HASHouKEYne sont pas éligibles à l'archivage des données froides.L'archivage manuel d'une table partitionnée entière n'est pas possible.
-
Si un fichier du même nom existe déjà dans OSS lors de l'archivage des données d'une partition, l'opération échoue et un message d'erreur similaire au suivant s'affiche :
Target file for archived table exists on oss.Exécutez la commande suivante pour écraser le fichier existant dans OSS. Remplacez
table_nameetpart_namepar vos valeurs réelles.ALTER TABLE table_name CHANGE PARTITION part_name ENGINE = CSV/ORC FORCE STORAGE OSS; -
Créez une table InnoDB nommée
tdans la base de données.CREATE TABLE t(a int, b int, c int, primary key(a)) PARTITION BY RANGE(a) (PARTITION p1 values less than(100), PARTITION p2 values less than(200), PARTITION p3 values less than MAXVALUE ); -
Insérez des données dans la table
t.INSERT INTO t VALUES(1,1,1); INSERT INTO t VALUES(10,10,10); INSERT INTO t VALUES(100,100,100); INSERT INTO t VALUES(150,150,150); INSERT INTO t VALUES(200,200,200); INSERT INTO t VALUES(1000,1000,1000); -
Exécutez les commandes suivantes pour archiver les données des partitions
p1etp2vers le moteur OSS.-
Archivage au format CSV :
ALTER TABLE t CHANGE PARTITION p1 ENGINE = csv; ALTER TABLE t CHANGE PARTITION p2 ENGINE = csv; -
Archivage au format ORC :
ALTER TABLE t CHANGE PARTITION p1 ENGINE = ORC; ALTER TABLE t CHANGE PARTITION p2 ENGINE = ORC;
-
-
Une fois l'archivage terminé, connectez-vous à la console PolarDB pour consulter les informations sur les bases de données et tables archivées dans OSS, ou utilisez une instruction SQL pour interroger les données de la table partitionnée hybride :
Pour consulter les informations sur les bases de données et tables archivées dans OSS : Connectez-vous à la console PolarDB. Dans le volet de navigation de gauche du cluster cible, choisissez pour afficher les informations.
Pour interroger les données d'une table partitionnée hybride, consultez Interrogation des partitions hybrides.
Seul l'archivage manuel au format CSV ou ORC est pris en charge.
-
Seuls les clusters PolarDB for MySQL des versions suivantes permettent de chiffrer les fichiers de données dans OSS lors de l'archivage :
8.0.1 avec une version mineure 8.0.1.1.47 ou ultérieure.
8.0.2 avec une version mineure 8.0.2.2.27 ou ultérieure.
Si la version mineure de votre cluster ne répond pas à ces exigences, nous vous recommandons de la mettre à niveau. Pour plus d'informations, consultez Gestion des versions mineures.
-
Cette fonctionnalité est prise en charge uniquement sur les clusters PolarDB for MySQL exécutant les versions suivantes :
Version 8.0.1, avec une version mineure 8.0.1.1.42 ou ultérieure.
Version 8.0.2, avec une version mineure 8.0.2.2.23 ou ultérieure.
Si la version mineure de votre cluster ne répond pas aux exigences ci-dessus, la suppression des fichiers correspondants dans OSS n'est pas possible. Mettez à niveau la version mineure de votre cluster. Pour plus d'informations, consultez Gestion des versions mineures.
RemarqueLorsque vous archivez manuellement des données froides sur un cluster exécutant l'une des versions suivantes, l'opération n'est pas enregistrée dans les journaux binaires.
Procédures
Archiver une table standard
L'archivage des données froides s'effectue au niveau de la table. Une fois archivée, celle-ci devient une table d'archive en lecture seule. Son moteur devient le moteur OSS et ses fichiers de données sont stockés dans Object Storage Service (OSS). À l'issue de l'archivage, PolarDB libère l'espace que la table originale occupait dans PolarStore.
Syntax
Format CSV
Format ORC
ALTER TABLE table_name ENGINE = ORC STORAGE OSS;RemarqueParamètres
Paramètre
Description
table_name
Nom de la table à archiver vers OSS.
Points d'attention
Exemple
Archivez les données de la table
tvers OSS au format CSV ou ORC.Archiver une partition vers une table externe OSS
RemarqueSyntaxe
CALL dbms_dlm.archive_partition2table('source_db', 'source_tb', 'source_part', 'archive_db', 'archive_table', ' oss_file_filter');Paramètres
Paramètre
Description
source_db
Nom de la base de données de la table source.
source_tb
Nom de la table source.
source_part
Noms des partitions de la table source à archiver. Séparez les noms par des virgules pour spécifier plusieurs partitions.
archive_db
Nom de la base de données de la table de destination.
archive_table
Nom de la table de destination.
oss_file_filter
Liste de colonnes séparées par des virgules à inclure dans le oss_file_filter de la table de destination. Pour plus d'informations, consultez Accélération des requêtes OSS_FILE_FILTER.
Points d'attention
Exemple
Archiver une table partitionnée
RemarquePour archiver une table partitionnée en tant que table partitionnée hybride, les conditions suivantes doivent être remplies :
L'archivage d'une table partitionnée consiste à archiver ses partitions. La table devient alors une table partitionnée hybride dont les fichiers de données des partitions archivées sont stockés dans OSS. Une fois l'opération terminée, PolarDB libère automatiquement l'espace que ces partitions occupaient dans PolarStore.
Syntaxe
RemarqueParamètres
Paramètre
Description
table_name
Nom de la table à archiver vers OSS.
part_name
Nom de la partition à archiver vers OSS.
Points d'attention
Exemple
Archivez les données des partitions
p1etp2de la tabletvers OSS au format CSV.Chiffrement TDE pour les données archivées
RemarquePour répondre à vos exigences de sécurité des données, activez le chiffrement transparent des données (TDE) pour les fichiers de données froides archivés dans OSS. Le principe consiste à sélectionner les fichiers à chiffrer pendant l'opération d'archivage ; le serveur OSS se charge ensuite du chiffrement. Pour plus d'informations, consultez Chiffrement des données. Une fois les données chiffrées, interrogez-les via des instructions SQL dans PolarDB for MySQL. L'ensemble du processus de chiffrement et de déchiffrement s'effectue en arrière-plan de manière transparente, sans nécessiter d'opérations supplémentaires de votre part.
Syntaxe
Lors d'une opération d'archivage manuel, ajoutez la syntaxe
ENCRYPTION="Y"pour activer le TDE.ALTER TABLE t1 engine = CSV ENCRYPTION="Y" STORAGE OSS;Restaurer des données d'OSS vers PolarStore
Restaurer une table archivée standard
Pour modifier des données froides archivées dans OSS, utilisez la syntaxe
ALTER ENGINEafin de restaurer les données vers PolarStore. La restauration des données vers PolarStore supprime également les données correspondantes dans OSS. Après modification, archivez à nouveau la table modifiée vers OSS.Syntaxe
ALTER TABLE table_name ENGINE[=]engine_name;Paramètres
Paramètre
Description
table_name
Nom de la table OSS à restaurer.
engine_name
Type de moteur après restauration.
Points d'attention
Les tables OSS archivées sont en lecture seule et n'autorisent pas les opérations
INSERT,UPDATEouDELETE. Pour modifier les données, restaurez d'abord la table vers un moteur en lecture-écriture, tel qu'InnoDB. Toute tentative de modification d'une table OSS en lecture seule entraîne l'erreur suivante :1036 - Table 't1' is read onlyExemple
Restaurez la table OSS
tvers PolarStore dans la base de donnéesoss_test.ALTER TABLE `oss_test`.`t` ENGINE = InnoDB;Modifiez les données de la table InnoDB
t. Après modification, archivez à nouveau la tabletdu moteur InnoDB vers OSS. Exemple :ALTER TABLE t ENGINE = CSV CONNECTION = 'default_oss_server';ou
ALTER TABLE t ENGINE = CSV STORAGE OSS;Restaurer une partition archivée
Pour restaurer des données d'une table partitionnée archivée vers PolarStore, utilisez l'instruction ALTER afin de transférer les données d'OSS vers PolarStore. Après la restauration, les données froides dans OSS sont également supprimées.
RemarqueVotre cluster doit exécuter PolarDB for MySQL 8.0.2 avec une révision de noyau 8.0.2.2.34.1 ou ultérieure.
Syntaxe
ALTER TABLE table_name REORGANIZE PARTITION part_name INTO (partition_definition);Paramètres
Paramètre
Description
table_name
Nom de la table OSS à restaurer.
part_name
Nom de la partition à restaurer.
partition_definition
Doit être identique à la
partition_definitionde la partition que vous souhaitez restaurer.Exemple
Restaurez les données de la partition
p1de la table partitionnée archivéetd'OSS vers PolarStore.ALTER TABLE t REORGANIZE PARTITION p1 INTO(PARTITION p1 values less than(100));Supprimer les fichiers correspondants dans OSS
RemarqueLorsque vous supprimez une table dans OSS ou la réimportez vers PolarStore, les fichiers dans OSS ne sont pas supprimés automatiquement. Une fois confirmé que les données ne sont plus nécessaires, utilisez la syntaxe suivante pour supprimer les fichiers correspondants dans OSS :
CALL dbms_oss.delete_table_file('database_name', 'table_name');La suppression des fichiers dans OSS est asynchrone. Les fichiers ne sont complètement supprimés que lorsque tous les nœuds du cluster n'en dépendent plus. Un trafic élevé peut entraîner des retards. Si la commande échoue et renvoie l'erreur
OSS files are still in use, patientez quelques instants avant de relancer la commande. -
-