當前位置: 首頁> 最新文章列表> 基於$errno 做數據庫容災切換的觸發判斷

基於$errno 做數據庫容災切換的觸發判斷

M66 2025-06-01

在現代的高可用架構中,數據庫容災(Failover)是保障系統高可靠性的重要手段。尤其是在分佈式數據庫或主從架構中,當主數據庫出現故障時,需要切換到備用數據庫進行繼續提供服務。為了實現這一目的,MySQL 提供了mysqli::$errno這一屬性來幫助開發人員判斷數據庫操作是否出現了錯誤,並通過錯誤代碼來觸發容災切換。

本文將介紹如何通過mysqli::$errno判斷數據庫是否需要容災切換,並簡要實現一個容災切換的示例。

什麼是mysqli::$errno

mysqli::$errnomysqli類中的一個屬性,它代表了上一個MySQL 查詢操作的錯誤碼。如果查詢成功,該屬性值為0;如果出現錯誤,該屬性將返回對應的MySQL 錯誤代碼。可以通過這個屬性來判斷是否發生了錯誤,並做出相應的錯誤處理。

常見的錯誤碼如:

  • 2002 : Connection refused ,數據庫無法連接

  • 1040 : Too many connections ,數據庫連接數達到上限。

  • 1213 : Deadlock ,死鎖錯誤。

如何使用mysqli::$errno判斷容災切換

假設你使用的是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";
    }
}

代碼解析

  1. 數據庫配置:我們為主庫和從庫配置了數據庫連接信息。主庫的連接配置存儲在$primary_db_config變量中,從庫的配置存儲在$secondary_db_config中。

  2. 數據庫連接connectDatabase()函數用於建立數據庫連接。它接收數據庫配置信息並返回一個mysqli對象,如果連接失敗,返回null

  3. 主庫連接失敗時切換到從庫:如果連接主庫失敗,我們嘗試連接從庫,並將$mysqli變量指向新的連接。

  4. 查詢操作:通過$mysqli->query()執行數據庫查詢,如果查詢失敗,我們通過$mysqli->errno獲取錯誤碼,判斷是否需要進行容災切換。例如, errno == 2002表示數據庫連接失敗, errno == 1040表示數據庫連接數已滿。在這兩種情況下,我們嘗試切換到備用數據庫。

結語

使用mysqli::$errno可以有效地幫助我們判斷數據庫操作的錯誤,並通過錯誤碼判斷是否需要容災切換。通過這個簡單的示例,我們展示瞭如何在主從數據庫架構中進行容災切換。在實際開發中,您可以根據具體的錯誤碼和系統需求來定制容災切換邏輯,進一步提高系統的可用性和穩定性。