Dans l'architecture moderne à haute disponibilité, la reprise après sinistre de la base de données (basculement) est un moyen important pour garantir la forte fiabilité du système. En particulier dans les bases de données distribuées ou les architectures maître-esclave, lorsque la base de données maître échoue, il est nécessaire de passer à la base de données de secours pour continuer à fournir des services. Pour y parvenir, MySQL fournit la propriété MySQLI :: $ ERRNO pour aider les développeurs à déterminer s'il existe une erreur dans les opérations de base de données et déclencher un commutateur de récupération catastrophe à travers les codes d'erreur.
Cet article mettra en œuvre comment déterminer si la base de données a besoin de commutation de reprise après sinistre via mysqli :: $ errno et implémenter brièvement un exemple de commutation de reprise après sinistre.
MySQLI :: $ Errno est une propriété de la classe MySQLI , qui représente le code d'erreur de l'opération de requête MySQL précédente. Si la requête réussit, la valeur de la propriété est 0; Si une erreur se produit, la propriété renverra le code d'erreur MySQL correspondant. Cette propriété peut être utilisée pour déterminer si une erreur s'est produite et effectuer une gestion des erreurs correspondante.
Les codes d'erreur courants sont:
2002 : Connexion refusée , la base de données ne peut pas être connectée.
1040 : Trop de connexions , le nombre de connexions de base de données atteint la limite supérieure.
1213 : impasse , erreur de blocage.
En supposant que vous utilisez l'architecture maître-esclave MySQL, si la bibliothèque maître échoue, elle devrait automatiquement passer à la bibliothèque d'esclaves alternative. Nous pouvons utiliser MySqli :: $ Errno pour déterminer le code d'erreur pour déterminer si la commutation de récupération catastrophe est nécessaire.
Voici un exemple d'une implémentation simplifiée de commutation de reprise après sinistre:
<?php
// Configuration de la connexion de la base de données
$primary_db_config = [
'host' => 'primary.m66.net',
'user' => 'root',
'password' => 'password',
'database' => 'test_db'
];
$secondary_db_config = [
'host' => 'secondary.m66.net',
'user' => 'root',
'password' => 'password',
'database' => 'test_db'
];
// Créer une connexion de base de données
function connectDatabase($db_config) {
$mysqli = new mysqli($db_config['host'], $db_config['user'], $db_config['password'], $db_config['database']);
if ($mysqli->connect_error) {
echo "Échec de la connexion: " . $mysqli->connect_error . "\n";
return null;
}
return $mysqli;
}
// Essayez de vous connecter à la bibliothèque principale
$mysqli = connectDatabase($primary_db_config);
if ($mysqli === null) {
// 如果主库Échec de la connexion,Passez à la bibliothèque de sauvegarde
echo "主数据库Échec de la connexion,Passez à la base de données de secours...\n";
$mysqli = connectDatabase($secondary_db_config);
}
// Effectuer des opérations de requête
if ($mysqli) {
$query = "SELECT * FROM some_table";
if ($mysqli->query($query) === FALSE) {
// Déterminez si une commutation de reprise après sinistre est requise en fonction du code d'erreur
echo "La requête a échoué: " . $mysqli->errno . " - " . $mysqli->error . "\n";
if ($mysqli->errno == 2002 || $mysqli->errno == 1040) {
// Si la connexion de la base de données est erronée ou si le nombre de connexions est pleine,Essayez de changer de base de données
echo "Essayez de changer de base de données...\n";
$mysqli = connectDatabase($secondary_db_config);
}
} else {
echo "Interroger réussi\n";
}
}
Configuration de la base de données : nous avons configuré les informations de connexion de la base de données pour les bibliothèques maître et esclaves. La configuration de connexion de la bibliothèque principale est stockée dans la variable $ primaire_db_config , et la configuration de la bibliothèque des esclaves est stockée dans le $ secondary_db_config .
Connexion de la base de données : la fonction connectDatabase () est utilisée pour établir une connexion de base de données. Il reçoit les informations de configuration de la base de données et renvoie un objet MySQLI , et si la connexion échoue, renvoyez NULL .
Passez à l'esclave lorsque la connexion de la bibliothèque principale échoue : si la connexion de la bibliothèque principale échoue, nous essayons de nous connecter à l'esclave et de pointer la variable $ mysqli à la nouvelle connexion.
Fonctionnement de la requête : Exécutez la requête de base de données via $ mysqli-> query () . Si la requête échoue, nous obtenons le code d'erreur via $ mysqli-> errno pour déterminer si la commutation de reprise après sinistre est nécessaire. Par exemple, Errno == 2002 signifie que la connexion de la base de données a échoué, et Errno == 1040 signifie que le numéro de connexion de la base de données est complet. Dans les deux cas, nous essayons de passer à la base de données de secours.
L'utilisation de mysqli :: $ Errno peut nous aider efficacement à juger les erreurs dans les opérations de base de données et à déterminer si la commutation de récupération catastrophe est requise via le code d'erreur. Avec cet exemple simple, nous montrons comment effectuer une commutation de reprise après sinistre dans le schéma de base de données maître-esclave. Dans le développement réel, vous pouvez personnaliser la logique de commutation de récupération des catastrophes en fonction des codes d'erreur spécifiques et des exigences du système pour améliorer davantage la convivialité et la stabilité du système.