在mysql中,我们可以通过通用查询日志、慢查询日志、错误日志去定位系统问题。那如果由于误操作而丢失的数据,也可以通过日志进行更新,比如:二进制日志、中继日志、回滚日志、重做日志。
- 二进制日志:主要用于主从服务器之间的数据同步,以及服务器遇到故障时数据的无损失恢复。
- 中继日志:就是主从服务器架构中,从服务器用来存放主服务器二进制日志内容的一个中间文件。从服务器通过读取中继日志的内容,来同步主服务器上的操作。
- 回滚日志:用来存储事务中数据更新前的状态,以便回滚和保持其他事务的数据一致性。
- 重做日志:是为了确保数值持久性、防止数据更新丢失的一种日志。
1、二进制日志(binary log)
二进制日志:主要记录数据库的更新事件,比如创建数据库、更新表中的数据、数据更新所花费的时长等信息。
1、属性二进制日志:FLUSH BINARY LOGS;
2、二进制恢复数据:mysqlbinlog –start-positon=xxx --stop-position=yyy 二进制文件名 | mysql -u 用户 -p
,从位置xxx开始,到yyy截止的所有数据更新操作。
2、查看二进制日志主要分为3种情况,分别是查看当前正在写入的二进制日志、查看所有的二进制日志、查看二进制日志中的所有数据更新事件。
- 查看正在写入的二进制日志名称和当前写入的位置:
SHOW MASTER STATUS;
- 查看所有的二进制日志:
SHOW BINARY LOGS;
- 查看二进制日志中所有数据更新事件的日志:
SHOW BINLOG EVENTS IN 二进制文件名;
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)
重做日志:为了确保数值持久性、防止数据更新丢失的一种日志。
重做日志存储在磁盘,其作用:
- 1.系统遇到故障的恢复过程中,可以修复被未完成的事务修改的数据。
- 2.确保数据完整性,把没来及写在磁盘上的数据更新写到磁盘上。
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.临时表的更新和删除操作
网友评论