mysql之恢复日志

2022-03-29  本文已影响0人  每天进步一点点变成更好的自己

在mysql中,我们可以通过通用查询日志、慢查询日志、错误日志去定位系统问题。那如果由于误操作而丢失的数据,也可以通过日志进行更新,比如:二进制日志、中继日志、回滚日志、重做日志。

1、二进制日志(binary log)

二进制日志:主要记录数据库的更新事件,比如创建数据库、更新表中的数据、数据更新所花费的时长等信息。
1、属性二进制日志:FLUSH BINARY LOGS;
2、二进制恢复数据:mysqlbinlog –start-positon=xxx --stop-position=yyy 二进制文件名 | mysql -u 用户 -p ,从位置xxx开始,到yyy截止的所有数据更新操作。
2、查看二进制日志主要分为3种情况,分别是查看当前正在写入的二进制日志、查看所有的二进制日志、查看二进制日志中的所有数据更新事件。


mysql> PURGE MASTER LOGS TO 'GJTECH-PC-bin.000005'; --删除比指定二进制文件编号小的所有二进制日志文件。
Query OK, 0 rows affected (0.02 sec)

mysql> RESET MASTER;  --删除所有的二进制文件,以释放空间
Query OK, 0 rows affected (0.20 sec)
 
mysql> SHOW BINARY LOGS; --查看二进制,所有二进制日志文件全部被删掉,准备从log_name的.000001为后缀的新的二进制日志文件。
+----------------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+----------------------+-----------+-----------+
| GJTECH-PC-bin.000001 | 156 | No |
+----------------------+-----------+-----------+
1 row in set (0.00 sec)

二进制日志的实例操作:

第一步,数据库备份,把数据库demo中的全部数据,备份到文件 mybackup.sql
H:\>mysqldump -u root -p demo > mybackup.sql
Enter password: *****
第二步,刷新一下日志
mysql> FLUSH BINARY LOGS;
Query OK, 0 rows affected (0.06 sec)
第三步,插入值

mysql> INSERT INTO demo.goodsmaster
-> (
-> itemnumber,
-> barcode,
-> goodsname,
-> salesprice
-> )
-> VALUES
-> (
-> 2,
-> '0002',
-> '笔',
-> 3
-> );
Query OK, 1 row affected (0.03 sec)


mysql> SELECT * FROM demo.goodsmaster;
+------------+---------+-----------+------------+
| itemnumber | barcode | goodsname | salesprice |
+------------+---------+-----------+------------+
| 1 | 0001 | 书 | 89.00 |
| 2 | 0002 | 笔 | 3.00 |
+------------+---------+-----------+------------+
2 rows in set (0.00 sec)
第四步,发现宕机了,数据库无法启动,我们需要重启机器,重新创建数据库,并且恢复数据库。准备从备份文件恢复数据

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)

mysql> SHOW MASTER STATUS;
+----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| GJTECH-PC-bin.000013 | 156 | | | |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)


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: *****

第六步,从保存增量信息的二进制日志文件中恢复增量数据

H:\>mysqlbinlog --start-position=306 "C:\ProgramData\MySQL\MySQL Server 8.0\Data\GJTECH-PC-bin.000012" | mysql -u root -p
Enter password: *****

2、中继日志(relay log)

中继日志:只在主从服务器架构的从服务器上存在。主从服务器架构中,从服务器用来存放主服务器二进制日志内容的一个中间文件。从服务器通过读取中继日志的内容,来同步主服务器上的操作。

搭建好主从服务器之后,中继日志默认会保存在从服务器的数据目录(C:\ProgramData\MySQL\MySQL Server 8.0\Data)下,文件名的格式是:从服务器名 -relay-bin. 序号。
中继日志还有一个索引文件:从服务器名 -relay-bin.index,用来定位当前正在使用的中继日志。

3、回滚日志(undo log)

回滚日志:用来存储事务中数据更新前的状态,以便回滚和保持其他事务的数据一致性。
回滚日志的作用:进行事务回滚。几个变量定义了回滚日志所在的文件夹、是否加密、是否自动截断回收空间和是否有独立的表空间等。


mysql> SHOW VARIABLES LIKE '%innodb_max_undo_log_size%';
+--------------------------+------------+
| Variable_name | Value |
+--------------------------+------------+
| innodb_max_undo_log_size | 1073741824 | --单个回滚日志最大可占用 1G 字节存储空间。
+--------------------------+------------+
1 row in set, 1 warning (0.00 sec)

mysql> SHOW VARIABLES LIKE '%innodb_undo%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| innodb_undo_directory | .\ |  -- 表示回滚日志的存储目录是数据目录。 
| innodb_undo_log_encrypt | OFF | -- 表示回滚日志不加密。
| innodb_undo_log_truncate | ON | -- 表示回滚日志是否自动截断回收,前提是设置了独立表空间。
| innodb_undo_tablespaces | 2 |  -- 表示回滚日志有自己的独立表空间,而不是在共享表空间ibdata文件中。
+--------------------------+-------+
4 rows in set, 1 warning (0.00 sec)

回滚日志的存储目录,以及文件件中的名称等信息:


image.png

4、重做日志(redo log)

重做日志:为了确保数值持久性、防止数据更新丢失的一种日志。

重做日志存储在磁盘,其作用:


mysql> SHOW VARIABLES LIKE '%innodb_log_files_in_group%';
+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| innodb_log_files_in_group | 2 |  --表示有2个重做日志文件
+---------------------------+-------+
1 row in set, 1 warning (0.00 sec)

innodb_log_files_in_group 取值范围1-4:
1.用户创建表的插入操作
2.用户创建表的更新和删除操作
3.临时表的插入操作
4.临时表的更新和删除操作

上一篇下一篇

猜你喜欢

热点阅读