MySQL 數(shù)據(jù)丟失排查案例
前言
最近,有一位朋友突然微信聯(lián)系我,說(shuō)MySQL出現(xiàn)了數(shù)據(jù)丟失的情況;毫無(wú)疑問(wèn),對(duì)于一個(gè)DBA而言,這無(wú)疑是最令人緊張的一件事情,沒(méi)有之一;聽(tīng)到這個(gè)消息后,我也就立刻投入到問(wèn)題排查中。
現(xiàn)場(chǎng)排查
一開(kāi)始聽(tīng)到這個(gè)消息,我心里面當(dāng)然也是非常緊張,不過(guò)很快就讓自己冷靜下來(lái),開(kāi)始進(jìn)行排查:
(1)實(shí)例狀態(tài)是不是正常的? --經(jīng)確認(rèn),實(shí)例狀態(tài)正常
(2)業(yè)務(wù)庫(kù)是哪個(gè)?是否還存在?是否被刪除? --經(jīng)確認(rèn),業(yè)務(wù)庫(kù)存在
(3)業(yè)務(wù)是訪問(wèn)哪個(gè)表報(bào)錯(cuò)?該表是否存在?是否被刪除? --經(jīng)確認(rèn),業(yè)務(wù)表存在
(4)應(yīng)用用戶的權(quán)限是否正常? --經(jīng)確認(rèn),應(yīng)用用戶擁有業(yè)務(wù)庫(kù)的所有權(quán)限
(5)業(yè)務(wù)訪問(wèn)是報(bào)什么錯(cuò)? --經(jīng)確認(rèn),業(yè)務(wù)側(cè)是訪問(wèn)某些頁(yè)面報(bào)錯(cuò)
(6)排查到這里,一方面是懷疑應(yīng)用程序是否有異常,另一方面是懷疑是否出現(xiàn)部分記錄丟失;開(kāi)發(fā)側(cè)和運(yùn)維側(cè)同時(shí)在排查,這邊給運(yùn)維側(cè)排查的思路是 業(yè)務(wù)表是否有主鍵?業(yè)務(wù)側(cè)訪問(wèn)報(bào)錯(cuò)和業(yè)務(wù)表的對(duì)應(yīng)關(guān)系是怎樣的?能否找出相對(duì)應(yīng)的記錄?
(7)進(jìn)一步分析發(fā)現(xiàn),該業(yè)務(wù)表有主鍵,開(kāi)發(fā)側(cè)也提供了查詢(xún)的記錄,經(jīng)排查該記錄存在,并未被誤刪除;開(kāi)發(fā)側(cè)排查應(yīng)用程序,日志也未很清晰打印出報(bào)錯(cuò)信息
(8)在這種情況下,只能先咨詢(xún)一下當(dāng)晚是否有做什么變更/發(fā)布? --經(jīng)確認(rèn),當(dāng)晚有做一些表的DDL變更
繼續(xù)排查發(fā)現(xiàn),當(dāng)晚DDL變更有涉及到該業(yè)務(wù)表的操作,變更內(nèi)容為修改字段長(zhǎng)度,類(lèi)似alter table xxx modify column xxx char(x);問(wèn)題到這里也就開(kāi)始有思路了,接下去開(kāi)始排查sql_mode配置、查詢(xún)相應(yīng)的完整行記錄給開(kāi)發(fā)確認(rèn),最終確認(rèn)是DDL變更導(dǎo)致字段被截?cái)?,最后只能通過(guò)備份進(jìn)行恢復(fù),問(wèn)題最終得到解決。
案例復(fù)現(xiàn)
看完剛剛的排查過(guò)程,相信很多童鞋都會(huì)有疑問(wèn),為什么修改字段長(zhǎng)度對(duì)導(dǎo)致數(shù)據(jù)被截?cái)??MySQL難道不會(huì)不會(huì)做數(shù)據(jù)校驗(yàn)嗎?讓我們接著往下看。
(1)場(chǎng)景1
mysql> select * from sbtest2 limit 1; +----+---------+-------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+ | id | k | c | pad | +----+---------+-------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+ | 1 | 3718516 | 08566691963-88624912351-16662227201-46648573979-64646226163-77505759394-75470094713-41097360717-15161106334-50535565977 | 63188288836-92351140030-06390587585-66802097351-49282961843 | +----+---------+-------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> alter table sbtest2 modify column pad char(1); ERROR 1265 (01000): Data truncated for column 'pad' at row 1 mysql> select * from sbtest2 limit 1; +----+---------+-------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+ | id | k | c | pad | +----+---------+-------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+ | 1 | 3718516 | 08566691963-88624912351-16662227201-46648573979-64646226163-77505759394-75470094713-41097360717-15161106334-50535565977 | 63188288836-92351140030-06390587585-66802097351-49282961843 | +----+---------+-------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+ 1 row in set (0.00 sec)
(2)場(chǎng)景2
mysql> select * from sbtest2 limit 1; +----+---------+-------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+ | id | k | c | pad | +----+---------+-------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+ | 1 | 3718516 | 08566691963-88624912351-16662227201-46648573979-64646226163-77505759394-75470094713-41097360717-15161106334-50535565977 | 63188288836-92351140030-06390587585-66802097351-49282961843 | +----+---------+-------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> alter table sbtest2 modify column pad char(1);Query OK, 100 rows affected, 100 warnings (0.06 sec) Records: 100 Duplicates: 0 Warnings: 100 mysql> select * from sbtest2 limit 1; +----+---------+-------------------------------------------------------------------------------------------------------------------------+------+ | id | k | c | pad | +----+---------+-------------------------------------------------------------------------------------------------------------------------+------+ | 1 | 3718516 | 08566691963-88624912351-16662227201-46648573979-64646226163-77505759394-75470094713-41097360717-15161106334-50535565977 | 6 | +----+---------+-------------------------------------------------------------------------------------------------------------------------+------+ 1 row in set (0.00 sec)
場(chǎng)景1是比較符合我們預(yù)期的,直接報(bào)錯(cuò)“數(shù)據(jù)被截?cái)唷?;?chǎng)景2是執(zhí)行成功,導(dǎo)致“數(shù)據(jù)部分丟失”;那么,MySQL是沒(méi)有進(jìn)行數(shù)據(jù)校驗(yàn)嗎?其實(shí)MySQL都有對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)的,只是在場(chǎng)景2中,因?yàn)閟ql_mode配置有問(wèn)題,沒(méi)有設(shè)置STRICT_TRANS_TABLES,導(dǎo)致MySQL沒(méi)有阻止該操作執(zhí)行,從而導(dǎo)致“數(shù)據(jù)丟失”慘案。
總結(jié)
至此,“數(shù)據(jù)丟失”慘案也就可以告一段落,根本原因是sql_mode沒(méi)有設(shè)置STRICT_TRANS_TABLES;這個(gè)案例也是在提醒我們,sql_mode是一個(gè)非常關(guān)鍵的配置,千萬(wàn)不可隨便設(shè)置和修改;關(guān)于sql_mode的更多內(nèi)容,下篇文章會(huì)繼續(xù)給大家分享。
以上就是MySQL 數(shù)據(jù)丟失排查案例的詳細(xì)內(nèi)容,更多關(guān)于MySQL 數(shù)據(jù)丟失排查的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- MySQL 丟失數(shù)據(jù)的原因及解決
- 解決docker重啟redis,mysql數(shù)據(jù)丟失的問(wèn)題
- MySQL使用Replace操作時(shí)造成數(shù)據(jù)丟失的問(wèn)題解決
- Python3.6-MySql中插入文件路徑,丟失反斜杠的解決方法
- Mysql掛掉后無(wú)法重啟報(bào)pid文件丟失的解決方法
- 使用SKIP-GRANT-TABLES 解決 MYSQL ROOT密碼丟失
- MySQL下PID文件丟失的相關(guān)錯(cuò)誤的解決方法
- 防止服務(wù)器宕機(jī)時(shí)MySQL數(shù)據(jù)丟失的幾種方案
- MySQL遠(yuǎn)程連接丟失問(wèn)題解決方法(Lost connection to MySQL server)
- 記一次mysql字符串末尾空白丟失的排查
相關(guān)文章
MySQL使用mysqldump實(shí)現(xiàn)數(shù)據(jù)完全備份
mysqldump是MySQL自帶的備份工具,可方便實(shí)現(xiàn)對(duì)MySQL的備份,也可以將指定的庫(kù)、表導(dǎo)出為SQL腳本,下面小編就來(lái)教大家如何使用mysqldump實(shí)現(xiàn)數(shù)據(jù)完全備份吧2023-07-07
一文弄懂MySQL中redo?log與binlog的區(qū)別
在學(xué)習(xí)mysql數(shù)據(jù)庫(kù)時(shí),不可避免要去接觸到redo log和binlog,好多人對(duì)這兩者的概念分不太清,下面這篇文章主要給大家介紹了關(guān)于MySQL中redo?log與binlog區(qū)別的相關(guān)資料,需要的朋友可以參考下2022-02-02
詳解用SELECT命令在MySQL執(zhí)行查詢(xún)操作的教程
這篇文章主要介紹了詳解用SELECT命令在MySQL執(zhí)行查詢(xún)操作的教程,本文中還給出了基于PHP腳本的操作演示,需要的朋友可以參考下2015-05-05
MySQL實(shí)現(xiàn)差集(Minus)和交集(Intersect)測(cè)試報(bào)告
MySQL沒(méi)有實(shí)現(xiàn)Minus和Intersect功能,就像它也沒(méi)有實(shí)現(xiàn)cube的功能一樣。2014-06-06
mysql查詢(xún)上下級(jí)機(jī)構(gòu)的方法實(shí)例
大家應(yīng)該都知道表里有上下級(jí)機(jī)構(gòu)的,下面這篇文章主要給大家介紹了關(guān)于mysql查詢(xún)上下級(jí)機(jī)構(gòu)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04
MySQL中復(fù)制數(shù)據(jù)表中的數(shù)據(jù)到新表中的操作教程
這篇文章主要介紹了MySQL中復(fù)制數(shù)據(jù)表中的數(shù)據(jù)到新表中的操作教程,文中分為新表存在和新表不存在兩種情況來(lái)講,需要的朋友可以參考下2016-03-03
MySQL提示Accessdeniedforuser‘‘@‘localhost‘”的解決方案
在使用MySQL數(shù)據(jù)庫(kù)的過(guò)程中,有時(shí)會(huì)遇到錯(cuò)誤提示:“Access denied for user ''@'localhost'”,這個(gè)錯(cuò)誤通常意味著MySQL服務(wù)器拒絕了當(dāng)前用戶的連接請(qǐng)求,本文將詳細(xì)探討該問(wèn)題的原因及解決方法,需要的朋友可以參考下2025-01-01
MySQL本地版本升級(jí)超詳細(xì)教程(從5.5.20升到8.0.21)
MySQL是一款廣泛使用的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),但是舊版本的客戶端可能會(huì)受到一些限制,下面這篇文章主要給大家介紹了關(guān)于MySQL本地版本升級(jí)超詳細(xì)教程,本文是從5.5.20升到8.0.21的相關(guān)資料,需要的朋友可以參考下2023-04-04
基于Mysql+JavaSwing的超市商品管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
本項(xiàng)目是使用Java swing開(kāi)發(fā),可實(shí)現(xiàn)超市管理系統(tǒng)商品列表信息查詢(xún)、添加商品信息和修改商品管理以及刪除商品信息和安裝商品信息查詢(xún)等功能。界面設(shè)計(jì)和功能比較簡(jiǎn)單基礎(chǔ)、適合作為Java課設(shè)設(shè)計(jì)以及學(xué)習(xí)技術(shù)使用,需要的朋友可以參考一下2021-09-09

