二进制日志主要记录数据库的更新事件,比如创建数据表、更新表中的数据、数据更新所花费的时长等信息。通过这些信息,我们可以再现数据更新操作的全过程。
使用案例
1.查看二进制文件:查看二进制日志主要有 3 种情况:
查看当前正在写入的二进制日志;查看当前写入的日志文件和位置;
mysql> SHOW MASTER STATUS;
+----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| GJTECH-PC-bin.000011 | 2207 | | | |
+----------------------+----------+--------------+------------------+-------------------+ -- 当前正在写入的二进制日志是“GJTECH-PC-bin.000011”,当前的位置是2207。
1 row in set (0.00 sec)
查看所有的二进制日志;
SHOW BINARY LOGS;
查看二进制日志中的所有数据更新事件;
SHOW BINLOG EVENTS IN 二进制文件名;
刷新二进制文件:关闭服务器正在写入的二进制日志文件,并重新打开一个新文件,文件名的后缀在现有的基础上加 1。
FLUSH BINARY LOGS;
用 mysqlbinlog
工具进行数据恢复:
mysqlbinlog –start-positon=xxx –end-position=yyy 二进制文件名 | mysql -u 用户 -p
执行二进制日志中从位置 xxx 开始,到 yyy 截止的所有数据更新操作。这里的截止位置也可以不写,意思是从位置 xxx 开始,执行二进制文件中的所有数据更新操作。
删除二进制文件:
mysql> RESET MASTER;
Query OK, 0 rows affected (0.20 sec)
mysql> SHOW BINARY LOGS;
+----------------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+----------------------+-----------+-----------+
| GJTECH-PC-bin.000001 | 156 | No |
+----------------------+-----------+-----------+
1 row in set (0.00 sec)
通过 SQL 语句,删除比指定二进制日志文件编号小的所有二进制日志文件:
mysql> PURGE MASTER LOGS TO 'GJTECH-PC-bin.000005';
Query OK, 0 rows affected (0.02 sec)
业务场景
利用日志,完成无损失的数据恢复和主从服务器之间的数据同步。
假设数据库 demo 中有一个商品信息表(demo.goodsmaster),先对数据库 demo 做了一个全量备份。所谓的全量备份,就是指对数据库中存储的全部数据进行备份。备份完成之后,又在商品信息表中插入了新数据。这个时候,数据库 demo 出现异常,数据全部丢失。现在咱们需要把所有的数据,包括备份前的数据和备份之后新插入的数据都恢复回来。介绍下具体的操作步骤:
第一步,做数据库备份
使用 MySQL 的数据备份工具 mysqldump(在安装的mysql的bin目录下进行执行):
SQL:mysqldump -u 用户 -p 密码 数据库 > 备份文件
示例:在指定文件下执行命令
H:\>mysqldump -u root -p demo > mybackup.sql
Enter password: *****
第二步,用“FLUSH BINARY LOGS;”语句刷新一下日志。
mysql> FLUSH BINARY LOGS;
Query OK, 0 rows affected (0.06 sec)
第三步,给商品信息表插入一条新的数据记录“笔”
假设这个时候,系统突然宕机,数据库无法启动,为了使系统恢复正常,我们重启机器,重新创建数据库,并且需要进行数据恢复。
第四步,准备从备份文件恢复数据:
每当服务器启动、刷新二进制日志或者二进制日志大小超过系统变量 max_binlog_size 指定的值时,系统就会生成一个新的二进制日志文件;查看一下机器上的二进制日志文件,以确定哪个文件是我们正在使用的
mysql> SHOW BINARY LOGS;
+----------------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+----------------------+-----------+-----------+
| GJTECH-PC-bin.000005 | 179 | No |
| GJTECH-PC-bin.000006 | 113316452 | No |
| GJTECH-PC-bin.000007 | 12125 | No |
| GJTECH-PC-bin.000008 | 1544 | No |
| GJTECH-PC-bin.000009 | 207 | No |
| GJTECH-PC-bin.000010 | 1758 | No |
| GJTECH-PC-bin.000011 | 2207 | No |
| GJTECH-PC-bin.000012 | 462 | No |
+----------------------+-----------+-----------+
12 rows in set (0.01 sec)
然后刷新一下,重新生成日志文件,避免在操作的时候又写入:
mysql> FLUSH BINARY LOGS;
Query OK, 0 rows affected (0.08 sec)
删除并重建一个数据库 demo,演示一下如何使用二进制日志恢复数据。
mysql> DROP DATABASE demo;
Query OK, 1 row affected (0.07 sec)
mysql> CREATE DATABASE demo;
Query OK, 1 row affected (0.01 sec)
第五步,从备份恢复数据:
mysql -u 用户 -p 密码 数据库名称 < 备份文件
示例:
H:\>mysql -u root -p demo<mybackup.sql
Enter password: *****
第六步,从保存增量信息的二进制日志文件“GJTECH-PC-bin.000012
”中恢复增量数据
通过查看二进制日志中的事件,会发现,写入第二条记录的时候,MySQL 使用了一个事务操作,起始位置是 306,截止位置是 462。这样,就可以用 mysqlbinlog
工具进行数据恢复了。日志名称是“C:\ProgramData\MySQL\MySQL Server 8.0\Data\GJTECH-PC-bin.000012”,读取日志的起始位置是 306。
H:\>mysqlbinlog --start-position=306 "C:\ProgramData\MySQL\MySQL Server 8.0\Data\GJTECH-PC-bin.000012" | mysql -u root -p
Enter password: *****
然后这样数据就恢复完毕了。
未经允许不得转载:任鹏个人博客 » MySQL二进制日志(Binary Log)
最新评论
Forex wiki. https://lt.forex-stock-bitcoin-brokers.com
Magnificent items from you, man. I have take note your stuff
Following on from the 3rd March Meetings held by economic de
It is remarkable, rather valuable message dfgdlfg2131.32
一般都会有一个沙盒期的,过了沙盒期就会慢慢放出来
百度不收录是应为是新站的原因吗?
The spike in consumer prices that left inflation at a four-d