牛刀小试MySQL学习—The Binary Log

简介: mysql server有四种类型的日志 (参考的文档是5.5-en.html)The Error Log                           错误日志The General Query Log          一般查询日志The Binary Log                         二进制日志The Slow Query Log                慢查询日志 其中:           错误日志,顾名思义,包含了mysqld启动,关闭和服务器运行时发生了任何错误的信息都会写在error log上面。
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
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
1208 6
|
SQL 运维 关系型数据库
深入探讨MySQL的二进制日志(binlog)选项
总结而言,对MySQL binlogs深度理解并妥善配置对数据库运维管理至关重要;它不仅关系到系统性能优化也是实现高可靠性架构设计必须考虑因素之一。通过精心规划与周密部署可以使得该机能充分发挥作用而避免潜在风险带来影响。
449 6
|
关系型数据库 MySQL 数据管理
Mysql基础学习day03-作业
本内容包含数据库建表语句及多表查询示例,涵盖内连接、外连接、子查询及聚合统计,适用于员工与部门数据管理场景。
256 1
|
SQL 关系型数据库 MySQL
Mysql基础学习day02-作业
本教程介绍了数据库表的创建与管理操作,包括创建员工表、插入测试数据、删除记录、更新数据以及多种查询操作,涵盖了SQL语句的基本使用方法,适合初学者学习数据库操作基础。
294 0
|
SQL 关系型数据库 MySQL
Mysql基础学习day03
本课程为MySQL基础学习第三天内容,主要讲解多表关系与多表查询。内容涵盖物理外键与逻辑外键的区别、一对多、一对一及多对多关系的实现方式,以及内连接、外连接、子查询等多表查询方法,并通过具体案例演示SQL语句的编写与应用。
346 0
|
SQL 关系型数据库 MySQL
Mysql基础学习day01-作业
本教程包含三个数据库表的创建练习:学生表(student)要求具备主键、自增长、非空、默认值及唯一约束;课程表(course)定义主键、非空唯一字段及数值精度限制;员工表(employee)包含自增主键、非空字段、默认值、唯一电话号及日期时间类型字段。每个表的结构设计均附有详细SQL代码示例。
279 0
|
SQL 关系型数据库 MySQL
Mysql基础学习day02
本课程为MySQL基础学习第二天内容,涵盖数据定义语言(DDL)的表查询、修改与删除操作,以及数据操作语言(DML)的增删改查功能。通过具体SQL语句与实例演示,帮助学习者掌握MySQL表结构操作及数据管理技巧。
336 0
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
766 158
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1989 152

推荐镜像

更多