Le langage de manipulation des données (DML) sans verrouillage dans Data Management (DMS) permet d'exécuter des instructions UPDATE, DELETE et INSERT...SELECT sur de grands ensembles de données sans verrouiller les tables ni dégrader les performances de la base de données. Le moteur DMS divise automatiquement les données cibles en lots et exécute l'instruction lot par lot, en marquant une brève pause entre chaque lot pour protéger la réplication du primaire vers le secondaire et réduire la charge de la base de données.
Contexte
À mesure que le volume de données métier augmente, il devient souvent nécessaire de supprimer des données historiques ou de mettre à jour de grandes parties d'une table. Deux approches courantes comportent toutes deux des risques importants :
Écriture d'un script de division des données : L'utilisation de la clause
LIMITpour paginer les suppressions ou les mises à jour est une erreur fréquente. Étant donné queLIMITsans analyse d'index impose une analyse complète de la table, celle-ci peut toujours être verrouillée. Même si la division est correctement implémentée, un intervalle de lot mal réglé peut entraîner un retard de réplication sévère entre les bases de données primaires et secondaires.Extraction manuelle par l'administrateur de base de données : La division manuelle de grands ensembles de données prend du temps, est sujette aux erreurs et difficile à ajuster une fois lancée.
Outre les risques mentionnés ci-dessus, deux autres modes de défaillance peuvent survenir lors d'opérations directes sur de grandes tables :
Une seule instruction SQL affectant trop de lignes peut entraîner le dépassement de la limite supérieure du nombre d'entrées de journal, ce qui provoque l'échec total de l'instruction.
L'exécution d'une instruction SQL sans utiliser les index spécifiés peut provoquer un verrouillage de la table, augmenter la charge de la base de données et, dans les cas graves, entraîner des pannes métier.
Le DML sans verrouillage élimine ces deux risques en automatisant la division en lots et la limitation du débit au sein de DMS.
Fonctionnement
Le DML sans verrouillage traite une seule instruction SQL en trois étapes :
Division des données — Le moteur DMS analyse l'instruction et divise les lignes correspondantes en plusieurs lots basés sur des plages d'index, évitant ainsi les analyses complètes de la table.
Exécution par lots — DMS exécute l'instruction sur un lot à la fois, en ne maintenant que des verrous de courte durée au niveau des lignes pendant chaque lot.
Intervalle de tampon — Après l'achèvement de chaque lot, DMS attend brièvement avant de démarrer le lot suivant. Cet intervalle permet à la base de données secondaire de rattraper la réplication, maintenant le retard de réplication du primaire vers le secondaire dans des limites acceptables.
Avantages
Votre activité n'est pas impactée lors des opérations de modification de données volumineuses.
L'impact sur les performances de la base de données et sur le stockage est réduit.
L'efficacité d'exécution est garantie même pour de grandes quantités de modifications de données.
Bases de données prises en charge
| Moteur de base de données | Instances prises en charge |
|---|---|
| MySQL | ApsaraDB RDS for MySQL, PolarDB for MySQL, MyBase for MySQL, PolarDB for Xscale, bases de données MySQL tierces |
| PostgreSQL | ApsaraDB RDS for PostgreSQL, PolarDB for PostgreSQL, MyBase for PostgreSQL, bases de données PostgreSQL tierces |
| MariaDB | ApsaraDB for MariaDB, bases de données MariaDB tierces |
| OceanBase | ApsaraDB for OceanBase en mode MySQL |
| Compatible Oracle | PolarDB for PostgreSQL (Compatible with Oracle) |
Limites
Seules les instructions UPDATE, DELETE et INSERT...SELECT sont prises en charge.
UPDATE et DELETE
| Contrainte | Détails |
|---|---|
| Étendue de la table | Table unique uniquement |
| Clause WHERE | Obligatoire. Pour mettre à jour ou supprimer toutes les lignes, utilisez WHERE 1=1 |
| Sous-requêtes | Non prises en charge |
| Clause LIMIT | Non prise en charge — l'utilisation de LIMIT pour la pagination manuelle impose une analyse complète de la table, ce qui provoque le verrouillage que cette fonctionnalité vise à éviter |
INSERT...SELECT
| Contrainte | Détails |
|---|---|
| Étendue SELECT | Table unique uniquement |
| Clause WHERE | Obligatoire dans la clause SELECT. Pour sélectionner toutes les lignes, utilisez WHERE 1=1 |
| Clauses interdites | Les clauses LIMIT, ORDER BY et GROUP BY ne sont pas prises en charge dans la clause SELECT |
Cas d'utilisation
Suppression des données historiques — Supprimez les lignes qui ne sont plus nécessaires sans bloquer les lectures ou les écritures sur la table de production.
Mise à jour de toutes les lignes — Appliquez une mise à jour de colonne sur l'ensemble d'une table sans provoquer de retard de réplication ni d'interruption de service.