查看记录二进制日志详细信息
SHOW VARIABLES LIKE '%log_bin%'
log_bin 为 ON说明这个参数是开启的,就是说系统是记录了bin log的
log_bin_basename 配置了bin log的文件路径及文件前缀名
log_bin_index 配置了bin log索引文件的路径
查看当前使用日志列表
show master status
根据log_bin_basename的路径查看binlog具体文件
使用binlog日志恢复数据
原理:当数据库发生变化时,binlog会记录数据库中的所有变化;需要恢复的时候可以根据binlog中的开始位置和结束位置还原本部分操作;结束位置一般是数据被破坏或删除之前的位置。
注意:一切操作在本地测试库进行
最好把日志文件拷贝出来,到本地库恢复,因为这个文件记录当前数据库连接下所有库的操作,防止影响其他库的正常数据,所以最好将数据恢复到本地,然后同步回生产库
恢复时需要在binlog中找到两个位置:
- 数据恢复的起始位置
- 数据恢复的结束位置
通过mysqlbinlog将binlog转为sql,以方便查询具体位置
如果没有配置Mysql环境变量 需要进入mysql的安装路径bin目录下 执行命令
将binlog转为sql
mysqlbinlog --set-charset=utf-8 /Users/yuzhenhua/Desktop/iZ8vb9b97xf7mvZ-bin.000003 >data.sql
导出某段时间
mysqlbinlog --start-datetime="2022-09-09 09:00:00" --stop-datetime="2022-09-09 11:00:00" --base64-output=decode-rows -vv /Users/yuzhenhua/Desktop/iZ8vb9b97xf7mvZ-bin.000003 >data.sql
通过mysqlbinlog执行恢复操作
通过偏移量数据修复
mysqlbinlog /Users/yuzhenhua/Desktop/iZ8vb9b97xf7mvZ-bin.000003 --start-position=59571111 --stop-position=93031069 | mysql -f -u 账号 -p密码
/Users/yuzhenhua/Desktop/iZ8vb9b97xf7mvZ-bin.000003 要操作binlog文件
--start-position=59571111 数据恢复的起始位置
--stop-position=93031069 数据恢复的结束位置
-f 遇到错误时强制执行
mysql -uroot -p123456 数据恢复需要登录数据库
-
在
mysqlbinlog
命令中使用--database
选项(部分情况适用)- 基本原理:
- 当你的二进制日志格式是基于语句(Statement - based)或者混合模式(Mixed - based)时,
--database
选项可以帮助你筛选出只与指定数据库相关的操作。例如,如果你想恢复数据库test_db
,可以使用命令 mysqlbinlog --database = 数据库名 /Users/yuzhenhua/Desktop/iZ8vb9b97xf7mvZ - bin.000003 --start - position=59571111 --stop - position=93031069 | mysql - f - u 账号 - p密码
- 当你的二进制日志格式是基于语句(Statement - based)或者混合模式(Mixed - based)时,
- 局限性:
- 对于基于行(Row - based)的二进制日志格式,
--database
选项可能不会按照你期望的方式工作。因为在基于行的格式中,日志记录的是每行数据的变化,可能不会明确区分是哪个数据库的操作,所以这种情况下可能无法精准地只恢复指定数据库的内容。
- 对于基于行(Row - based)的二进制日志格式,
- 基本原理:
- 通过解析二进制日志内容手动筛选(更灵活但复杂)
- 查看日志内容:
- 首先使用
mysqlbinlog
工具查看二进制日志内容,例如mysqlbinlog /Users/yuzhenhua/Desktop/iZ8vb9b97xf7mvZ - bin.000003
。在日志内容中,你可以找到与数据库操作相关的记录,如Query
事件中会包含执行的 SQL 语句,其中会有数据库名称相关的信息。
- 首先使用
- 手动提取相关操作:
- 根据数据库名称来手动提取与要恢复的数据库相关的操作。例如,如果要恢复数据库
test_db
,你需要在日志中找到所有涉及test_db
的INSERT
、UPDATE
、DELETE
等操作的记录。这可能需要一些脚本或者文本处理工具来辅助完成。比如,在 Linux 环境下可以使用grep
命令来筛选包含test_db
的行,如mysqlbinlog /Users/yuzhenhua/Desktop/iZ8vb9b97xf7mvZ - bin.000003 | grep test_db
,然后再对筛选后的内容进行进一步分析,确定哪些是需要恢复的操作,并将这些操作重新应用到数据库中。
- 根据数据库名称来手动提取与要恢复的数据库相关的操作。例如,如果要恢复数据库
- 查看日志内容: