MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。一般来说开启二进制日志大概会有1%的性能损耗(参见MySQL官方中文手册 5.1.24版)。二进制有两个最重要的使用场景:
其一:MySQL Replication在Master端开启binlog,Mster把它的二进制日志传递给slaves来达到master-slave数据一致的目的。
其二:自然就是数据恢复了,通过使用mysqlbinlog工具来使恢复数据。
binlog全称为:binary,翻译就是二进制文件,主要记录了MySQL在进行DML(数据操作语言)过程中的操作日志。在执行SQL语句的过程中,作为使用者,无需关注程序执行的过程,但是当数据库数据丢失,或者需要搭建数据库主从复制时,则此时的binlog日志文件的重要性就展现出来了。
二进制日志包括两类文件:二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件,二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件。
binlog本身是一类二进制文件。二进制文件更省空间,写入速度更快,是无法直接打开来查看的。
因此mysql提供了命令mysqlbinlog进行查看。
一般的statement格式的二进制文件,用下面命令就可以(后面会讲到什么是statement格式)
mysqlbinlog mysql-bin.000001
如果是row格式,加上-v或者-vv参数就行,如
mysqlbinlog -vv mysql-bin.000001
以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。binlog 的主要目的是复制和恢复。
在对数据库的日常操作中,MySQL的操作语法,经常使用的几种MySQL指令类型如下
DQL:数据查询语言,例如 where 、group by 、 orderby
DML:数据操作语言,例如 insert、delete、update等
DPL:事务处理语言,例如begin transaction、commit、rollback
DCL:数据控制语言,例如grant 、revoke控制用户访问权限等
DDL:数据定义语言,例如create、drop删除表、索引添加类等
format | 定义 | 优点 | 缺点 |
---|---|---|---|
statem ent | 记录的是修改SQL语句 | 日志文件小,节约I0,提高性能 | 准确性差,对一些系统函数不能准确复制或不能复制,如now0.uuid0等 |
row | 记录的是每行实际数据的变更 | 准确性强,能准确复制数据的变更 | 日志文件大,较大的网络10和磁盘lO |
mixed | statement和row模式的混合 | 准确性强,文件大小适中 | 有可能发生主从不一致问题 |
业内目前推荐使用的是row模式,准确性高,虽然说文件大,但是现在有SSD和万兆光纤网络,这些磁盘IO和网络IO都是可以接受的。
那么,大家一定想问,为什么不推荐使用mixed模式,理由如下
假设master有两条记录,而slave只有一条记录。
master的数据为
+----+------------------------------------------------------+
| id | n |
+----+------------------------------------------------------+
| 1 | d24c2c7e-430b-11e7-bf1b-00155d016710 |
| 2 | ddd |
+----+------------------------------------------------------+
slave的数据为
+----+-------------------------------------------------------+
| id | n |
+----+-------------------------------------------------------+
| 1 | d24c2c7e-430b-11e7-bf1b-00155d016710 |
+----+-------------------------------------------------------+
当在master上更新一条从库不存在的记录时,也就是id=2的记录,你会发现master是可以执行成功的。而slave拿到这个SQL后,也会照常执行,不报任何异常,只是更新操作不影响行数而已。并且你执行命令show slave status,查看输出,你会发现没有异常。但是,如果你是row模式,由于这行根本不存在,是会报1062错误的。
在 MySQL 5.7.7 之前,默认的格式是 STATEMENT,在 MySQL 5.7.7 及更高版本中,默认值是 ROW。
一般来说开启binlog日志大概会有1%的性能损耗。
需要先输入mysql 进入mysql命令行模式
mysql> show variables like 'log_%'; #注意有分号
+----------------------------------------+---------------------------------------+
| Variable_name | Value |
+----------------------------------------+---------------------------------------+
| log_bin | ON | ------> ON表示已经开启binlog日志
| log_bin_basename | /usr/local/mysql/data/mysql-bin |
| log_bin_index | /usr/local/mysql/data/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| log_error | /usr/local/mysql/data/martin.err |
| log_output | FILE |
| log_queries_not_using_indexes | OFF |
| log_slave_updates | OFF |
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| log_throttle_queries_not_using_indexes | 0 |
| log_warnings | 1 |
+----------------------------------------+---------------------------------------+
如果没有开启
启用binlog,通过配置 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf 或mysql\bin\my.ini 配置文件的 log-bin 选项:
在配置文件中加入 log-bin 配置,表示启用binlog,如果没有给定值,写成 log-bin=,则默认名称为主机名。(注:名称若带有小数点,则只取第一个小数点前的部分作为名称)
[mysqld]
log-bin=my-binlog-name
log-bin后面是binlog的文件名,譬如 log-bin=mysql-bin, 则生成的文件名为:
然后需要重启mysql
也可以通过 SET SQL_LOG_BIN=1 命令来启用 binlog,通过 SET SQL_LOG_BIN=0 命令停用 binlog。启用 binlog 之后须重启MySQL才能生效。
binlog日志包括两类文件:
二进制日志索引文件(文件名后缀为.index)用于记录所有有效的的二进制文件
二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML语句事件
binlog是一个二进制文件集合,每个binlog文件以一个4字节的魔数开头,接着是一组Events:
魔数:0xfe62696e对应的是0xfebin;
Event:每个Event包含header和data两个部分;header提供了Event的创建时间,哪个服务器等信息,data部分提供的是针对该Event的具体信息,如具体数据的修改;
第一个Event用于描述binlog文件的格式版本,这个格式就是event写入binlog文件的格式;
其余的Event按照第一个Event的格式版本写入;
最后一个Event用于说明下一个binlog文件;
binlog的索引文件是一个文本文件,其中内容为当前的binlog文件列表
当遇到以下3种情况时,MySQL会重新生成一个新的日志文件,文件序号递增:
MySQL服务器停止或重启时
使用 flush logs 命令;
当 binlog 文件大小超过 max_binlog_size 变量的值时;
max_binlog_size 的最小值是4096字节,最大值和默认值是 1GB (1073741824字节)。事务被写入到binlog的一个块中,所以它不会在几个二进制日志之间被拆分。
因此,如果你有很大的事务,为了保证事务的完整性,不可能做切换日志的动作,只能将该事务的日志都记录到当前日志文件中,直到事务结束,你可能会看到binlog文件大于 max_binlog_size 的情况。
binlog日志有二种查看方式,具体如下:
这种方法相当于执行sql语句 在图形化工具中也可直接执行
mysql> show binlog events; #只查看第一个binlog文件的内容(全部的 怎么只看部分呢)
mysql> show binlog events ``in 'mysql-bin.000002'``;#查看指定binlog文件的内容
mysql> show binary logs; #获取binlog文件列表
mysql> show master status; #查看当前正在写入的binlog文件
mysql> show binary logs; #获取binlog文件列表
参数名 | 含义 |
---|---|
log bin = (on | off base name) |
sql log bin =( on | off ) |
expire logs days | 指定自动删除二进制日志的时间,即日志过期时间 |
log bin index | 指定mysql-bin.index文件的路径 |
binlog format = [ mixed | row | statement ] | 指定二进制日志基于什么模式记录 |
max binlog size | 指定二进制日志文件最大值 |
binlog cache size | 指定事务日志缓存区大小 |
max binlog cache size | 指定二进制日志缓存最大大小 |
sync binlog = { 0 | n } | 指定写缓冲多少次,刷一次盘 |
SHOW BINLOG EVENTS
[IN 'log_name']
[FROM pos]
[LIMIT [offset,] row_count]
在二进制日志中显示事件。如果未指定,则显示第一个二进制日志。需要特权。'log_name'SHOW BINLOG EVENTSREPLICATION SLAVE
该LIMIT子句与该语句具有相同的语法SELECT。请参见“ SELECT语句”。
mysql> show binlog events limit 10;
+------------------+-------+----------------+-----------+-------------+-----------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-------+----------------+-----------+-------------+-----------------------------------------------------+
| mysql-bin.000001 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.27-log, Binlog ver: 4 |
| mysql-bin.000001 | 123 | Previous_gtids | 1 | 154 | |
| mysql-bin.000001 | 154 | Anonymous_Gtid | 1 | 219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql-bin.000001 | 219 | Query | 1 | 300 | BEGIN |
| mysql-bin.000001 | 300 | Table_map | 1 | 412 | table_id: 392 (cactus_000510.360exthost_examinemgr) |
| mysql-bin.000001 | 412 | Delete_rows | 1 | 8617 | table_id: 392 |
| mysql-bin.000001 | 8617 | Delete_rows | 1 | 12732 | table_id: 392 flags: STMT_END_F |
| mysql-bin.000001 | 12732 | Xid | 1 | 12763 | COMMIT /* xid=530 */ |
| mysql-bin.000001 | 12763 | Anonymous_Gtid | 1 | 12828 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql-bin.000001 | 12828 | Query | 1 | 12917 | BEGIN |
+------------------+-------+----------------+-----------+-------------+-----------------------------------------------------+
10 rows in set (0.13 sec)
Binlog Event 简要分析
从一个最简单的实例来分析Event,包括创建表,插入数据,更新数据,删除数据;
CREATE TABLE `test` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`age` int(11) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into test values(1,22,"小旋锋");
update test set name='whirly' where id=1;
delete from test where id=1;
日志格式为STATEMENT,查看所有的Event
日志格式为ROW时是下面这样,可以发现又有一些不同
以下为普通bash命令 非mysql模式下的了
发出SHOW BINLOG EVENTS with no LIMIT
子句可能会启动一个非常耗时和资源消耗的过程,因为服务器将二进制日志的完整内容(包括服务器修改数据的所有语句)返回给客户端。作为替代SHOW BINLOG EVENTS,使用mysqlbinlog实用程序将二进制日志保存到文本文件中,以供以后检查和分析。
而且 show event命令查看了binlog的简单信息,如何查看执行时间、执行花费的时间等详细信息需要使用工具包中的mysqlbinlog命令。
mysqlbinlog是一个查看mysql二进制日志的工具,可以把mysql上面的所有操作记录从日志里导出,这个工具默认的安装路径为:/usr/local/mysql/bin/mysqlbinlog
可以通过find / -name "mysqlbinlog"
或者which mysqlbinlog
命令查找mysqlbinlog的工具路径。
至于日志文件,参照前面的开启binlog章
基于开始/结束时间:
/usr/local/mysql/bin/mysqlbinlog --start-datetime=``"2013-03-01 00:00:00" --stop-datetime=``"2014-03-21 23:59:59" /usr/local/mysql/``var``/mysql-bin.000007 -r test2.sql
# mysqlbinlog 的执行格式
mysqlbinlog [options] log_file ...
# 查看bin-log二进制文件(shell方式)
mysqlbinlog -v --base64-output=decode-rows /var/lib/mysql/master.000003
# 查看bin-log二进制文件(带查询条件)
mysqlbinlog -v --base64-output=decode-rows /var/lib/mysql/master.000003 \
--start-datetime="2019-03-01 00:00:00" \
--stop-datetime="2019-03-10 00:00:00" \
--start-position="5000" \
--stop-position="20000"
截取结果其中的一段进行分析:
# at 21019
#190308 10:10:09 server id 1 end_log_pos 21094 CRC32 0x7a405abc Query thread_id=113 exec_time=0 error_code=0
SET TIMESTAMP=1552011009/*!*/;
BEGIN
/*!*/;
上面输出包括信息:
position: 位于文件中的位置,即第一行的(# at 21019),说明该事件记录从文件第21019个字节开始
timestamp: 事件发生的时间戳,即第二行的(#190308 10:10:09)
server id: 服务器标识(1)
end_log_pos 表示下一个事件开始的位置(即当前事件的结束位置+1)
thread_id: 执行该事件的线程id (thread_id=113)
exec_time: 事件执行的花费时间
error_code: 错误码,0意味着没有发生错误
type:事件类型Query
发现BINLOG 处的内容我们看不明白。。。_
增加 --base64-output=decode-rows –v
选项解析
(base64-output,可以控制输出语句输出base64编码的BINLOG语句;decode-rows:选项将把基于行的事件解码成一个SQL语句)
/mysql/app/mariadb/bin/mysqlbinlog --no-defaults --database=db --base64-output=decode-rows -v --start-datetime='2019-04-11 00:00:00' --stop-datetime='2019-04-11 15:00:00' mysql-bin.000007 | more
变成人类可以读懂的SQL语句了;
PS: 可以把binlog解析后的内容放到一个文件后,在分析,利用如下脚本
/mysql/app/mariadb/bin/mysqlbinlog --no-defaults --database=db --base64-output=decode-rows -v --start-datetime='2019-04-11 00:00:00' --stop-datetime='2019-04-11 15:00:00' mysql-bin.000007 >/tmp/binlog007.sql
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000002
删binlog的方法很多,有三种是常见的
(1) 使用reset master,该命令将会删除所有日志,并让日志文件重新从000001开始。
(2) 使用命令
PURGE { BINARY | MASTER } LOGS { TO ‘log_name’ | BEFORE datetime_expr }
1
例如
purge master logs to “binlog_name.00000X”
1
将会清空00000X之前的所有日志文件.
(3) 使用–expire_logs_days=N选项指定过了多少天日志自动过期清空。
文章浏览阅读1.5k次,点赞2次,收藏4次。将静态的网页部署到服务器上,首先需要下载一个xftp,帮助我们上传文件;以及它的服务端xshell帮助我们重启服务器1,首先与服务器建立连接2,要想把我们的静态网页发布到服务器上,前提是我们的服务器安装了nignx,完成这些以后把我们本地的网页文件夹上传到/usr/local/nginx/html的路径下3,文件上传成功后,还需要我们修改nignx的配置文件,打开/usr/local/ng..._网页发布
文章浏览阅读2.1w次,点赞8次,收藏10次。我出现这个错误是因为没有加载我的配置文件在这里插入图片描述可以看到我上图打印的是连接我本地的nacos,并且连接超时但实际我的配置文件并不是配置的本地,看下图这就是典型的没有加载解决办法:完成这些就能加载到配置文件了..._no available server
文章浏览阅读1k次。import numpy as npimport tensorflow_core as tffrom tensorflow.keras.layers import Dense, SimpleRNNimport matplotlib.pyplot as pltimport osinput_word = "abcde"w_to_id = {'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4} # 单词映射到数值id的词典id_to_onehot = {0: [1.,._model.fit报错use_multiprocessing=use_multiprocessing
文章浏览阅读152次。1、创建/guanli 目录,在/guanli下创建zonghe 和 jishu 两个目录(一条命令)[root@localhost ~]mkdir -p /guanli/{zonghe,jishu}2、添加组帐号zonghe、caiwu、jishu,GID号分别设置为2001、2002、2003[root@localhost ~]# groupadd -g 2001 zon..._在chapter04的包cn.itcast.chapter04.prsponse
文章浏览阅读362次。串的定义串是字符串的简称。在数据结构中,串是一种在数据元素的组成上具有一定约束条件的线性表,即要求组成线性表的所有数据元素都是字符,所以说串是一个有穷的字符序列。串是由零个或多个字符组成的有限序列,记作s=”s0s1…sn-1”(n≥0),其中s是串名,字符个数n称作串的长度,双撇号括起来的字符序列”s0s1…sn-1”是串的值字符串(String)是由数字、字母、任何其它的符号组成的一串字符。零个字符的串(即:"")称为空串,空串不包含任何字符。值得注意的是:(1)长度为1的空格串" “不等同于_空串是什么都没有字符串吗
文章浏览阅读1.5k次,点赞15次,收藏18次。总之,MathType 7.4是一款功能全面、易于使用的数学公式编辑器,无论是教育、科研还是出版领域,它都能为用户提供强大的支持和便利。当然,作为软件技术支持专家,我很乐意为用户提供关于MathType 7.4的详细信息和支持。_mathtyoe产品密钥
文章浏览阅读6.5k次,点赞4次,收藏3次。当我们改变前端页面传输给后台sql参数时,页面没有显示相应内容也没有显示报错信息时,不能使用联合查询注入和报错注入,这时我们可以考虑是否为基于布尔的盲注。利用页面返回的布尔类型状态,正常或者不正常;我们输入的语句让页面呈现出两种状态,相当于true和false,根据这两种状态可以判断我们输入的语句是否查询成功。布尔盲注就是根据这两种状态,来反推我们输入的条件是真还是假。以sqli-labs-masterless-8关为例_oracle布尔盲注
文章浏览阅读1w次,点赞10次,收藏72次。创建地图是一件比较复杂的工作,ROS利用map_server地图服务器,借助激光雷达和机器人的里程信息来完成这项工作。本篇我们还是利用柳树车库作为默认的地图环境。主要介绍了地图的创建、保存、加载,下一篇尝试配置导航功能包集,并在gazebo仿真环境下完成自定义机器人的自主导航。httpshttpshttpshttps。..._ros建图
文章浏览阅读3.2k次。在Magento中,CMS页、产品页、分类页均可以设置Meta keywords与Meta Description。但在其它页面上如何设置呢?例如今天SEO团队发来文档,要求修改Checkout页、MyAccount页、Login页、Contact页等等的页标题与Meta描述部分。于是第一反应就是用XML来配置.另:在System-Configration-Design-Html-_magento seo suite 自定义 meta description
文章浏览阅读1.3k次。第4章-15 换硬币分析题目解法分析为了实现各个硬币数目>=1,range()函数设定倒序范围,先求五分硬币数目,再求二分硬币数目,最后求一分硬币数目,注意在往下递推求解的过程中,各个硬币数目的条件是>=1,这影响到range(five,0,-1)和if one>=1:题目将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?输入格式:输入在一行中给出待换的零钱数额x∈(8,100)。输出格式:要求按5分、2分和1分硬币的数量依次从大到小的顺序_pta换硬币python
文章浏览阅读1w次,点赞6次,收藏23次。一、查看防火墙状态1、首先查看防火墙是否开启,如未开启,需要先开启防火墙并作开机自启systemctl status firewalld开启防火墙并设置开机自启systemctl start firewalldsystemctl enable firewalld一般需要重启一下机器,不然后面做的设置可能不会生效二、开放或限制端口1、开放端口(1)如我们需要开启XShell连接时需要使用的22端口firewall-cmd --zone=public --add-port=22/tcp _firewall-cmd --zone=public --list-ports
文章浏览阅读6.7k次,点赞10次,收藏73次。日期项目2022/03/04更新实验环境配置视频P6,第八章后所有内容已同步更新!名称项目课程主页图像处理与机器学习B站主页啥都会一点的研究生课程B站视频【北交】图像处理与机器学习人工智能技术探讨群178174903人工智能技术探讨群2571218304人工智能技术探讨群3584723646课程目录及资料(UP已打包整理支持直链下载)章节内容资料第一章 绪论1-1 基本._北京交通大学图像处理与机器视觉实验代码