Root Cause Analysis of Missing Data Using MySQL Binlog Parsing
This article presents a step‑by‑step investigation of a data‑loss incident in a MySQL table by examining binlog files, identifying unintended TRUNCATE operations, and offering practical binlog‑parsing techniques and configuration tips for reliable troubleshooting.
The client reported that after a nightly batch job, a row inserted into demo.t_dba_info (INSERT INTO t_dba_info(name,age) VALUES('zhenxing',20)) could not be found in the database, even though the batch logs showed a successful insert.
Step 1 – Verify the row in the database : Directly query the table on the primary server and confirm that the row is indeed missing.
Step 2 – Determine the time window and parse binlog : In a test environment, the primary server’s binlog files are inspected. The following shell snippet lists the relevant binlog files and searches for the keyword “zhenxing”.
BINLOG_LIST='mysql-bin.000002 mysql-bin.000003 mysql-bin.000004 mysql-bin.000005 mysql-bin.000006 mysql-bin.000007'
for binlog in ${BINLOG_LIST}
do
echo "====== ${binlog}"
mysqlbinlog -vv ${binlog} | grep -iEw "zhenxing"
doneThe search shows that the INSERT statement was recorded, so the next step is to look for any subsequent DELETE or UPDATE operations on that row.
Step 3 – Filter binlog for DELETE/UPDATE on the table :
BINLOG_LIST='mysql-bin.000002 mysql-bin.000003 mysql-bin.000004 mysql-bin.000005 mysql-bin.000006 mysql-bin.000007'
for binlog in ${BINLOG_LIST}
do
echo "====== ${binlog}"
mysqlbinlog --no-defaults --base64-output=decode-rows -vv ${binlog} |
awk '/###/ {if($0~/UPDATE|INSERT|DELETE/)count[$2" "$NF]++} END{for(i in count) print i,"\t",count[i]}' |
column -t | sort -k2nr | grep -i t_dba_info
doneThe output reveals that only mysql-bin.000006 contains two UPDATE statements on the table; all other binlogs contain only INSERTs. Therefore, the investigation focuses on mysql-bin.000006.
Step 4 – Examine the identified binlog : # mysqlbinlog -vv mysql-bin.000006 | less Scrolling through the file shows UPDATE statements, but none target the “zhenxing” row, leaving the cause still unclear.
Step 5 – Exclude special operations :
Check whether the row was deleted with SET SESSION sql_log_bin=off. Querying the replica confirms the row is absent there as well, ruling out this possibility.
Investigate possible DDL actions (TRUNCATE, CREATE, DROP) that could have removed the data.
BINLOG_LIST='mysql-bin.000002 mysql-bin.000003 mysql-bin.000004 mysql-bin.000005 mysql-bin.000006 mysql-bin.000007'
for binlog in ${BINLOG_LIST}
do
echo "====== ${binlog}"
mysqlbinlog ${binlog} | egrep -iEw "truncate|create|drop"
doneThe scan discovers two TRUNCATE statements on t_dba_info in mysql-bin.000004, surrounding the INSERT of the missing row:
#211211 14:52:47 truncate table t_dba_info
#211211 14:53:00 insert into t_dba_info(name,age) values('zhenxing',20)
#211211 14:53:18 truncate table t_dba_infoThus, the row was removed by a subsequent TRUNCATE operation caused by a batch‑process mistake.
Step 6 – Fault summary : The case demonstrates how extensive binlog information can be parsed to pinpoint data‑loss root causes, and highlights the importance of proper binlog configuration (e.g., max_binlog_size=250M, binlog_rows_query_log_events=1) for detailed auditing.
Additional notes: without audit logging, binlog does not capture the IP or user that performed the TRUNCATE, limiting forensic detail.
Binlog parsing tips :
Prefer parsing on a replica to avoid impacting the primary.
First narrow down relevant binlog files, then analyze the specific file in detail.
When parsing DDL, omit the -v flag to speed up processing.
If binlog_rows_query_log_events is enabled, use -vv to see the exact SQL statements.
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
Aikesheng Open Source Community
The Aikesheng Open Source Community provides stable, enterprise‑grade MySQL open‑source tools and services, releases a premium open‑source component each year (1024), and continuously operates and maintains them.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
