当前位置: 首页> 最新文章列表> 基于 $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 可以有效地帮助我们判断数据库操作的错误,并通过错误码判断是否需要容灾切换。通过这个简单的示例,我们展示了如何在主从数据库架构中进行容灾切换。在实际开发中,您可以根据具体的错误码和系统需求来定制容灾切换逻辑,进一步提高系统的可用性和稳定性。