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

打印 上一主题 下一主题

主题 532|帖子 532|积分 1611

数据库表中最大自增ID用完会报错。判断是否接近或到达自增ID范例的最大值:‌
对于MySQL中的自增ID,‌如果使用的是int范例,‌其无符号(‌unsigned)‌的最大值可以到达2^32 - 1,‌即4294967295。‌如果使用的是有符号的bigint范例 2^63 - 1,无符号的 2^64 - 1。如果查询到的最大ID值接近或到达这个数值,‌那么自增ID可能即将用完或已经用完。‌
  1. <?php
  2. // 数据库配置
  3. $host = 'localhost';
  4. $db = 'your_database';
  5. $user = 'your_username';
  6. $pass = 'your_password';
  7. try {
  8.     // 创建PDO实例
  9.     $pdo = new PDO("mysql:host={$host};dbname={$db};charset=utf8mb4", $user, $pass);
  10.     $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  11.     // 获取所有表名
  12.     $stmt = $pdo->query('SHOW TABLES');
  13.     $tables = [];
  14.     while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
  15.         $tables[] = array_shift($row); // 将表名提取出来
  16.     }
  17.     foreach ($tables as $table) {
  18.         try {
  19.             // 查询表的自增字段状态
  20.             $stmt = $pdo->prepare('SHOW TABLE STATUS LIKE :table');
  21.             $stmt->bindParam(':table', $table);
  22.             $stmt->execute();
  23.             $tableStatus = $stmt->fetch(PDO::FETCH_ASSOC);
  24.             if (null !== $tableStatus['Auto_increment']) {
  25.                 // 检查自增ID是否接近最大值, 假设使用的是BIGINT类型
  26.                 $maxId = getTableAutoIncrementMaxId($pdo, $table);
  27.                 // 检查自增ID是否接近最大值
  28.                 if (($maxId - $tableStatus['Auto_increment']) < 10000) {
  29.                     echo "警告:表 {$table} 的自增ID即将用尽,当前ID: {$tableStatus['Auto_increment']}, 最大ID: {$maxId}\n";
  30.                 } else {
  31.                     echo "表 {$table} 的自增ID正常,当前ID: {$tableStatus['Auto_increment']}\n";
  32.                 }
  33.             } else {
  34.                 echo "----表 {$table} 没有自增字段\n";
  35.             }
  36.         } catch (PDOException $e) {
  37.             echo "表 {$table} 的查询出现错误: ".$e->getMessage()."\n";
  38.         }
  39.     }
  40. } catch (PDOException $e) {
  41.     echo '数据库连接失败: '.$e->getMessage();
  42. }
  43. /**
  44. * 判断表的子序自增ID是否存在,跟根据自增类型获取ID最大值
  45. *
  46. * @param $pdo
  47. * @param $table
  48. *
  49. * @return float|int|object
  50. */
  51. function getTableAutoIncrementMaxId($pdo, $table)
  52. {
  53.     $powNum = 31;
  54.     // 准备SQL查询语句
  55.     $stmt = $pdo->prepare("SHOW COLUMNS FROM {$table} WHERE Extra='auto_increment'");
  56.     // 执行查询
  57.     $stmt->execute();
  58.     // 查找自增字段
  59.     $column = $stmt->fetch(PDO::FETCH_ASSOC);
  60.     if (!empty($column)) {
  61.         // 检查bigint类型
  62.         if (false !== strpos($column['Type'], 'bigint')) {
  63.             $powNum = 63;
  64.         }
  65.         // 无符号(‌unsigned)‌
  66.         if (false !== strpos($column['Type'], 'unsigned')) {
  67.             ++$powNum;
  68.         }
  69.     }
  70.     return pow(2, $powNum) - 1;
  71. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连全瓷种植牙齿制作中心

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表