Linux下查用户列表,这三招够用了
分享三种查看Linux系统用户列表的方法,包括读/etc/passwd、用getent以及bash内建的compgen,附踩坑提醒和场景选择建议。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-09-10 22:16:06 MySQL binlog 数据恢复 运维
线上数据库误删这种事,没碰到过也会听说。
真碰上了,手里只有一份三天前的全量备份,剩下的就是 binlog。这时候能不能把数据救回来,基本取决于 binlog 开没开、格式对不对,以及你清不清楚怎么把备份和增量拼起来。
整件事的思路不复杂:先把最近一次全量备份恢复出来,然后把 binlog 里从备份结束到目标时间点之间的操作提取出来,重放一遍。问题是很多细节处理不好,恢复出来的数据会缺或者错。
先从全量备份说起。
你拿到一个 mysqldump 出来的文件,别急着直接导入生产库。先确认文件头和内容,比如 head 看前十行里有没有 CREATE DATABASE 之类的,确保不是空文件或者被截断。我见过有人用 scp 传备份文件,传了一半就开跑,结果恢复一半报错。
恢复全量备份用 mysql -u root -p < full_backup.sql 就行。但这步会覆盖现有库,执行之前最好把当前还能访问的数据先备份一份,哪怕导个表结构也行。如果数据库还挂着服务,先停掉写入,不然恢复过程中新的写入又会产生 binlog,最后时间点对不上。
接下来是 binlog。先确认 binlog_format 是不是 ROW 或者 MIXED。如果还是 STATEMENT,有些语句重放会有问题,比如 SQL 里用了 now() 或者 rand(),当时执行的值和重放时的值不同。可以用 SHOW VARIABLES LIKE 'binlog_format'; 查看。如果不是 ROW 模式,改 my.cnf 里 binlog_format=ROW,然后重启 MySQL。注意改完只对新的 binlog 生效,旧的还是旧格式。
提取增量数据用 mysqlbinlog。时间范围要稍微放宽一点,start-datetime 设到备份完成的时间点往前一点,stop-datetime 设到目标时间点。比如备份完成是 2025-07-22 23:59:59,你想恢复到 2025-07-23 00:00:00,那 start 就设 23:59:59,stop 设 00:00:00。如果备份完成时间不确定,可以往前多拉几分钟,后面再处理重复。
mysqlbinlog --start-datetime="2025-07-22 23:59:59" \
--stop-datetime="2025-07-23 00:00:00" \
/usr/local/mysql/var/mysql-bin.000066 > incremental_changes.sql
这里有个坑:时间按 MySQL 服务器本地时区来,不是你的终端时区。如果服务器时区是 UTC,你按北京时间去卡,会漏数据或者多数据。
可以先 select now() 看一眼服务器当前时间,或者干脆用 binlog 文件里的时间戳来定位。
提取出来的 SQL 文件可能很大,直接 mysql -u root -p < incremental_changes.sql 执行。但要注意,如果里面有 DDL 或者已经执行过的语句,可能会报主键冲突。我习惯先 grep 一下文件里的 INSERT、UPDATE、DELETE 数量,再检查目标表当前数据,必要时把重复的主键去掉,或者用 --force 跳过错误(不推荐,除非你清楚后果)。
恢复完不是完事。对比一下关键表的记录数,抽几条业务数据看看,再检查一下系统表状态。有时候增量没放全,某些关联表会缺数据。
下面给一个完整脚本,可以直接改参数用。把全量备份和增量恢复串起来:
#!/bin/bash
BACKUP_FILE="full_backup.sql"
BINLOG_FILE="/usr/local/mysql/var/mysql-bin.000066"
TARGET_TIME="2025-07-23 00:00:00"
START_TIME="2025-07-22 23:59:59"
echo "正在恢复全量备份..."
mysql -u root -p < $BACKUP_FILE
echo "正在提取增量数据..."
mysqlbinlog --start-datetime="$START_TIME" \
--stop-datetime="$TARGET_TIME" \
$BINLOG_FILE > incremental_changes.sql
echo "正在应用增量数据..."
mysql -u root -p < incremental_changes.sql
echo "恢复完成,请验证数据完整性"
脚本里密码用 -p 会提示输入,别把密码明文写在命令行里,不然 ps 能看到。如果是自动化环境,可以用 --defaults-extra-file 或者环境变量。
常见问题:
binlog 格式不兼容,前面说了,改配置重启。不过旧 binlog 还是老格式,mysqlbinlog 一般能解析,只是重放时注意语句。
提取增量数据为空,先确认 binlog 文件里是否包含目标时间段的数据。用 mysqlbinlog --start-datetime 一个范围看看有没有输出,再查时区。
权限不足,需要 SUPER 权限或者 root。如果只是测试环境,可以用 --skip-grant-tables 临时跳过,生产别这么干。
最后提一下,如果你打算把恢复流程做成自动化接口,比如内部 webhook 触发或者 API 调用,接口最好上 HTTPS。
证书这块可以让 lcjmSSL 自动申请和续期,支持泛域名和 IP 证书,API 也简单。我们之前用 Let's Encrypt 手动续期,经常忘,后来接 lcjmSSL 就不用管了。这不影响恢复本身,但能少一个线上故障源。
上一篇: AI进入证书验证环节后,DNSSEC与ACME自动化暴露的信任链缺口
下一篇: mockgen 安装与使用笔记
分享三种查看Linux系统用户列表的方法,包括读/etc/passwd、用getent以及bash内建的compgen,附踩坑提醒和场景选择建议。
从应急处理到长期修复,整理一次线上连接数打满的完整排查过程。
LEFT()函数的常见用法、边界情况,以及和其他截取函数的简单对比,顺便聊聊线上可能踩的坑。
在处理大量数据库数据时,是否常常需要提取字段的开头部分?本文将为你揭示MySQL LEFT()函数的强大之处,让你告别繁琐的手动操作。学习如何快速截取字符串前几位,并了解其在实际开发中的高效应用,如日志前缀分析、URL域名提取等,提高你的工作效率。
本文深入解析了MySQL配置SSL加密访问的实现步骤,详细阐述了自建证书和CA签发证书两种方法,并提供了详细的示例代码和配置指导,旨在提升数据库连接的安全性。