下面是本文的完整攻略:
1. 前置条件
- 拥有一个已经安装好的 MySQL 数据库,且当前数据库需要启用 binlog 功能。
2. 恢复步骤
步骤 1:获取需要恢复的 binlog 文件和对应的位置信息
- 执行以下命令获取所有的 binlog 文件列表:
$ ll /var/lib/mysql | grep -E '^mysql-bin'
- 查阅以下命令获取对应的位置信息,其中的
mysql-bin.00000x
具体对应到上一步中找到的 binlog 文件:
$ mysqlbinlog /var/lib/mysql/mysql-bin.00000x | sed -n '1p;$p'
上述命令中,1p
表示输出第一行,也就是所需 binlog 文件所对应的位置点,而 $p
表示输出最后一行,也就是 binlog 文件中最后一条记录的位置点。
记录下来这两个位置点的值,它们将在后面的步骤中被用到。
步骤 2:停止 MySQL 服务
- 执行以下命令停止 MySQL 服务:
$ service mysqld stop
- 这一步的目的是确保在后续操作时,不会有与 MySQL 数据库文件造成冲突的进程。
步骤 3: 导出数据
- 通过执行以下命令将刚刚记录下来的 binlog 文件从 MySQL 数据库中导出来:
$ mysqlbinlog --start-position=<恢复起始点> --stop-position=<恢复结束点> /var/lib/mysql/mysql-bin.00000x > /home/mysql/mybinlog.sql
上述命令中,<恢复起始点>
和 <恢复结束点>
分别为上一步中获取到的起始位置点和结束位置点。
- 导出的数据存储在
/home/mysql/mybinlog.sql
文件中。
步骤 4:清空 MySQL 数据库
- 在执行下一步操作前,需要将当前 MySQL 数据库中的数据全部清空,以便进行恢复操作。
$ rm -rf /var/lib/mysql/*
步骤 5: 恢复数据
- 执行以下命令将导出的数据恢复到 MySQL 数据库中:
$ mysqlbinlog --no-defaults --database=<数据库名称> /home/mysql/mybinlog.sql | mysql
上述命令中,<数据库名称>
为需要进行恢复操作的数据库名称。
- 至此,操作已经完成。重启 MySQL 服务即可。
示例
假设当前需要恢复的目标数据库名为 testdb
,并且当前已经备份好了这个数据库的 binlog 文件。我们将使用以下示例来演示恢复过程:
- binlog 文件列表如下:
$ ll /var/lib/mysql | grep -E '^mysql-bin'
-rw-rw---- 1 mysql mysql 98304 Apr 18 18:22 mysql-bin.000001
-rw-rw---- 1 mysql mysql 98304 Apr 18 18:23 mysql-bin.000002
-rw-rw---- 1 mysql mysql 98304 Apr 18 18:24 mysql-bin.000003
-rw-rw---- 1 mysql mysql 98304 Apr 18 18:25 mysql-bin.000004
-rw-rw---- 1 mysql mysql 98304 Apr 18 18:26 mysql-bin.000005
- 获取对应的位置点信息:
$ mysqlbinlog /var/lib/mysql/mysql-bin.000001 | sed -n '1p;$p'
#191008 14:21:28 server id 1 end_log_pos 120 Start: binlog v 4, server v 5.6.49-log created 191008 14:21:28 at startup
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
#191008 14:21:31 server id 1 end_log_pos 200 Query thread_id=23 exec_time=0 error_code=0
SET TIMESTAMP=1570546891/*!*/;
SET @@session.pseudo_thread_id=23/*!*/;
...
#191008 14:26:51 server id 1 end_log_pos 65431 Query thread_id=23 exec_time=0 error_code=0
SET TIMESTAMP=1570547211/*!*/;
SET @@session.pseudo_thread_id=23/*!*/;
$ mysqlbinlog /var/lib/mysql/mysql-bin.000005 | sed -n '1p;$p'
#191008 16:19:51 server id 1 end_log_pos 120 Start: binlog v 4, server v 5.6.49-log created 191008 16:19:51 at startup
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
#191008 16:19:55 server id 1 end_log_pos 200 Query thread_id=23 exec_time=0 error_code=0
SET TIMESTAMP=1570553995/*!*/;
SET @@session.pseudo_thread_id=23/*!*/;
...
#191008 16:26:06 server id 1 end_log_pos 65431 Query thread_id=23 exec_time=0 error_code=0
SET TIMESTAMP=1570554366/*!*/;
SET @@session.pseudo_thread_id=23/*!*/;
- 使用如下命令导出 binlog 文件中的数据:
$ mysqlbinlog --start-position=120 --stop-position=65431 /var/lib/mysql/mysql-bin.000004 > /home/mysql/mybinlog.sql
- 清空 MySQL 数据库:
$ rm -rf /var/lib/mysql/*
- 恢复数据:
$ mysqlbinlog --no-defaults --database=testdb /home/mysql/mybinlog.sql | mysql
- 重启 MySQL 服务即可:
$ service mysqld start
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Linux上通过binlog文件恢复mysql数据库详细步骤 - Python技术站