牛刀小试MySQL学习—The Binary Log

本文介绍了MySQL的四种日志类型:错误日志、一般查询日志、二进制日志和慢查询日志,并重点讲解了二进制日志的工作原理、格式及应用场景。
mysql server有四种类型的日志 (参考的文档是5.5-en.html)
The Error Log                           错误日志
The General Query Log          一般查询日志
The Binary Log                         二进制日志
The Slow Query Log                慢查询日志
其中:
          错误日志,顾名思义,包含了mysqld启动,关闭和服务器运行时发生了任何错误的信息都会写在error log上面。如果mysqld通知
表需要自动的检查和修复,也会把记录写在error log上面
          慢查询日志,可以查看mysql服务器中运行比较慢的sql,这个在日常工作中,会经常使用到。官方的,就是日志中包含了一些超过了参数 long_query_time 指定时间的sql statement。和 min_examined_row_limit最小检查行数限制。
        (两个参数,可以使用show variables like 'long_query_time'  查看, long_query_time的最小值和默认值是0和10)
          一般查询日志,是记录了 mysqld正在做的事情,mysql服务器会记录客户端连接和不连接,以及来自客户端的每条sql statement记录信息,当然,如果你想准确得知道客户端到底传了什么东西给 mysqld,这个日志非常的有用,但是它非常影响服务器的性能,所以,一般情况下,它是不开启的
           二进制日志,包含了”events“,这些events描述了数据库的改动,例如表创建的操作和数据的改动。它也包括了一些潜在的改动(例如:用了 一条delete语句,但是什么都没有删除掉),除非使用row-based logging,否则会包含所有改动数据的sql statement。二进制日志有两个重要的用途:

           For replication(这个是mysql replication,主从服务器,以后我会写一篇日志,关于他的介绍和安装配置)。二进制日志会记录master里面所有的statement,然后 slave会接受master的二进制日志,从而根据二进制日志,修改slave服务器上的数据。

           数据库的恢复操作需要the binary log,在对一个备份进行restore之后,记录在二进制日志中的events可以re-executed,这些events可以使数据库进行基于时间点的恢复( Point-in-Time (Incremental) Recovery Using the Binary Log


基本概念和理论讲述完毕,现在自己开始实战演练:

1,开启binary log
在/etc/my.cnf(这个是我对应的测试数据库的位置)添加如下脚本:

  1. log-bin =mysql-bin
  2. log-bin-index=mysql-bin.index
复制代码
    其中,linux系统服务中存储的binary log的文件的前缀和mysql-bin一致,为mysql-bin.000001,

2,进入mysql服务器

  1. mysql> reset master;(重做master日志,日志从mysql-bin.000001日志开始)
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> show master status;(查看master服务器,目前日志记录的位置,开始为107)
  4. +------------------+----------+--------------+------------------+
  5. | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
  6. +------------------+----------+--------------+------------------+
  7. | mysql-bin.000001 |      107 |              |                  |
  8. +------------------+----------+--------------+------------------+
  9. 1 row in set (0.00 sec)
  10. mysql> insert into user values(200);
  11. Query OK, 1 row affected (0.00 sec)
  12. mysql> insert into user values(300);
  13. Query OK, 1 row affected (0.01 sec)
  14. mysql> insert into user values(400);
  15. Query OK, 1 row affected (0.00 sec)
  16. mysql> show master status;(这里的position发生了改变,position为377)
  17. +------------------+----------+--------------+------------------+
  18. | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
  19. +------------------+----------+--------------+------------------+
  20. | mysql-bin.000001 |      377 |              |                  |
  21. +------------------+----------+--------------+------------------+
  22. 1 row in set (0.00 sec)
  23. mysql> show binlog events\G;(这里这记录了上述发生的所有事情)
  24. *************************** 1. row ***************************
  25.    Log_name: mysql-bin.000001
  26.         Pos: 4
  27. Event_type: Format_desc
  28.   Server_id: 1
  29. End_log_pos: 107
  30.        Info: Server ver: 5.5.2-m2-log, Binlog ver: 4
  31. *************************** 2. row ***************************
  32.    Log_name: mysql-bin.000001
  33.         Pos: 107
  34. Event_type: Query
  35.   Server_id: 1
  36. End_log_pos: 197
  37.        Info: use `zsd`; insert into user values(200)
  38. *************************** 3. row ***************************
  39.    Log_name: mysql-bin.000001
  40.         Pos: 197
  41. Event_type: Query
  42.   Server_id: 1
  43. End_log_pos: 287
  44.        Info: use `zsd`; insert into user values(300)
  45. *************************** 4. row ***************************
  46.    Log_name: mysql-bin.000001
  47.         Pos: 287
  48. Event_type: Query
  49.   Server_id: 1
  50. End_log_pos: 377
  51.        Info: use `zsd`; insert into user values(400)
  52. 4 rows in set (0.00 sec)
复制代码
Format_desc:这是每一个binlog文件的头,是每一个binlog文件必有的第一个event,在这个event中,记录了一些诸如binary log格式版本,产生这个event的mysql server      版 本等等.
其中:
Log_name: event所在的binlog名称.这里是在mysql-bin.000001
Pos: event在当前binlog中的位置
Event_type: event的类型
Server_id: event是在哪个server上发生的..
End_log_pos:下一个event的位置.因此当前这个event的长度是End_log_pos-Pos.
Info:直观的可读的关于本条event的信息.

3,执行flush logs;

  1. mysql> flush logs ;
  2. Query OK, 0 rows affected (0.01 sec)
  3. mysql> show master status;(flush logs 会切换日志)
  4. +------------------+----------+--------------+------------------+
  5. | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
  6. +------------------+----------+--------------+------------------+
  7. | mysql-bin.000002 |      107 |              |                  |
  8. +------------------+----------+--------------+------------------+
  9. 1 row in set (0.00 sec)
复制代码

        再次查看show binlog events 里面多了一个行,就是记录刚刚切换flush_log的event
  1. mysql> show binlog events\G;
  2. *************************** 1. row ***************************
  3.    Log_name: mysql-bin.000001
  4.         Pos: 4
  5. Event_type: Format_desc
  6.   Server_id: 1
  7. End_log_pos: 107
  8.        Info: Server ver: 5.5.2-m2-log, Binlog ver: 4
  9. *************************** 2. row ***************************
  10.    Log_name: mysql-bin.000001
  11.         Pos: 107
  12. Event_type: Query
  13.   Server_id: 1
  14. End_log_pos: 197
  15.        Info: use `zsd`; insert into user values(200)
  16. *************************** 3. row ***************************
  17.    Log_name: mysql-bin.000001
  18.         Pos: 197
  19. Event_type: Query
  20.   Server_id: 1
  21. End_log_pos: 287
  22.        Info: use `zsd`; insert into user values(300)
  23. *************************** 4. row ***************************
  24.    Log_name: mysql-bin.000001
  25.         Pos: 287
  26. Event_type: Query
  27.   Server_id: 1
  28. End_log_pos: 377
  29.        Info: use `zsd`; insert into user values(400)
  30. *************************** 5. row ***************************
  31.    Log_name: mysql-bin.000001
  32.         Pos: 377
  33. Event_type: Rotate (这里是使用了flush logs,指定了此事件的类型就为rotate)
  34.   Server_id: 1
  35. End_log_pos: 420
  36.        Info: mysql-bin.000002;pos=4(切换到的日志的位置)
  37. 5 rows in set (0.00 sec)
复制代码
  1. show binlog events \G只能查看第一个日志的events
  2. show binlog events in 'mysql-bin.000003';可以查看具体位置日志的events
复制代码

4,mysqlbinlog可以在shell下查看日志的具体记录
语法:
shell> mysqlbinlog log_file | mysql -h server_name
例子:
  1. [root@www mysql]# bin/mysqlbinlog ./data/mysql-bin.000001
  2. # at 107(这里的107和上面的107如出一辙,只是表现的方式不一样,内容相同)
  3. #120426  4:43:54 server id 1  end_log_pos 197   Query   thread_id=9  exec_time=0error_code=0
  4. use zsd/*!*/;
  5. SET TIMESTAMP=1335429834/*!*/;(这个代表unix的时间戳)
  6. insert into user values(200)
  7. /*!*/;
  8. # at 197
  9. #120426  4:43:58 server id 1  end_log_pos 287   Query   thread_id=9  exec_time=0error_code=0
  10. SET TIMESTAMP=1335429838/*!*/;
  11. insert into user values(300)
  12. /*!*/;
  13. # at 287
  14. #120426  4:44:01 server id 1  end_log_pos 377   Query   thread_id=9  exec_time=0error_code=0
  15. SET TIMESTAMP=1335429841/*!*/;
  16. insert into user values(400)
  17. /*!*/;
  18. # at 377
  19. #120426  4:51:53 server id 1  end_log_pos 420   Rotate to mysql-bin.000002  pos: 4
  20. DELIMITER ;
复制代码
上述的日志,我进行了一些删改,不过这样可以很清楚的看出,binary log记录了数据库改动的信息。

二:Binary  Logging  Formats
Binary log有三种format:
--binlog-format=STATEMENT:基于statement,顾名思义,不管对数据库有没有影响数据的sql statement都会存储在binary log里面
--binlog-format=ROW:基于row,是对表的行数据有影响的sql statement 存储在binary log里面
--binlog-format=MIXED:基于mixed,默认情况下使用statement-based logging,但是某些场合下logging mode会自动转化为 row -based( 这里官方文档的英文没有看懂,什么叫某些场合下自动转化,希望高手能指点一二

     Set The Binary Log Format
     这里有两种设置: GLOBAL和SESSION 一个针对所有的client,一个针对个人的clinet,脚本如下

  1. mysql> SET GLOBAL binlog_format = 'STATEMENT';
  2. mysql> SET GLOBAL binlog_format = 'ROW';
  3. mysql> SET GLOBAL binlog_format = 'MIXED';
  4. mysql> SET SESSION binlog_format = 'STATEMENT';
  5. mysql> SET SESSION binlog_format = 'ROW';
  6. mysql> SET SESSION binlog_format = 'MIXED'
复制代码

官方文档有解释说,在 statement-based replication下,会有些statement具有不可靠性,不能保证可以replicated。 Statement may not be safe to log in statement format.在statement模式下sql statement的不可靠)所以,要避免上述问题,就要使用MySQL's row-based replication
内容概要:文章以“智能网页数据标注工具”为例,深入探讨了谷歌浏览器扩展在毕业设计中的实战应用。通过开发具备实体识别、情感分类等功能的浏览器扩展,学生能够融合前端开发、自然语言处理(NLP)、本地存储与模型推理等技术,实现高效的网页数据标注系统。文中详细解析了扩展的技术架构,涵盖Manifest V3配置、内容脚本与Service Worker协作、TensorFlow.js模型在浏览器端的轻量化部署与推理流程,并提供了核心代码实现,包括文本选择、标注工具栏动态生成、高亮显示及模型预测功能。同时展望了多模态标注、主动学习与边缘计算协同等未来发展方向。; 适合人群:具备前端开发基础、熟悉JavaScript和浏览器机制,有一定AI模型应用经验的计算机相关专业本科生或研究生,尤其适合将浏览器扩展与人工智能结合进行毕业设计的学生。; 使用场景及目标:①掌握浏览器扩展开发全流程,理解内容脚本、Service Worker与弹出页的通信机制;②实现在浏览器端运行轻量级AI模型(如NER、情感分析)的技术方案;③构建可用于真实场景的数据标注工具,提升标注效率并探索主动学习、协同标注等智能化功能。; 阅读建议:建议结合代码实例搭建开发环境,逐步实现标注功能并集成本地模型推理。重点关注模型轻量化、内存管理与DOM操作的稳定性,在实践中理解浏览器扩展的安全机制与性能优化策略。
基于Gin+GORM+Casbin+Vue.js的权限管理系统是一个采用前后端分离架构的企业级权限管理解决方案,专为软件工程和计算机科学专业的毕业设计项目开发。该系统基于Go语言构建后端服务,结合Vue.js前端框架,实现了完整的权限控制和管理功能,适用于各类需要精细化权限管理的应用场景。 系统后端采用Gin作为Web框架,提供高性能的HTTP服务;使用GORM作为ORM框架,简化数据库操作;集成Casbin实现灵活的权限控制模型。前端基于vue-element-admin模板开发,提供现代化的用户界面和交互体验。系统采用分层架构和模块化设计,确保代码的可维护性和可扩展性。 主要功能包括用户管理、角色管理、权限管理、菜单管理、操作日志等核心模块。用户管理模块支持用户信息的增删改查和状态管理;角色管理模块允许定义不同角色并分配相应权限;权限管理模块基于Casbin实现细粒度的访问控制;菜单管理模块动态生成前端导航菜单;操作日志模块记录系统关键操作,便于审计和追踪。 技术栈方面,后端使用Go语言开发,结合Gin、GORM、Casbin等成熟框架;前端使用Vue.js、Element UI等现代前端技术;数据库支持MySQL、PostgreSQL等主流关系型数据库;采用RESTful API设计规范,确保前后端通信的标准化。系统还应用了单例模式、工厂模式、依赖注入等设计模式,提升代码质量和可测试性。 该权限管理系统适用于企业管理系统、内部办公平台、多租户SaaS应用等需要复杂权限控制的场景。作为毕业设计项目,它提供了完整的源码和论文文档,帮助学生深入理解前后端分离架构、权限控制原理、现代Web开发技术等关键知识点。系统设计规范,代码结构清晰,注释完整,非常适合作为计算机相关专业的毕业设计参考或实际项目开发的基础框架。 资源包含完整的系统源码、数据库设计文档、部署说明和毕
MySQL Binary Log主要用于记录对MySQL数据库真正执行更改的所有操作即DML语句,不包含那些没有修改任何数据的语句,像`select`、`show`这样的语句就不会被记录;如需记录那么需要开启全量日志功能 [^2]。 大部分Binary Log的介绍都适用于Replication Server中的Relay Log(中继日志),因为Relay Log的format和Binary Log一致 [^1]。 查看Binary Log的格式可以使用以下命令: ```sql show variables like '%format%'; ``` 示例输出如下: ```plaintext +--------------------------+-------------------+ | Variable_name | Value | +--------------------------+-------------------+ | binlog_format | ROW | +--------------------------+-------------------+ ``` 这里显示`binlog_format`的值为`ROW` [^4]。 开启全量日志功能的方法有两种: #### 永久开启 通过修改配置文件,修改完之后需要重启服务。在`my.cnf`里的`[mysqld]`添加以下(0 - 关闭,1 - 开启): ```plaintext general-log = 1 general-log-file = /GENERAL/LOG/PATH ``` 注意,有时候可能重启之后不会生效,可以执行`flush privileges`再试试 [^2]。 #### 临时开启 临时生效,不用重启: ```sql set global general_log=ON; set global general_log_file=/GENERAL/LOG/PATH; ``` 开启`general log`会将所有到达MySQL Server的SQL语句记录下来。一般不会开启此功能,因为log的量会非常庞大;这个日志对于操作频繁的库,产生的数据量会很快增长,出于对硬盘的保护,可以设置其他存放路径。开启`general log`会耗费数据库5% - 10%的性能,没有什么特殊需求一般不建议打开;个别情况下可能会临时的开一会儿`general log`以供排障使用 [^2]。 使用`mysqlbinlog`命令进行恢复操作时,必须是编号小的先恢复,例如`atguigu-bin.000001`必须在`atguigu-bin.000002`之前恢复。`flush logs`可以生成新的binLog文件,不然这个文件边恢复边变大是不行的。`show binary logs`可以显示有哪些binLog文件 [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值