故障分析 | 库表名-大小写不规范,运维两行泪

news2024/11/26 14:24:30

作者:刘聪

爱可生华东交付服务部 DBA 成员,专职 MySQL 故障处理及相关技术支持。座右铭:好好学习,天天向上。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


一、问题描述

客户需要做一套库的迁移,因为库的数据量不大,40G左右,并且需要到远程机器上去做全量恢复。所以第一时间想到的自然是 mysqldump 工具来做。但是没想到会发生这种“惨案”。

mysqldump 备份失败,报错表不存在。

检查 MySQL 客户端去查看表信息以及表的物理文件包括环境信息(是否严格区分大小写),整理的现象如下:

  • mysqldump 报错:table doesn’t exist;
  • show tables 观察:db 存在,报错的 table 也存在;
  • select 查看表数据:报错 table doesn’t exist ;
  • 观察物理文件:db.opt 文件不存在;报错的 table,idb 文件不存在,仅有 frm 文件;
  • 查看 mysql-error.log :有 DROP database 的提示,且记录了报错 table 的 frm 文件 was lost ;
  • MySQL 环境信息:lower_case_table_names = 1 。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2qNrs3Sf-1673846371507)(https://action-weikai.oss-cn-shanghai.aliyuncs.com/liucong13-2图.png)]

二、分析诊断

首先,我们看一下 MySQL 官网提供的信息(官网链接:https://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivity.html)。

根据下面截图信息可以确定 Unix 平台上,lower_case_table_names 默认 = 0 ,是大小写敏感的。

从 mysqldump 报错所提示的表名中包含了大写,不难推断出:是在 lower_case_table_names = 0 条件下,创建了该表,所以表名和物理文件名也都包含大写。而当前的 MySQL 环境是 lower_case_table_names = 1(也就是不论 sql 中是否明确了表名的大小写,均按小写去匹配),可以确定此环境变量有做过变更。

结合 mysql-error.log 的报错信息提示,可能有 DROP database 动作执行过。且数据库目录中的 db.opt 文件缺失这点,更加增强了 DROP database 的可能性。

那么,我们不妨做出如下猜想:

在 lower_case_table_names = 1 环境下,下发了 DROP database 操作。由于操作系统 Linux 是大小写敏感的,MySQL 使用小写字母去匹配需要删除的库表文件,而.frm文件名中包含了大写,无法匹配,导致文件残留(mysql-error.log 此时记录,在删库过程中,无法找到对应.frm文件)。

三、场景模拟

测试环境:

操作系统CentOS Linux release 7.5.1804 (Core)
MySQL版本5.7.25, for linux-glibc2.12 (x86_64)

为了证实第二节的猜想是否准确,设计如下实验,模拟复现 mysqldump 报错。

  • 在 lower_case_table_names=0 ,严格区分大小写条件下创建测试库‘test_database’和测试表‘Test_table’;
  • 修改配置文件 lower_case_table_names=1 ,并重启 MySQL ;
  • 在 lower_case_table_names=1 条件下,模拟删除数据库:test_database ;
  • 查看物理文件信息以及 mysql-error.log 信息;
  • 使用 mysqldump 触发备份动作,复现报错。

通过以上实验,可以论证第二节的推测是准确的,并总结如下结论:

  • 操作系统 Linux 是大小写敏感的,在 lower_case_table_names=0(默认值)条件下,库表的物理文件会明确区分大小写;
  • 在 lower_case_table_names=1 条件下,MySQL 使用小写字母(不论 sql 语句里是否明确使用大写表名)去匹配需要删除的库表文件;
  • 在 lower_case_table_names=1 条件下,下发 Drop database 操作,由于表 frm 文件名包含大写,无法匹配,因此残留,而 idb 文件不论大小写都会被删除。

四、报错解决方案

通过第三节的场景模拟可以推测出,应用人员其实本意是要将库下的数据全部删除掉,但是因 MySQL 的环境因素,以及运维人员的操作不当,导致遗留下.frm文件未被清理掉。那么我们可以直接跳过相关库的备份,从而绕过此报错。

五、运维建议

运维中,难免有库表的迁移和改造的需求,这时需要特别注意 lower_case_table_names 的值以及库、表名的大小写,稍不留神就报错库或者表不存在。对此,整理如下两个场景以供大家运维参考。

场景1:将 MySQL 的环境变量 lower_case_table_names 从默认的 0 ,修改为1

  • 先将库名和表名转换为小写;
  • 编辑配置文件,添加配置:lower_case_table_names = 1 ;
  • 重启 MySQL 。

场景2:将大写的表名、库名规范改成小写的:

  • 表名改造:可以直接使用 RENAME TABLE 语句;
  • 库名改造:需要先使用 mysqldump ,将数据全部导出后,重建库名,再将数据导入进去。

致谢:感谢爱可生DBA巨佬操盛春、晏泽的鼎力相助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/167238.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【博客589】K8s Topology Spread Constraints

K8s Topology Spread Constraints 场景 你可以使用 拓扑分布约束(Topology Spread Constraints) 来控制 Pod 在集群内故障域之间的分布, 例如区域(Region)、可用区(Zone)、节点和其他用户自定义…

带你从概念到服务对象,解读商业智能BI

数据在当前时代已然成为了重要的战略资源,但数据资产却并不是每个企业都能利用。数据本身并没有太多意义,规模小还好,一旦规模量变大,人们就难以理解其中的含义。所以讲数据资产价值化,使其转化为信息和知识成为了企业…

五个了解自己天赋优势的分析工具(四)MBTI测试

MBTI测试 MBTI全称“迈尔斯-布⾥格斯类型指标”,是美国作家伊莎⻉尔布⾥格斯迈尔斯和她的⺟亲凯瑟琳库克布⾥格斯在20世纪40年代编制的⼀种⼈格测试。 这⼀测试的基础来⾃著名⼼理学家荣格提出的⼼理类型理论。 荣格将⼈的性格类型分为“内向(I&#xf…

广告业务系统 之 业务串联 —— “ PDB - 广告投放【保量保价】”

文章目录广告业务系统 之 业务串联 —— “ PDB - 广告投放【保量保价】”PDB - 广告投放[保量保价]PDB 浅述PDB 数据流图保量逻辑设计订单曝光拆分凌晨停量补量广告业务系统 之 业务串联 —— “ PDB - 广告投放【保量保价】” PDB - 广告投放[保量保价] 常规的 ADX 系统&am…

【C语言练习】 二进制中1的个数

目录题目详情:思路一:思路二:思路三:题目详情: 思路一: 拿到二进制的每一位,看它是否等于 111,再定义一个计数器变量,如果等于 111,计数器变量就加 111。最终…

rancher的k3s证书过期

文章目录现象rancher报错日志分析解决思路解决现象 web上rancher不能访问,服务上看443端口没了,6443端口仍然在。 rancher报错日志 rancher | time"2023-01-05T01:56:07.241615176Z" levelinfo msg"Waiting for master node start…

代码随想录--数组相关题目整理

LeetCode数组相关题目整理 1. LeetCode704 二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 解题思路&#xf…

亚马逊云科技助力游戏上云学习心得-运行篇

云服务已经是大势所趋了,通过购置传统服务器来进行应用开发,无法与现代化敏捷的开发方法相结合,对于系统运维的难度也大大增加,而云服务的弹性伸缩、动态计费可以很好地帮助中小企业实现快速应用开发,使得产品的价值最…

一文吃透python面向对象基础+进阶

目录基本理论面向过程与面向对象面向过程面向对象基本概念面向对象基本语法定义类创建对象属性属性和变量区别对象属性类属性限制对象属性添加方法实例方法类方法静态方法私有属性只读属性私有方法魔法方法字符串表示可调用索引操作切片操作比较操作布尔判断遍历操作面向对象三…

字节青训营Go语言学习第一天--基础语言+实战案例

文章目录走进Go语言基础语言2.2基础语言-变量2.3基础语法- if else2.4基础语法-循环基础语法-switch基础语法-数组基础语法-切片基础语法-map基础语法-range基础语法-函数基础语法-指针基础语法-结构体基础语法-结构体方法基础语法-错误处理基础语法-字符串操作基础语法-字符串…

通讯录升级--可增容(动态增长空间)

通讯录成员的改变 之前我们定义了date[100]的数组用来存放100个人的信息,但是当需要存储的人数超过100时,内存不够,存储人数较少时,又有些浪费,并且数组空间在创建时就已经确立,无法随需求改变&#xff0c…

rabbitmq+netcore6 【6】RPC:远程过程调用

文章目录1)前言2)Client interface 客户接口3)Callback queue回调队列4)Correlation Id 关联Id5)Summary总结6)综合以上代码准备工作服务端客户端结果验证官网参考链接: https://www.rabbitmq.c…

372. 超级次方

372. 超级次方题目算法设计:迭代算法设计:递归题目 传送门:https://leetcode.cn/problems/super-pow/ 题目不难懂,问题在于 b 是一个非常非常大的数,会溢出。 迭代和递归,各有解决方法,记录在…

Elasticsearch入门——kibanna和postman操作Elasticsearch索引示例

目录一、使用kibanna操作Elasticsearch索引示例二、使用postman操作Elasticsearch索引示例三、kibanna和postman操作Elasticsearch的总结一、使用kibanna操作Elasticsearch索引示例 启动Elasticsearch和kibanna服务,浏览器访问http://localhost:5601/,进入Dev Tools…

week11

T1汤姆斯的天堂梦 题目描述 汤姆斯生活在一个等级为 000 的星球上。那里的环境极其恶劣,每天 121212 小时的工作和成堆的垃圾让人忍无可忍。他向往着等级为 NNN 的星球上天堂般的生活。 有一些航班将人从低等级的星球送上高一级的星球,有时需要向驾驶…

【C语言】数据结构基础(每日小细节025),有三数之和哦

算法好题初阶(一共14回已经更新完毕),从今天开始就是基础的数据结构题目 1.只出现一次的数字 如果不额外开辟任何空间的话一定要想到位运算符 异或^ :两个整数异或,遵循相同为0,相异为1的二进制位运算规则 &#x…

【Nginx 基础】

Nginx 的安装 Nginx 的静态网站部署 理解 Nginx 的反向代理与负载均衡,能够配置反向代理与负载均衡 一、 Nginx 概述 Nginx 是一款高性能的 HTTP 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,由俄罗斯的程序工程师伊戈…

spring学习系列

Spring_三种方式的依赖注入1.第一种,set方式,property2.构造器注入(构造方法)3.p命名空间注入4、注入各种数据类型//老师类 public class Teacher {private String name;private int age; }//课程类 public class Course {private…

云原生技术学习笔记(基础版)

一、容器基本概念容器运行时,多种虚拟化技术,runC、kata、gVisor等。containerd -shim不是个lib,是个守护进程,管理容器生命周期,可被containerd动态接管。(可以从containerd中脱离出来,插件化管理&#xf…

jvm系列(1)--JVM和Java体系架构

目录Java-跨平台的语言JVM-跨语言的平台多语言混合编程虚拟机虚拟机概念Java虚拟机JVM的位置JVM的整体结构Java代码执行流程JVM的架构模型基于栈的指令集架构基于寄存器的指令级架构两种架构的举例JVM架构总结JVM的生命周期虚拟机的启动虚拟机的执行虚拟机的退出Java-跨平台的语…