美文网首页
mysql之恢复日志

mysql之恢复日志

作者: 每天进步一点点变成更好的自己 | 来源:发表于2022-03-29 12:20 被阅读0次

    在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.临时表的更新和删除操作

    相关文章

      网友评论

          本文标题:mysql之恢复日志

          本文链接:https://www.haomeiwen.com/subject/jiqvjrtx.html