Tous les produits
Search
Centre de documentation

PolarDB:Utilisation

Dernière mise à jour :Sep 02, 2026

La fonctionnalité PolarDB for MySQL Multi-master Cluster (Limitless) fait évoluer l'architecture d'un cluster, passant d'un modèle à écriture unique et lecture multiple à un modèle à écritures multiples et lectures multiples. Elle permet des écritures de données concurrentes vers différentes bases de données ou objets de données sur différents nœuds de calcul. Elle prend également en charge la planification dynamique des bases de données et des objets de données entre les nœuds, avec des basculements effectués en quelques secondes, ce qui améliore considérablement la capacité globale de lecture et d'écriture concurrente du cluster. Les objets de données incluent les tables, les vues, les déclencheurs, les événements, les procédures stockées et les fonctions. Cette rubrique décrit comment utiliser un Multi-master Cluster (Limitless).

Prérequis

Limitations

  • Les données de chaque base de données ou objet de données ne peuvent être écrites que via un seul nœud principal. Les nœuds auxquels aucune base de données ou objet de données n'est assigné ne peuvent pas lire ni écrire des données. Par défaut, les opérations s'effectuent au niveau de la base de données. Pour opérer au niveau de l'objet de données, vous devez utiliser une syntaxe spécifique pour changer de mode.

  • Les requêtes transversales entre plusieurs nœuds principaux ne sont pas prises en charge. Si une requête implique des bases de données ou des objets de données résidant sur différents nœuds principaux, le système renvoie une erreur. Nous vous recommandons de déplacer les endpoints de toutes les bases de données ou objets de données concernés vers un seul nœud principal avant d'exécuter la requête.

  • Seuls les endpoints de cluster, sont fournis. Les endpoints principaux ne sont pas pris en charge.

  • Le changement d'endpoint est soumis aux conditions suivantes :

    • Si vous utilisez le niveau d'isolation de la base de données, vous devez changer l'endpoint de la base de données.

    • Si vous utilisez le niveau d'isolation de l'objet de données, vous devez changer l'endpoint de l'objet de données.

  • Les opérations DDL transversales entre plusieurs nœuds principaux ne sont pas prises en charge. Si vous exécutez une instruction DDL sur une base de données ou un objet de données alors que la connexion actuelle est établie sur un nœud principal qui n'est pas le propriétaire de cette base de données ou de cet objet de données, le système renvoie l'erreur Failed to get global lock for table 'xxx' on master N. Pour résoudre ce problème, procédez comme suit :

    1. Exécutez la commande suivante pour identifier le nœud principal propriétaire de la table cible :

      SELECT * FROM INFORMATION_SCHEMA.INNODB_CC_GLOBAL_LOCK_INFO WHERE LOCK_MODE = 'SLS_X';

      Repérez le champ master_id correspondant à la table cible dans le résultat de la requête.

    2. Exécutez la commande suivante pour basculer la session actuelle vers le nœud principal propriétaire de la table cible :

      ALTER SESSION POLARDB_WRITE_NODE <master_id>;

      Remplacez <master_id> par le numéro réel du nœud principal obtenu à l'étape précédente.

    3. Une fois le basculement terminé, réexécutez l'instruction DDL.

Spécifier un nœud principal pour une base de données

Créez une base de données sur un nœud principal spécifié. La syntaxe est la suivante :

CREATE DATABASE name [POLARDB_WRITE_NODE master_id];
Remarque
  • Lorsque vous utilisez le niveau d'isolation de la base de données, les données de chaque base de données ne peuvent être écrites que via un seul nœud principal.

  • Si vous omettez [POLARDB_WRITE_NODE master_id] dans la syntaxe, le système utilise la valeur du paramètre loose_innodb_mm_default_master_id pour spécifier le nœud principal lors de la création de la base de données. Lorsque la valeur du paramètre loose_innodb_mm_default_master_id est 0, le système sélectionne aléatoirement un nœud principal pour créer la base de données. Accédez à la console PolarDB et accédez à la page Settings and Management > Parameters pour afficher et modifier les paramètres du cluster ou des nœuds.

  • Pour afficher la distribution des bases de données sur les nœuds, consultez la section Interroger la distribution des bases de données.

Exemple : Créez une base de données nommée db1 sur le nœud principal 1.

CREATE DATABASE db1 POLARDB_WRITE_NODE 1;

Pour créer la base de données db1 sur le nœud principal 2, remplacez 1 par 2 dans l'instruction précédente.

Supprimer une base de données

Pour supprimer une base de données créée sur un nœud principal spécifié, utilisez la syntaxe suivante :

DROP DATABASE name;

Exemple : Supprimez la base de données db1 qui a été créée sur le nœud principal 1.

DROP DATABASE db1;

Il n'est pas nécessaire de spécifier le nœud principal lors de la suppression d'une base de données.

Changer l'endpoint d'une base de données

Pour changer l'endpoint de la base de données vers un autre nœud principal, utilisez la syntaxe suivante :

ALTER DATABASE name POLARDB_WRITE_NODE master_id;

Exemple : Changez l'endpoint de la base de données db1 vers le nœud principal 2.

ALTER DATABASE db1 POLARDB_WRITE_NODE 2;
Remarque

Le changement d'endpoint peut être une opération longue. Le temps d'exécution dépend des facteurs suivants :

  • Plus la base de données contient de tables, plus le basculement est lent.

  • Plus la charge de travail DML sur la base de données est importante pendant le basculement, plus l'opération est lente.

Basculer vers l'isolation par objet de données

Par défaut, le niveau d'isolation d'un cluster multi-principal est au niveau de la base de données. Cela signifie que tous les objets de données d'une même base de données ne sont accessibles que sur un seul nœud principal. Si vous souhaitez que tous les objets de données d'une même base de données soient accessibles via plusieurs nœuds principaux, vous devez passer du niveau d'isolation de la base de données au niveau d'isolation de l'objet de données. La syntaxe est la suivante :

ALTER DATABASE name TO TABLE_LOCK POLARDB_WRITE_NODE master_id;

Dans cette instruction, name spécifie le nom de la base de données et master_id spécifie l'endpoint de l'objet de données.

Exemple : Modifiez le niveau d'isolation de la base de données db1 pour passer au niveau d'isolation par objet de données et définissez son endpoint sur le nœud principal 2.

ALTER DATABASE db1 TO TABLE_LOCK POLARDB_WRITE_NODE 2;
Remarque

Le changement de niveau d'isolation peut être une opération longue. Le temps d'exécution dépend des facteurs suivants :

  • Plus la base de données contient d'objets, plus le basculement est lent.

  • Plus la charge de travail DML sur la base de données est importante pendant le basculement, plus l'opération est lente.

Basculer vers l'isolation par base de données

Si une base de données est configurée avec le niveau d'isolation par objet de données, vous pouvez revenir au niveau d'isolation par base de données pour faciliter la gestion. Utilisez l'instruction suivante :

ALTER DATABASE name TO DB_LOCK POLARDB_WRITE_NODE master_id;

Dans cette instruction, name spécifie le nom de la base de données et master_id spécifie l'endpoint de la base de données.

Exemple : Remettez le niveau d'isolation de la base de données db1 au niveau d'isolation par base de données et définissez son endpoint sur le nœud principal 1.

ALTER DATABASE db1 TO DB_LOCK POLARDB_WRITE_NODE 1;
Remarque

Le changement de niveau d'isolation peut être une opération longue. Le temps d'exécution dépend des facteurs suivants :

  • Plus la base de données contient d'objets, plus le basculement est lent.

  • Plus la charge de travail DML sur la base de données est importante pendant le basculement, plus l'opération est lente.

Changer l'endpoint d'un objet de données

Lorsqu'un cluster est au niveau d'isolation par objet de données, une base de données peut contenir divers types d'objets, notamment des tables, des vues, des déclencheurs, des fonctions, des procédures stockées et des événements. Pour changer l'endpoint de ces objets, utilisez la syntaxe suivante :

ALTER obj_type name POLARDB_WRITE_NODE master_id;

Dans cette instruction, obj_type peut être TABLE, VIEW, TRIGGER, FUNCTION, PROCEDURE ou EVENT. name est le nom de l'objet de données.

Exemple 1 : Changez l'endpoint de la table t1 dans la base de données db1 vers le nœud principal 3.

ALTER TABLE db1.t1 POLARDB_WRITE_NODE 3;

Exemple 2 : Changez l'endpoint de la vue t2 dans la base de données actuelle vers le nœud principal 2.

ALTER VIEW t2 POLARDB_WRITE_NODE 2;

Exemple 3 : Changez l'endpoint des fonctions f1 et f2 dans la base de données db2 vers le nœud principal 1.

ALTER FUNCTION db2.f1, db2.f2 POLARDB_WRITE_NODE 1;
Remarque

Le changement d'endpoint peut être une opération longue. Le temps d'exécution dépend des facteurs suivants :

  • Plus la charge de travail DML sur l'objet de données est importante pendant le basculement, plus l'opération est lente.

  • Les objets ayant des dépendances peuvent devenir invalides s'ils ne se trouvent pas sur le même nœud principal.

    Par exemple, une vue nommée VIEW1 dépend d'une table nommée t1. Si l'endpoint de VIEW1 se trouve sur le nœud principal 1 et celui de t1 sur le nœud principal 2, une erreur se produit lorsque vous interrogez VIEW1 sur le nœud principal 1. De même, les appels à une fonction, une procédure stockée ou un événement échouent si les objets qu'ils référencent se trouvent sur différents nœuds principaux. Un déclencheur échoue également à modifier une table si leurs endpoints se trouvent sur des nœuds différents.

  • Si une contrainte de clé étrangère existe entre deux tables, telles que t1 et t2, la modification de l'endpoint d'une table modifie automatiquement l'endpoint de l'autre.

Spécifier un nœud principal pour SQL

Important

Cette fonctionnalité s'applique uniquement aux requêtes de métadonnées, telles que les requêtes sur information_schema ou les variables d'état. Si vous devez interroger des données, par exemple en exécutant SELECT * FROM table1, il n'est pas nécessaire de spécifier un nœud principal, car le proxy de base de données achemine automatiquement la requête vers le nœud principal correct.

Pour envoyer une instruction SQL à un nœud principal spécifique, exécutez l'instruction SQL suivante pour verrouiller la session sur ce nœud :

ALTER SESSION POLARDB_WRITE_NODE master_id;

Exemple : Interrogez la valeur de la variable innodb_buffer_pool_size sur le nœud principal 1.

ALTER SESSION POLARDB_WRITE_NODE 1;   # Send the SQL statement to primary node 1.
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';  # Query the value of innodb_buffer_pool_size on primary node 1.
Remarque

Si vous ne spécifiez pas de nœud principal lors de l'exécution d'une instruction SQL, le proxy de base de données sélectionne aléatoirement un nœud principal pour exécuter l'instruction.

Exécutez la commande suivante pour déverrouiller la session du nœud principal spécifié :

RESET SESSION POLARDB_WRITE_NODE;

Interroger la distribution des bases de données

  • Dans la console PolarDB, accédez à la page Settings and Management > Database Management pour afficher la distribution de toutes les bases de données dans le cluster. La colonne MasterID affiche le numéro du nœud RW auquel chaque base de données appartient (par exemple, MasterID 1 indique que la base de données se trouve sur le nœud RW1, et MasterID 2 indique qu'elle se trouve sur le nœud RW2).

  • Exécutez les commandes suivantes pour interroger la distribution des bases de données sur un nœud principal spécifique :

    ALTER SESSION POLARDB_WRITE_NODE master_id;
    SELECT * FROM INFORMATION_SCHEMA.INNODB_MASTER_GLOBAL_LOCK_INFO WHERE LOCK_MODE = 'SLS_X';

    Exemple : Interrogez la distribution des bases de données sur le nœud principal 1.

    ALTER SESSION POLARDB_WRITE_NODE 1;
    SELECT * FROM INFORMATION_SCHEMA.INNODB_MASTER_GLOBAL_LOCK_INFO WHERE LOCK_MODE = 'SLS_X';

    Le résultat suivant est renvoyé :

     SELECT * FROM INFORMATION_SCHEMA.INNODB_MASTER_GLOBAL_LOCK_INFO WHERE LOCK_MODE = 'SLS_X';
    
    +------------+---------------------+----------+--------------+-----------+----------+-------------+-------------+---------------------+-----------------+
    | table_name | table_id            | space_id | s_lock_count | lock_mode | object   | current_lsn | hold_thread | hold_start_time     | hold_total_time |
    +------------+---------------------+----------+--------------+-----------+----------+-------------+-------------+---------------------+-----------------+
    | test3/f1   | 9149389368458135753 |        0 |            0 | SLS_X     | function |    28076635 |          17 | 2024-07-10 21:35:20 |             214 |
    | test3/e1   | 9149389368458332874 |        0 |            0 | SLS_X     | event    |    28077248 |          17 | 2024-07-10 21:35:30 |             204 |
    | test3/v1   | 9149389368457234649 |        0 |            0 | SLS_X     | view     |    28075972 |          17 | 2024-07-10 21:35:08 |             226 |
    | sbtest     | 2107518311328629409 |        0 |            0 | SLS_X     | db       |    28034927 |  4294967295 | 2024-07-07 23:04:41 |          254053 |
    | test       | 7190879906290573778 |        0 |            0 | SLS_X     | db       |    28034927 |  4294967295 | 2024-07-10 11:20:57 |           37077 |
    | test2      | 3381728963524265351 |        0 |            0 | SLS_X     | db       |    28034927 |  4294967295 | 2024-07-10 11:13:09 |           37545 |
    +------------+---------------------+----------+--------------+-----------+----------+-------------+-------------+---------------------+-----------------+
    
    6 rows in set (0.00 sec)

    Bien que la colonne soit nommée table_name, chaque ligne du résultat contient des informations sur une base de données ou un objet de données. Dans cet exemple, sbtest, test et test2 utilisent le niveau d'isolation par base de données. Les objets test3/f1, test3/e1 et test3/v1 utilisent le niveau d'isolation par objet de données. Le résultat peut également contenir un objet nommé mysql/global_ddl_lock avec un type d'objet table. Cet objet est utilisé en interne et peut être ignoré.

  • Exécutez la commande suivante pour interroger la distribution de toutes les bases de données dans le cluster :

    Remarque

    Cette requête ne peut être exécutée qu'à l'aide d'un compte privilégié.

    SELECT * FROM INFORMATION_SCHEMA.INNODB_CC_GLOBAL_LOCK_INFO WHERE LOCK_MODE = 'SLS_X';

    Le résultat suivant est renvoyé :

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_CC_GLOBAL_LOCK_INFO WHERE LOCK_MODE = 'SLS_X';
    +-----------+------------+---------------------+-----------+-----------+-------------+---------------------+-----------------+
    | master_id | table_name | table_id            | lock_mode | object    | current_lsn | hold_start_time     | hold_total_time |
    +-----------+------------+---------------------+-----------+-----------+-------------+---------------------+-----------------+
    |         1 | test3/v1   | 9149389368457234649 | SLS_X     | view      |    28075972 | 2024-07-10 21:35:08 |             754 |
    |         2 | test5/t1   | 9149389447232697561 | SLS_X     | table     |     7256175 | 2024-07-10 21:46:36 |              66 |
    |         1 | test2      | 3381728963524265351 | SLS_X     | db        |    28034927 | 2024-07-10 11:13:09 |           38073 |
    |         2 | test4      | 3381728963524272009 | SLS_X     | db        |     7255352 | 2024-07-10 21:46:27 |              75 |
    |         1 | test3/f1   | 9149389368458135753 | SLS_X     | function  |    28076635 | 2024-07-10 21:35:20 |             742 |
    |         1 | test3/e1   | 9149389368458332874 | SLS_X     | event     |    28077248 | 2024-07-10 21:35:30 |             732 |
    |         1 | test       | 7190879906290573778 | SLS_X     | db        |    28034927 | 2024-07-10 11:20:57 |           37605 |
    |         2 | test5/p1   | 9149389447233473757 | SLS_X     | procedure |     7257051 | 2024-07-10 21:46:45 |              57 |
    |         1 | sbtest     | 2107518311328629409 | SLS_X     | db        |    28034927 | 2024-07-07 23:04:41 |          254581 |
    +-----------+------------+---------------------+-----------+-----------+-------------+---------------------+-----------------+
    
    9 rows in set (0.00 sec)

    Bien que la colonne soit nommée table_name, chaque ligne du résultat contient des informations sur une base de données ou un objet de données et son nœud principal correspondant. Le résultat peut également contenir un objet nommé mysql/global_ddl_lock avec un type d'objet table. Cet objet est utilisé en interne et peut être ignoré.

Configurer le journal binaire

Multi-master Cluster (Limitless) est entièrement compatible avec le journal binaire MySQL. Il consolide les journaux d'opérations de tous les nœuds principaux du cluster pour générer un journal binaire globalement unifié et ordonné logiquement.

Vous pouvez utiliser loose_polar_log_bin pour activer la fonctionnalité de journal binaire pour un Multi-master Cluster (Limitless) et binlog_expire_logs_seconds pour définir la période de rétention des journaux binaires du Multi-master Cluster (Limitless). Pour plus d'informations, consultez la rubrique Activer les journaux binaires.

Remarque

Multi-master Cluster (Limitless) peut être utilisé comme source et destination pour Data Transmission Service (DTS) afin d'effectuer une synchronisation de données unidirectionnelle ou bidirectionnelle.