MySQL使用bin_log恢复删除的数据

文章展示了如何检查MySQL的binlog状态,创建并删除测试数据库,然后利用binlog进行数据恢复的操作步骤,包括定位删除操作的日志位置,以及执行恢复命令。

1、确认是否开启binlog

mysql> show variables like '%log_bin%';
+---------------------------------+--------------------------+
| Variable_name                   | Value                    |
+---------------------------------+--------------------------+
| log_bin                         | ON                       |
| log_bin_basename                | /data/mysql/binlog       |
| log_bin_index                   | /data/mysql/binlog.index |
| log_bin_trust_function_creators | OFF                      |
| log_bin_use_v1_row_events       | OFF                      |
| sql_log_bin                     | ON                       |
+---------------------------------+--------------------------+

#开启binlog
vim /etc/my.conf
#开启log_bin日志,方便有问题时恢复 
server-id=1
log-bin=mysql-bin
#设置bin_log日志只保存15天 超过这个天数就自动清理
expire_logs_days=15

2、创建测试数据

#库
mysql> create database test_del;
Query OK, 1 row affected (0.00 sec)
#表
mysql> create table test (uid int ,uname varchar(32));
Query OK, 0 rows affected (0.02 sec)
#数据
mysql> insert into test  values (1,'zhangsan');
Query OK, 1 row affected (0.00 sec)

mysql> insert into test  values (2,'zhangsan');
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+------+----------+
| uid  | uname    |
+------+----------+
|    1 | zhangsan |
|    2 | zhangsan |
+------+----------+

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
| test_del           |
+--------------------+
6 rows in set (0.00 sec)

#删除模拟
mysql> drop database test_del;
Query OK, 1 row affected (0.01 sec)

3、进行日志截取

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     1237 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

#首先为了防止干扰,执行 flush logs ,产生一个新binlog 文件。
mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

4、恢复数据

#查看binlog存储位置
mysql> show variables like '%datadir%';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+

##首先要找到数据在哪里被删除了。
cd /var/lib/mysql/
mysqlbinlog mysql-bin.000001 | grep -n  "drop database"
88:drop database test_del

#接下来找位置
#数据需要恢复的起始位置
#数据需要恢复的结束位置

#将binlog变成可查看文件
mysqlbinlog --set-charset=utf8 mysql-bin.000001 > tmp.sql

#这边是创建test_del的起始位置 123 一个at为一个步长
'/*!*/;
# at 123
#220706 10:47:07 server id 1  end_log_pos 154 CRC32 0xa4641180  Previous-GTIDs
# [empty]
# at 154
#220706 10:48:05 server id 1  end_log_pos 219 CRC32 0x88b9783a  Anonymous_GTID  last_committed=0        sequence_number=1       rbr_only=no
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 219
#220706 10:48:05 server id 1  end_log_pos 325 CRC32 0x7628b831  Query   thread_id=2     exec_time=0     error_code=0
SET TIMESTAMP=1657075685/*!*/;
SET @@session.pseudo_thread_id=2/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1436549152/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
create database test_del


#drop删除前的位置 1068 要恢复到的位置
# at 1037
#220706 10:51:31 server id 1  end_log_pos 1068 CRC32 0x40af3269         Xid = 23
COMMIT/*!*/;

# at 1068
#220706 10:52:16 server id 1  end_log_pos 1133 CRC32 0xecfb89df         Anonymous_GTID  last_committed=4        sequence_number=5       rbr_only=no
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;

# at 1133
#220706 10:52:16 server id 1  end_log_pos 1237 CRC32 0x2db0560e         Query   thread_id=2     exec_time=0     error_code=0
SET TIMESTAMP=1657075936/*!*/;
drop database test_del
/*!*/;

# at 1237
#220706 10:52:41 server id 1  end_log_pos 1284 CRC32 0x3e3418b7         Rotate to mysql-bin.000002  pos: 4
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file

#执行恢复
mysqlbinlog -v mysql-bin.000001 --start-position=123 --stop-position=1068 | mysql -uroot -ppwd@123


5、验证恢复

[root@aly mysql]# mysql -uroot -ppwd@123

show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
| test_del           |
+--------------------+

select * from test;
+------+----------+
| uid  | uname    |
+------+----------+
|    1 | zhangsan |
|    2 | zhangsan |
+------+----------+
2 rows in set (0.00 sec)s
<think> 首先,用户的问题是:在MySQL 5.7中打开bin_log的方法。我需要基于提供的引用内容来回答。 关键引用: - 引用[1]:MySQL5.7开启bin-log功能。log-bin参数有两个功能:一是开启二进制日志功能,二是指定日志文件的前缀。可以是绝对路径或相对路径。 - 引用[2]:在docker中创建MySQL5.7并开启bin_log。配置包括log-bin路径、binlog_format、expire_logs_days等。 - 引用[3]:MySQL Linux下开启bin-log日志。提到使用mysqlbinlog工具。 - 引用[4]:解决log-bin相关的问题,如log_bin_trust_function_creators。 - 引用[5]:讨论general_log的大小限制。 用户的问题是专门关于开启bin_log的方法,所以我应该聚焦在引用[1]和[引用2]的内容上。 步骤: 1. **理解开启bin_log的核心配置**:主要是在MySQL配置文件中设置log-bin参数。 2. **配置文件的路径**:在MySQL 5.7中,配置文件通常是my.cnf或my.ini,取决于操作系统。 3. **设置参数**: - 引用[1]说:log-bin参数指定前缀,可以是绝对或相对路径。 - 引用[2]给出了示例配置:log-bin =/var/log/mysql/mysql-bin.log 4. **其他相关参数**: - binlog_format:设置日志格式(STATEMENT, ROW, MIXED)。 - expire_logs_days:设置日志过期时间。 - max_binlog_size:最大日志文件大小。 - server-id:在复制环境中需要设置。 5. **重启MySQL服务**:配置后需要重启MySQL服务使更改生效。 6. **验证**:使用如SHOW VARIABLES LIKE 'log_bin';来检查是否开启。 从引用[4],如果涉及函数或存储过程,可能需要设置log_bin_trust_function_creators=1。 回答结构: - 使用中文回答。 - 结构清晰:先介绍方法,然后步骤。 - 引用内容:在末尾添加引用标识。 - 生成相关问题:在回答结束后添加相关问题。 系统级指令: - 行内数学表达式用$...$(但这里可能不需要)。 - 独立公式用$$...$$(同样,可能不需要)。 - LaTeX语法正确。 - 使用中文。 - 生成相关问题。 - 引用段落末尾添加标识,如[^1]。 用户可见层: - 回答结构清晰,逐步解决问题。 - 保证真实可靠,基于引用。 逐步回答: 1. **介绍**:简要解释bin_log是什么及其重要性。 2. **开启步骤**: a. 编辑MySQL配置文件。 b. 添加log-bin参数。 c. 可选设置其他相关参数。 d. 重启MySQL服务。 e. 验证开启状态。 3. **示例配置**:给出一个示例片段。 4. **注意事项**:如server-id的设置、路径权限等。 5. **引用**:在相关部分末尾添加引用。 相关问题生成: - 基于主题,生成如优化bin_log、设置过期时间等。 完整回答: - 开头:直接回答用户问题。 - 主体:详细步骤。 - 结尾:验证和问题。 最终回答包括: - 配置方法。 - 示例。 - 验证步骤。 - 相关问题。 </think> ### MySQL 5.7 开启 bin_log 的方法 在 MySQL 5.7 中,bin_log(二进制日志)是用于记录数据库操作的关键功能,支持主从复制、数据恢复和审计等场景。开启 bin_log 主要通过修改 MySQL 配置文件实现,以下是完整步骤。过程基于 MySQL 官方文档和引用内容,确保真实可靠。 #### 步骤 1: 编辑 MySQL 配置文件 - **配置文件位置**: MySQL 5.7 的配置文件通常是 `my.cnf` 或 `my.ini`,路径取决于操作系统: - Linux:通常为 `/etc/my.cnf` 或 `/etc/mysql/my.cnf`。 - Windows:通常为 `C:\ProgramData\MySQL\MySQL Server 5.7\my.ini`。 - **修改内容**: 在 `[mysqld]` 部分下添加 `log-bin` 参数,指定 bin_log 文件的前缀和路径: - 如果使用绝对路径(推荐),例如: ```ini [mysqld] log-bin = /var/log/mysql/mysql-bin.log # 开启 bin_log 并指定路径[^1] ``` - 如果使用相对路径,文件会保存在 MySQL 数据目录(如 `/var/lib/mysql`),例如: ```ini [mysqld] log-bin = mysql-bin # 相对路径,文件名为 mysql-bin.000001 等[^1] ``` - 可选添加其他相关参数优化日志行为(如日志格式、大小和过期时间): ```ini binlog_format = mixed # 设置日志格式(STATEMENT/ROW/MIXED)[^2] expire_logs_days = 180 # 日志过期天数,自动清理旧日志[^2] max_binlog_size = 100M # 每个日志文件最大大小[^2] server-id = 1 # 在复制环境中必须设置唯一 ID[^2] ``` #### 步骤 2: 处理权限和路径 - **路径权限**: 确保 MySQL 用户(如 `mysql`)对日志路径有读写权限。例如,在 Linux 下: ```bash sudo mkdir -p /var/log/mysql # 创建目录 sudo chown mysql:mysql /var/log/mysql # 设置所有权 ``` - **特殊场景**: 如果涉及存储过程或函数,添加以下参数避免权限错误: ```ini log_bin_trust_function_creators = 1 # 允许非 SUPER 用户创建函数[^4] ``` #### 步骤 3: 重启 MySQL 服务 - 保存配置文件后,重启 MySQL 服务使更改生效: - Linux: ```bash sudo systemctl restart mysql # 或 service mysql restart ``` - Windows: 通过“服务”管理器重启 MySQL 服务。 #### 步骤 4: 验证 bin_log 是否开启 - 登录 MySQL 命令行: ```bash mysql -u root -p # 输入密码 ``` - 执行 SQL 命令检查状态: ```sql SHOW VARIABLES LIKE 'log_bin'; -- 返回 ON 表示开启 SHOW VARIABLES LIKE 'log_bin%'; -- 查看详细参数 ``` - 使用工具查看日志内容(如 `mysqlbinlog`): ```bash /usr/local/mysql/bin/mysqlbinlog --no-defaults /var/log/mysql/mysql-bin.000001 | less[^3] ``` #### 注意事项 - **空间管理**:bin_log 文件可能占用大量磁盘空间,建议设置 `expire_logs_days` 自动清理旧日志[^2]。 - **性能影响**:开启 bin_log 会轻微增加 I/O 负载,在高并发环境中可通过 `binlog_format=ROW` 优化[^2]。 - **错误排查**:如果启动失败,检查 MySQL 错误日志(通常位于 `/var/log/mysql/error.log`)以排除路径或权限问题。 通过以上步骤,bin_log 将成功开启。确保定期监控日志大小以避免磁盘空间问题[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值