运维检查:mysql表自增id是否快要用完

数据库表中最大自增ID用完会报错。判断是否接近或达到自增ID类型的最大值:‌
对于MySQL中的自增ID,‌如果使用的是int类型,‌其无符号(‌unsigned)‌的最大值可以达到2^32 - 1,‌即4294967295。‌如果使用的是有符号的bigint类型 2^63 - 1,无符号的 2^64 - 1。如果查询到的最大ID值接近或达到这个数值,‌那么自增ID可能即将用完或已经用完。‌

<?php

// 数据库配置
$host = 'localhost';
$db = 'your_database';
$user = 'your_username';
$pass = 'your_password';

try {
    // 创建PDO实例
    $pdo = new PDO("mysql:host={$host};dbname={$db};charset=utf8mb4", $user, $pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 获取所有表名
    $stmt = $pdo->query('SHOW TABLES');
    $tables = [];
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        $tables[] = array_shift($row); // 将表名提取出来
    }

    foreach ($tables as $table) {
        try {
            // 查询表的自增字段状态
            $stmt = $pdo->prepare('SHOW TABLE STATUS LIKE :table');
            $stmt->bindParam(':table', $table);
            $stmt->execute();
            $tableStatus = $stmt->fetch(PDO::FETCH_ASSOC);

            if (null !== $tableStatus['Auto_increment']) {
                // 检查自增ID是否接近最大值, 假设使用的是BIGINT类型
                $maxId = getTableAutoIncrementMaxId($pdo, $table);

                // 检查自增ID是否接近最大值
                if (($maxId - $tableStatus['Auto_increment']) < 10000) {
                    echo "警告:表 {$table} 的自增ID即将用尽,当前ID: {$tableStatus['Auto_increment']}, 最大ID: {$maxId}\n";
                } else {
                    echo "表 {$table} 的自增ID正常,当前ID: {$tableStatus['Auto_increment']}\n";
                }
            } else {
                echo "----表 {$table} 没有自增字段\n";
            }
        } catch (PDOException $e) {
            echo "表 {$table} 的查询出现错误: ".$e->getMessage()."\n";
        }
    }
} catch (PDOException $e) {
    echo '数据库连接失败: '.$e->getMessage();
}

/**
 * 判断表的子序自增ID是否存在,跟根据自增类型获取ID最大值
 *
 * @param $pdo
 * @param $table
 *
 * @return float|int|object
 */
function getTableAutoIncrementMaxId($pdo, $table)
{
    $powNum = 31;
    // 准备SQL查询语句
    $stmt = $pdo->prepare("SHOW COLUMNS FROM {$table} WHERE Extra='auto_increment'");
    // 执行查询
    $stmt->execute();
    // 查找自增字段
    $column = $stmt->fetch(PDO::FETCH_ASSOC);
    if (!empty($column)) {
        // 检查bigint类型
        if (false !== strpos($column['Type'], 'bigint')) {
            $powNum = 63;
        }
        // 无符号(‌unsigned)‌
        if (false !== strpos($column['Type'], 'unsigned')) {
            ++$powNum;
        }
    }

    return pow(2, $powNum) - 1;
}

相关推荐

  1. 检查mysqlid是否快要

    2024-07-16 21:20:07       19 阅读
  2. mysql清空数据后如何让ID仍从1开始

    2024-07-16 21:20:07       47 阅读
  3. Mysqlid、uuid、雪花算法id的比较

    2024-07-16 21:20:07       26 阅读
  4. MySQLID耗尽探究:分析与解决方案

    2024-07-16 21:20:07       65 阅读
  5. MySQL 中的ID及其应用场景

    2024-07-16 21:20:07       39 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 21:20:07       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 21:20:07       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 21:20:07       57 阅读
  4. Python语言-面向对象

    2024-07-16 21:20:07       68 阅读

热门阅读

  1. C++设计模式(装饰器模式)

    2024-07-16 21:20:07       17 阅读
  2. 哪些点权衡素材优秀与否

    2024-07-16 21:20:07       18 阅读
  3. 前端反显后端图片、上传预览图片

    2024-07-16 21:20:07       18 阅读
  4. 使用AIOHTTP模块:提高网络请求效率

    2024-07-16 21:20:07       21 阅读
  5. Redis--过期删除策略和数据淘汰策略

    2024-07-16 21:20:07       24 阅读
  6. actual combat 35 —— es

    2024-07-16 21:20:07       21 阅读
  7. 在 Gradle 项目中,排查依赖冲突可以的详细步骤

    2024-07-16 21:20:07       16 阅读
  8. LeetCode题练习与总结:最大间距--164

    2024-07-16 21:20:07       21 阅读
  9. ThinkPHP6事件系统使用指南

    2024-07-16 21:20:07       22 阅读
  10. postman安装介绍

    2024-07-16 21:20:07       19 阅读
  11. echarts忽略Null值:使用echarts的connectNulls

    2024-07-16 21:20:07       21 阅读
  12. 知识蒸馏和知识图谱相结合的大模型微调方案

    2024-07-16 21:20:07       21 阅读