在現代的高可用架構中,數據庫容災(Failover)是保障系統高可靠性的重要手段。尤其是在分佈式數據庫或主從架構中,當主數據庫出現故障時,需要切換到備用數據庫進行繼續提供服務。為了實現這一目的,MySQL 提供了mysqli::$errno這一屬性來幫助開發人員判斷數據庫操作是否出現了錯誤,並通過錯誤代碼來觸發容災切換。
本文將介紹如何通過mysqli::$errno判斷數據庫是否需要容災切換,並簡要實現一個容災切換的示例。
mysqli::$errno是mysqli類中的一個屬性,它代表了上一個MySQL 查詢操作的錯誤碼。如果查詢成功,該屬性值為0;如果出現錯誤,該屬性將返回對應的MySQL 錯誤代碼。可以通過這個屬性來判斷是否發生了錯誤,並做出相應的錯誤處理。
常見的錯誤碼如:
2002 : Connection refused ,數據庫無法連接。
1040 : Too many connections ,數據庫連接數達到上限。
1213 : Deadlock ,死鎖錯誤。
假設你使用的是MySQL 主從架構,主庫發生故障時,應該自動切換到備用的從庫。我們可以利用mysqli::$errno判斷錯誤代碼來判斷是否需要進行容災切換。
下面是一個簡化的容災切換實現示例:
<?php
// 數據庫連接配置
$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'
];
// 創建數據庫連接
function connectDatabase($db_config) {
$mysqli = new mysqli($db_config['host'], $db_config['user'], $db_config['password'], $db_config['database']);
if ($mysqli->connect_error) {
echo "連接失敗: " . $mysqli->connect_error . "\n";
return null;
}
return $mysqli;
}
// 嘗試連接主庫
$mysqli = connectDatabase($primary_db_config);
if ($mysqli === null) {
// 如果主库連接失敗,切換到備用庫
echo "主数据库連接失敗,切換到備用數據庫...\n";
$mysqli = connectDatabase($secondary_db_config);
}
// 執行查詢操作
if ($mysqli) {
$query = "SELECT * FROM some_table";
if ($mysqli->query($query) === FALSE) {
// 根據錯誤碼判斷是否需要容災切換
echo "查詢失敗: " . $mysqli->errno . " - " . $mysqli->error . "\n";
if ($mysqli->errno == 2002 || $mysqli->errno == 1040) {
// 如果是數據庫連接錯誤或連接數滿,嘗試切換數據庫
echo "嘗試切換數據庫...\n";
$mysqli = connectDatabase($secondary_db_config);
}
} else {
echo "查詢成功\n";
}
}
數據庫配置:我們為主庫和從庫配置了數據庫連接信息。主庫的連接配置存儲在$primary_db_config變量中,從庫的配置存儲在$secondary_db_config中。
數據庫連接: connectDatabase()函數用於建立數據庫連接。它接收數據庫配置信息並返回一個mysqli對象,如果連接失敗,返回null 。
主庫連接失敗時切換到從庫:如果連接主庫失敗,我們嘗試連接從庫,並將$mysqli變量指向新的連接。
查詢操作:通過$mysqli->query()執行數據庫查詢,如果查詢失敗,我們通過$mysqli->errno獲取錯誤碼,判斷是否需要進行容災切換。例如, errno == 2002表示數據庫連接失敗, errno == 1040表示數據庫連接數已滿。在這兩種情況下,我們嘗試切換到備用數據庫。
使用mysqli::$errno可以有效地幫助我們判斷數據庫操作的錯誤,並通過錯誤碼判斷是否需要容災切換。通過這個簡單的示例,我們展示瞭如何在主從數據庫架構中進行容災切換。在實際開發中,您可以根據具體的錯誤碼和系統需求來定制容災切換邏輯,進一步提高系統的可用性和穩定性。