IT评测·应用市场-qidao123.com

标题: MySQL—使用binlog日记恢复数据 [打印本页]

作者: 梦应逍遥    时间: 2025-3-14 03:14
标题: MySQL—使用binlog日记恢复数据
一、binlog日记恢复数据简介

在 MySQL 中,使用二进制日记(binlog)恢复数据是一种常见的用于故障恢复或数据找回的方法。以下是具体的使用步骤:
  1. mysqlbinlog [选项] 二进制日志文件名
复制代码
例如,mysqlbinlog --no-defaults mysql-bin.000001 可以分析 mysql-bin.000001 这个日记文件。常用的选项包罗 --start-datetime 和 --stop-datetime 来指定时间范围,--start-position 和 --stop-position 来指定日记位置范围。例如,只恢复某个时间段内的操纵,可以使用 mysqlbinlog --start-datetime='2024-01-01 00:00:00' --stop-datetime='2024-01-02 00:00:00' mysql-bin.000001 。
5. 将分析后的内容应用到数据库:将 mysqlbinlog 分析后的 SQL 语句应用到目标数据库中,可以将分析结果通过管道直接输入到 mysql 客户端来执行。例如:
  1. mysqlbinlog [选项] 二进制日志文件名
  2. | mysql -u用户名 -p密码
复制代码
假设用户名是 root,密码是 123456,要恢复 mysql-bin.000001 这个日记文件中的数据,可以执行 mysqlbinlog --no-defaults mysql-bin.000001 | mysql -uroot -p123456 。
在使用 binlog 恢复数据时,要特别小心,由于错误的操纵大概会导致数据进一步丢失或损坏。在正式恢复生产情况数据之前,务必在测试情况中举行充分的测试。


二、使用binlog日记恢复数据的步骤

1、前提

在数据库的配置文件中一定要开启binlog日记,否则不会有binlog日记产生。
  1. [mysqld]
  2. log_bin = /var/log/mysql/mysql-bin.log
  3. server-id = 1
复制代码
 
2、可选择的binlog日记配置项


  1. [mysqld]
  2. binlog_format = ROW
复制代码
STATEMENT格式记载了语句的原文,RO格式记载了每行数据的变化,MIXED格式在某些情况下会记载为STATEMENT,在其他情况下会记载为ROW。
确保配置后重启MySQL服务以使更改收效。
留意:在生产情况中更改这些配置必要谨慎,由于它大概会影响数据库的性能和复制


3、使用命令行在体系中举行操纵


配置完成后,可以使用show variables like 'log_bin%';命令查看 binlog 是否已启用。如果Value为ON,则表示 binlog 已经乐成开启。

4、确认binlog日记是否开启

  1. 确认binlog已启用:
  2. SHOW VARIABLES LIKE 'log_bin';
  3. 查看当前的日志文件:
  4. SHOW BINARY LOGS;
  5. 查看binlog的格式(可选):
  6. SHOW VARIABLES LIKE 'binlog_format';
复制代码



5、使用mysqlbinlog工具查看binlog二进制日记文件





三、数据备份和恢复步骤

 步骤一:在sql中插入数据






步骤二:备份数据(正确定位到必要恢复数据的时间点)

模仿生产每天数据备份的的数据
  1. mysqldump -ustc -pppp --master-data=2 --single-transaction -S /opt/sumscope/mysql/mysql.sock test stc > stc.sql
复制代码
备份命令要带上 --master-data=2 --single-transaction
在 MySQL 中,--master-data=2 和 --single-transaction 是 mysqldump 命令常用的参数,它们各自有不同的作用,以下为你具体介绍:


--master-data=2 参数详解


  1. -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=459;
  2. --
  3. -- Current Database: `mydatabase`
  4. --
  5. CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mydatabase` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
  6. USE `mydatabase`;
  7. --
  8. -- Table structure for table `users`
  9. --
  10. DROP TABLE IF EXISTS `users`;
  11. CREATE TABLE `users` (
  12.   `id` int(11) NOT NULL AUTO_INCREMENT,
  13.   `name` varchar(255) NOT NULL,
  14.   PRIMARY KEY (`id`)
  15. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
  16. --
  17. -- Dumping data for table `users`
  18. --
  19. LOCK TABLES `users` WRITE;
  20. /*!40000 ALTER TABLE `users` DISABLE KEYS */;
  21. INSERT INTO `users` (`id`, `name`) VALUES (1,'John');
  22. /*!40000 ALTER TABLE `users` ENABLE KEYS */;
  23. UNLOCK TABLES;
复制代码


--single-transaction 参数详解


--master-data=2 重要用于记载主服务器的二进制日记信息以便后续搭建主从复制,--single-transaction 则用于在不影响数据库正常写入的情况下实现 InnoDB 数据库的一致性备份。

  1. --single-transaction
  2.                       Creates a consistent snapshot by dumping all tables in a
  3.                       single transaction. Works ONLY for tables stored in
  4.                       storage engines which support multiversioning (currently
  5.                       only InnoDB does); the dump is NOT guaranteed to be
  6.                       consistent for other storage engines. While a
  7.                       --single-transaction dump is in process, to ensure a
  8.                       valid dump file (correct table contents and binary log
  9.                       position), no other connection should use the following
  10.                       statements: ALTER TABLE, DROP TABLE, RENAME TABLE,
  11.                       TRUNCATE TABLE, as consistent snapshot is not isolated
  12.                       from them. Option automatically turns off --lock-tables.
  13. --single-transaction选项在执行mysqldump命令时,会将隔离级别设置为
  14. REPEATABLE READ,并开启一个事务。这样,在备份过程中读取的数据是一个逻辑一致的快照,即使在备份过程中有其他会话对数据进行修改,
  15. 也不会影响到备份的数据。这种方式避免了在备份大型数据库时出现长时间的锁定或阻塞现象,对生产环境的业务操作影响较小‌。
  16. --master-data=2
  17. 该选项将二进制日志的位置和文件名写入到输出中。该选项要求有RELOAD权限,并且必须启用二进制日志。如果该选项值等于1,
  18. 位置和文件名被写入CHANGE MASTER语句形式的转储输出,如果你使用该SQL转储主服务器以设置从服务器,从服务器从主服务器二进制日志的正确位置开始。
  19. 如果选项值等于2,CHANGE MASTER语句被写成SQL注释。如果value被省略,这是默认动作。
复制代码



步骤三:在向数据库中插入数据模仿备份到误删除中心的时间段另有其他数据入库 




步骤四:假设不小心删除了数据


 

步骤五:使用mysqlbinlog命令查看binlog日记明文确定删除前的POS的点好截取相关的日记文件


 

步骤六:查看误删时间段的日记信息

  1. /opt/sumscope/mysql/bin/mysqlbinlog binlog.000002  --start-position=备份数据的POS --stop-position=删除数据的POS -vv > redo.biglog
复制代码


步骤七:数据恢复

  1. --先导入备份的数据
  2. source /opt/sumscope/mysql/logs/stc.sql
  3. --再导入binlog中的日志
  4. source /opt/sumscope/mysql/logs/redo.biglog
复制代码




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4