MySQL 二进制日志(Binary Log)

朴灿烈づ我的快乐病毒、 2022-08-13 00:40 338阅读 0赞
  1. 同大多数关系型数据库一样,日志文件是MySQL数据库的重要组成部分。MySQL有几种不同的日志文件,通常包括错误日志文件,二进制日志,通用日志,慢查询日志,等等。这些日志可以帮助我们定位mysqld内部发生的事件,数据库性能故障,记录数据的变更历史,用户恢复数据库等等。二进制日志,也叫binary log,是MySQL Server中最为重要的日志之一,本文主要描述二进制日志。

1、MySQL日志文件系统的组成
a、错误日志:记录启动、运行或停止mysqld时出现的问题。
b、通用日志:记录建立的客户端连接和执行的语句。
c、更新日志:记录更改数据的语句。该日志在MySQL 5.1中已不再使用。
d、二进制日志:记录所有更改数据的语句。还用于复制。
e、慢查询日志:记录所有执行时间超过long_query_time秒的所有查询或不使用索引的查询。
f、Innodb日志:innodb redo log

缺省情况下,所有日志创建于mysqld数据目录中。
可以通过刷新日志,来强制mysqld来关闭和重新打开日志文件(或者在某些情况下切换到一个新的日志)。
当你执行一个FLUSH LOGS语句或执行mysqladmin flush-logs或mysqladmin refresh时,则日志被老化。
对于存在MySQL复制的情形下,从复制服务器将维护更多日志文件,被称为接替日志。

2、二进制日志(Binary log)
a、它包含的内容及作用如下:
包含了所有更新了数据或者已经潜在更新了数据(比如没有匹配任何行的一个DELETE)
包含关于每个更新数据库(DML)的语句的执行时间信息
不包含没有修改任何数据的语句,如果需要启用该选项,需要开启通用日志功能
主要目的是尽可能的将数据库恢复到数据库故障点,因为二进制日志包含备份后进行的所有更新
用于在主复制服务器上记录所有将发送给从服务器的语句
启用该选项数据库性能降低1%,但保障数据库完整性,对于重要数据库值得以性能换完整。有些类似于oracle开启归档模式。

b、开启二进制日志的方法及属性
使用—log-bin[=file_name]选项或在配置文件中指定log-bin启动时,mysqld写入包含所有更新数据的SQL命令的日志文件。
对于未给出file_name值, 默认名为-bin后面所跟的主机名。
在未指定绝对路径的情形下,缺省位置保存在数据目录下。
每个二进制日志名会添加一个数字扩展名用于日志老化,因此不支持自定义的扩展名,会被mysql数字扩展名动态替换。
若当前的日志大小达到max_binlog_size,则自动创建新的二进制日志。
对于大的事务,二进制日志会超过max_binlog_size设定的值。也即是事务仅仅写入一个二进制日志。
由是可知,二进制日志文件大小接近,其size不是完全相等,这点不同于oracle。
二进制日志文件会有一个对应二进制日志索引文件,该文件包含所有的二进制日志,其文件名与二进制日志相同,扩展名为.index
二进制索引文件通过—log-bin-index[=file_name]选项来指定
RESET MASTER语句将删除所有二进制日志文件,这将影响到从库。也可以用PURGE MASTER LOGS只删除部分二进制文件。

3、二进制日志相关演示

  1. a、启用二进制日志
  2. --当前环境
  3. root@localhost[(none)]> show variables like '%version%';
  4. +-------------------------+------------------------------+
  5. | Variable_name | Value |
  6. +-------------------------+------------------------------+
  7. | innodb_version | 5.5.39 |
  8. | protocol_version | 10 |
  9. | slave_type_conversions | |
  10. | version | 5.5.39 |
  11. | version_comment | MySQL Community Server (GPL) |
  12. | version_compile_machine | x86_64 |
  13. | version_compile_os | Linux |
  14. +-------------------------+------------------------------+
  15. root@localhost[(none)]> show variables like '%log_bin%';
  16. +---------------------------------+-------+
  17. | Variable_name | Value |
  18. +---------------------------------+-------+
  19. | log_bin | OFF | --该参数用于设定是否启用二进制日志
  20. | log_bin_trust_function_creators | OFF |
  21. | sql_log_bin | ON |
  22. +---------------------------------+-------+
  23. --以下为binary log相关参数
  24. root@localhost[(none)]> show variables like '%binlog%';
  25. +-----------------------------------------+----------------------+
  26. | Variable_name | Value |
  27. +-----------------------------------------+----------------------+
  28. | binlog_cache_size | 32768 |
  29. | binlog_direct_non_transactional_updates | OFF |
  30. | binlog_format | STATEMENT |
  31. | binlog_stmt_cache_size | 32768 |
  32. | innodb_locks_unsafe_for_binlog | OFF |
  33. | max_binlog_cache_size | 18446744073709547520 |
  34. | max_binlog_size | 1073741824 |
  35. | max_binlog_stmt_cache_size | 18446744073709547520 |
  36. | sync_binlog | 0 |
  37. +-----------------------------------------+----------------------+
  38. --当前mysql服务器数据文件的缺省位置
  39. root@localhost[(none)]> show variables like '%datadir%';
  40. +---------------+-----------------+
  41. | Variable_name | Value |
  42. +---------------+-----------------+
  43. | datadir | /var/lib/mysql/ |
  44. +---------------+-----------------+
  45. --停止mysql服务器
  46. suse11b:~ # service mysql stop
  47. Shutting down MySQL.... done
  48. --编辑my.cnf来设定binary log日志位置(注,配置二进制日志路径及文件名后,系统变量log_bin被自动置为on)
  49. suse11b:~ # vi /etc/my.cnf
  50. suse11b:~ # grep -v ^# /etc/my.cnf
  51. [mysqld]
  52. log-error=/tmp/suse11b.err
  53. log_bin=/var/lib/mysql/binarylog/binlog
  54. suse11b:~ # mkdir -p /var/lib/mysql/binarylog
  55. suse11b:~ # chown -R mysql:mysql /var/lib/mysql/binarylog
  56. suse11b:~ # /etc/init.d/mysql start
  57. Starting MySQL.. done
  58. suse11b:~ # ls -hltr /var/lib/mysql/binarylog/*
  59. -rw-rw---- 1 mysql mysql 39 Oct 3 13:41 /var/lib/mysql/binarylog/binlog.index #索引文件
  60. -rw-rw---- 1 mysql mysql 107 Oct 3 13:41 /var/lib/mysql/binarylog/binlog.000001 #日志文件
  61. b、切换日志
  62. suse11b:~ # mysql -uroot -pxxx
  63. root@localhost[(none)]> flush logs;
  64. Query OK, 0 rows affected (0.04 sec)
  65. root@localhost[(none)]> system ls -hltr /var/lib/mysql/binarylog/*
  66. -rw-rw---- 1 mysql mysql 78 Oct 3 13:43 /var/lib/mysql/binarylog/binlog.index
  67. -rw-rw---- 1 mysql mysql 107 Oct 3 13:43 /var/lib/mysql/binarylog/binlog.000002 #切换后产生了000002
  68. -rw-rw---- 1 mysql mysql 147 Oct 3 13:43 /var/lib/mysql/binarylog/binlog.000001
  69. root@localhost[(none)]> system mysqladmin flush-logs #使用mysqladmin命令行工具flush-logs方式切换日志
  70. root@localhost[(none)]> system ls -hltr /var/lib/mysql/binarylog/*
  71. -rw-rw---- 1 mysql mysql 147 Oct 3 13:43 /var/lib/mysql/binarylog/binlog.000001
  72. -rw-rw---- 1 mysql mysql 117 Oct 3 13:45 /var/lib/mysql/binarylog/binlog.index
  73. -rw-rw---- 1 mysql mysql 107 Oct 3 13:45 /var/lib/mysql/binarylog/binlog.000003 #切换后产生了000003
  74. -rw-rw---- 1 mysql mysql 147 Oct 3 13:45 /var/lib/mysql/binarylog/binlog.000002
  75. root@localhost[(none)]> system mysqladmin refresh #使用mysqladmin命令行工具refresh方式切换日志
  76. root@localhost[(none)]> system ls -hltr /var/lib/mysql/binarylog/*
  77. -rw-rw---- 1 mysql mysql 147 Oct 3 13:43 /var/lib/mysql/binarylog/binlog.000001
  78. -rw-rw---- 1 mysql mysql 147 Oct 3 13:45 /var/lib/mysql/binarylog/binlog.000002
  79. -rw-rw---- 1 mysql mysql 156 Oct 3 13:46 /var/lib/mysql/binarylog/binlog.index
  80. -rw-rw---- 1 mysql mysql 107 Oct 3 13:46 /var/lib/mysql/binarylog/binlog.000004 #切换后产生了000004
  81. -rw-rw---- 1 mysql mysql 147 Oct 3 13:46 /var/lib/mysql/binarylog/binlog.000003
  82. c、模拟产生二进制日志及查看内容
  83. root@localhost[(none)]> create database tempdb;
  84. Query OK, 1 row affected (0.00 sec)
  85. root@localhost[(none)]> use tempdb
  86. Database changed
  87. root@localhost[tempdb]> create table tb1(id smallint,val varchar(10));
  88. Query OK, 0 rows affected (0.00 sec)
  89. root@localhost[tempdb]> insert into tb1 values(1,'jack');
  90. Query OK, 1 row affected (0.01 sec)
  91. root@localhost[tempdb]> system strings /var/lib/mysql/binarylog/binlog.000004
  92. bin?8.T
  93. 5.5.39-log
  94. z=.T
  95. tempdb
  96. create database tempdb
  97. tempdb
  98. create table tb1(id smallint,val varchar(10))
  99. tempdb
  100. BEGIN
  101. tempdb
  102. insert into tb1 values(1,'jack')
  103. root@localhost[tempdb]> system more /var/lib/mysql/binarylog/binlog.index
  104. /var/lib/mysql/binarylog/binlog.000001
  105. /var/lib/mysql/binarylog/binlog.000002
  106. /var/lib/mysql/binarylog/binlog.000003
  107. /var/lib/mysql/binarylog/binlog.000004
  108. --使用命令行工具mysqlbinlog直接提取二进制日志的内容
  109. root@localhost[tempdb]> system mysqlbinlog /var/lib/mysql/binarylog/binlog.000004
  110. /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
  111. /*!40019 SET @@session.max_insert_delayed_threads=0*/;
  112. /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
  113. DELIMITER /*!*/;
  114. # at 4
  115. #141003 13:46:39 server id 1 end_log_pos 107 Start: binlog v 4, server v 5.5.39-log created 141003 13:46:39
  116. # Warning: this binlog is either in use or was not closed properly.
  117. BINLOG '
  118. PzguVA8BAAAAZwAAAGsAAAABAAQANS41LjM5LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  119. AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA==
  120. '/*!*/;
  121. # at 107
  122. #141003 14:08:58 server id 1 end_log_pos 194 Query thread_id=1 exec_time=0 error_code=0
  123. SET TIMESTAMP=1412316538/*!*/;
  124. SET @@session.pseudo_thread_id=1/*!*/;
  125. SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
  126. SET @@session.sql_mode=0/*!*/;
  127. SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
  128. /*!\C utf8 *//*!*/;
  129. SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
  130. SET @@session.lc_time_names=0/*!*/;
  131. SET @@session.collation_database=DEFAULT/*!*/;
  132. create database tempdb
  133. /*!*/;
  134. # at 194
  135. #141003 14:09:36 server id 1 end_log_pos 304 Query thread_id=1 exec_time=0 error_code=0
  136. use `tempdb`/*!*/;
  137. SET TIMESTAMP=1412316576/*!*/;
  138. create table tb1(id smallint,val varchar(10))
  139. /*!*/;
  140. # at 304
  141. #141003 14:09:56 server id 1 end_log_pos 374 Query thread_id=1 exec_time=0 error_code=0
  142. SET TIMESTAMP=1412316596/*!*/;
  143. BEGIN
  144. /*!*/;
  145. # at 374
  146. #141003 14:09:56 server id 1 end_log_pos 471 Query thread_id=1 exec_time=0 error_code=0
  147. SET TIMESTAMP=1412316596/*!*/;
  148. insert into tb1 values(1,'jack')
  149. /*!*/;
  150. # at 471
  151. #141003 14:09:56 server id 1 end_log_pos 498 Xid = 25
  152. COMMIT/*!*/;
  153. DELIMITER ;
  154. # End of log file
  155. ROLLBACK /* added by mysqlbinlog */;
  156. /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
  157. /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
  158. --从以上的内容可以看出二进制日志记录了所有操作的DML语句及其开销,以及一些系统环境变量的信息。
  159. d、管理二进制日志
  160. --对于二进制日志,应尽可能保存在安全的位置,与数据分开存储
  161. --使用show binary logs获取二进制日志相关信息
  162. root@localhost[(none)]> help show binary logs;
  163. Name: 'SHOW BINARY LOGS'
  164. Description:
  165. Syntax:
  166. SHOW BINARY LOGS
  167. SHOW MASTER LOGS
  168. Lists the binary log files on the server. This statement is used as
  169. part of the procedure described in [HELP PURGE BINARY LOGS], that shows
  170. how to determine which logs can be purged.
  171. root@localhost[tempdb]> show binary logs;
  172. +---------------+-----------+
  173. | Log_name | File_size |
  174. +---------------+-----------+
  175. | binlog.000001 | 147 |
  176. | binlog.000002 | 147 |
  177. | binlog.000003 | 147 |
  178. | binlog.000004 | 498 |
  179. +---------------+-----------+
  180. show binlog events用于在二进制日志中显示事件。如果未指定'log_name',则显示第一个二进制日志。
  181. root@localhost[(none)]> help show binlog events; --获取帮助信息
  182. Name: 'SHOW BINLOG EVENTS'
  183. Description:
  184. Syntax:
  185. SHOW BINLOG EVENTS
  186. [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
  187. Shows the events in the binary log. If you do not specify 'log_name',
  188. the first binary log is displayed.
  189. root@localhost[(none)]> show binlog events;
  190. +---------------+-----+-------------+-----------+-------------+---------------------------------------+
  191. | Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
  192. +---------------+-----+-------------+-----------+-------------+---------------------------------------+
  193. | binlog.000001 | 4 | Format_desc | 1 | 107 | Server ver: 5.5.39-log, Binlog ver: 4 |
  194. | binlog.000001 | 107 | Rotate | 1 | 147 | binlog.000002;pos=4 |
  195. +---------------+-----+-------------+-----------+-------------+---------------------------------------+
  196. root@localhost[(none)]> show binlog events in 'binlog.000005'; --binlog.000005不存在,所以报错
  197. ERROR 1220 (HY000): Error when executing command SHOW BINLOG EVENTS: Could not find target log
  198. --下面的这个查询中,前面执行的DML在这里均可以看到
  199. root@localhost[tempdb]> show binlog events in 'binlog.000004';
  200. +---------------+-----+-------------+-----------+-------------+-------------------------------------------------------------+
  201. | Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
  202. +---------------+-----+-------------+-----------+-------------+-------------------------------------------------------------+
  203. | binlog.000004 | 4 | Format_desc | 1 | 107 | Server ver: 5.5.39-log, Binlog ver: 4 |
  204. | binlog.000004 | 107 | Query | 1 | 194 | create database tempdb |
  205. | binlog.000004 | 194 | Query | 1 | 304 | use `tempdb`; create table tb1(id smallint,val varchar(10)) |
  206. | binlog.000004 | 304 | Query | 1 | 374 | BEGIN |
  207. | binlog.000004 | 374 | Query | 1 | 471 | use `tempdb`; insert into tb1 values(1,'jack') |
  208. | binlog.000004 | 471 | Xid | 1 | 498 | COMMIT /* xid=25 */ |
  209. +---------------+-----+-------------+-----------+-------------+-------------------------------------------------------------+
  210. root@localhost[tempdb]> show binlog events in 'binlog.000004' from 374;
  211. +---------------+-----+------------+-----------+-------------+------------------------------------------------+
  212. | Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
  213. +---------------+-----+------------+-----------+-------------+------------------------------------------------+
  214. | binlog.000004 | 374 | Query | 1 | 471 | use `tempdb`; insert into tb1 values(1,'jack') |
  215. | binlog.000004 | 471 | Xid | 1 | 498 | COMMIT /* xid=25 */ |
  216. +---------------+-----+------------+-----------+-------------+------------------------------------------------+
  217. root@localhost[tempdb]> show binlog events in 'binlog.000004' from 374 limit 1;
  218. +---------------+-----+------------+-----------+-------------+------------------------------------------------+
  219. | Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
  220. +---------------+-----+------------+-----------+-------------+------------------------------------------------+
  221. | binlog.000004 | 374 | Query | 1 | 471 | use `tempdb`; insert into tb1 values(1,'jack') |
  222. +---------------+-----+------------+-----------+-------------+------------------------------------------------+
  223. d、删除历史日志
  224. --使用purge手动删除指定日志
  225. --使用expire-log-days删除失效日志,设置变量expire_logs_days,删除超出这个变量保留期之前的所有日志被删除
  226. --自动日志删除通常发生在服务器启动以及日志flush
  227. --reset master方式
  228. root@localhost[(none)]> help purge;
  229. Name: 'PURGE BINARY LOGS'
  230. Description:
  231. Syntax:
  232. PURGE { BINARY | MASTER } LOGS
  233. { TO 'log_name' | BEFORE datetime_expr }
  234. Examples:
  235. PURGE BINARY LOGS TO 'mysql-bin.010';
  236. PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26';
  237. root@localhost[tempdb]> purge binary logs to 'binlog.000003';
  238. Query OK, 0 rows affected (0.12 sec)
  239. root@localhost[tempdb]> show binary logs;
  240. +---------------+-----------+
  241. | Log_name | File_size |
  242. +---------------+-----------+
  243. | binlog.000003 | 147 |
  244. | binlog.000004 | 498 |
  245. +---------------+-----------+
  246. root@localhost[tempdb]> system ls -hltr /var/lib/mysql/binarylog/*
  247. -rw-rw---- 1 mysql mysql 147 Oct 3 13:46 /var/lib/mysql/binarylog/binlog.000003
  248. -rw-rw---- 1 mysql mysql 498 Oct 3 14:09 /var/lib/mysql/binarylog/binlog.000004
  249. -rw-rw---- 1 mysql mysql 78 Oct 3 14:23 /var/lib/mysql/binarylog/binlog.index
  250. --使用before子句purge日志,binlog.000003被删除
  251. root@localhost[tempdb]> purge binary logs before '2014-10-03 14:09:56';
  252. Query OK, 0 rows affected (0.02 sec)
  253. root@localhost[tempdb]> show binary logs;
  254. +---------------+-----------+
  255. | Log_name | File_size |
  256. +---------------+-----------+
  257. | binlog.000004 | 498 |
  258. +---------------+-----------+
  259. --Author: Leshami
  260. --Blog : http://blog.csdn.net/leshami
  261. --重置所有日志
  262. --reset master将删除在索引文件中列出所有的日志文件并重置索引文件,最后生成一个新的binlog文件。
  263. --该操作之前先备份binlog至其它位置以备以后需要。
  264. root@localhost[tempdb]> help reset master;
  265. Name: 'RESET MASTER'
  266. Description:
  267. Syntax:
  268. RESET MASTER
  269. Deletes all binary log files listed in the index file, resets the
  270. binary log index file to be empty, and creates a new binary log file.
  271. This statement is intended to be used only when the master is started
  272. for the first time.
  273. root@localhost[tempdb]> reset master;
  274. Query OK, 0 rows affected (0.13 sec)
  275. root@localhost[tempdb]> show binary logs;
  276. +---------------+-----------+
  277. | Log_name | File_size |
  278. +---------------+-----------+
  279. | binlog.000001 | 107 | --reset之后,从000001开始生成全新空日志
  280. +---------------+-----------+
  281. --expire_log系统变量控制二进制日志自动删除的天数。默认值为0,表示“没有自动删除”。启动时和二进制日志循环时可能删除。
  282. root@localhost[tempdb]> show variables like 'expire_log%';
  283. +------------------+-------+
  284. | Variable_name | Value |
  285. +------------------+-------+
  286. | expire_logs_days | 0 |
  287. +------------------+-------+
  288. root@localhost[tempdb]> set expire_logs_days=7; --提示次系统变量为全局变量
  289. ERROR 1229 (HY000): Variable 'expire_logs_days' is a GLOBAL variable and should be set with SET GLOBAL
  290. root@localhost[tempdb]> set global expire_logs_days=7; --设置
  291. Query OK, 0 rows affected (0.01 sec)
  292. root@localhost[tempdb]> select @@expire_logs_days;
  293. +--------------------+
  294. | @@expire_logs_days |
  295. +--------------------+
  296. | 7 |
  297. +--------------------+

鹏城DBA总群

发表评论

表情:
评论列表 (有 0 条评论,338人围观)

还没有评论,来说两句吧...

相关阅读

    相关 MySQL 二进制日志bin-log

    二进制日志文件 MySQL 的二进制日志记录的是所有 MySQL 数据库发生变更的信息,对数据库维护有很大作用。 作用 参考 [MySQL DBA 系统学习(