我想开个网站,网站手机版如何制作,wordpress全局jquery,网络广告策划MySQL内部组件结构 Server层
主要包括连接器、词法分析器、优化器、执行器等#xff0c;涵盖 MySQL 的大多数核心服务功能#xff0c;以及所有的内置函数#xff08;如日期、时间、数学和加密函数等#xff09;#xff0c;所有跨存储引擎的功能都在这一层实现#xff0c…MySQL内部组件结构 Server层
主要包括连接器、词法分析器、优化器、执行器等涵盖 MySQL 的大多数核心服务功能以及所有的内置函数如日期、时间、数学和加密函数等所有跨存储引擎的功能都在这一层实现比如存储过程、触发器、视图等。
引擎层
存储引擎层负责数据的存储和提取。其架构模式是插件式的支持 InnoDB、MyISAM、Memory 等多个存储引 擎。
Innodb底层原理与Mysql日志机制 undo log和redo log属于innodbbin log属于server层。
redo log 写入磁盘过程分析
redo log 从头开始写写完一个文件继续写另一个文件写到最后一个文件末尾就又回到第一个文件开头循环写如下面这个图所示。 write pos 是当前记录的位置一边写一边后移写到第 3 号文件末尾后就回到 0 号文件开头。
checkpoint 是当前要擦除的位置也是往后推移并且循环的擦除记录前要把记录更新到数据文件里。
write pos 和 checkpoint 之间的部分就是空着的可写部分可以用来记录新的操作。如果 write pos 追上checkpoint表示redo log写满了这时候不能再执行新的更新得停下来先擦掉一些记录把 checkpoint 推进一下把数据刷入磁盘文件ibd。
innodb_flush_log_at_trx_commit这个参数控制 redo log 的写入策略它有三种可能取值
设置为0表示每次事务提交时都只是把 redo log 留在 redo log buffer 中数据库宕机可能会丢失数据。
设置为1(默认值)表示每次事务提交时都将 redo log 直接持久化到磁盘数据最安全不会因为数据库宕机丢失数据但是效率稍微差一点线上系统推荐这个设置。
设置为2表示每次事务提交时都只是把 redo log 写到操作系统的缓存page cache里这种情况如果数据库宕机是不会丢失数据的但是操作系统如果宕机了page cache里的数据还没来得及写入磁盘文件的话就 会丢失数据。
对于设置2InnoDB 有一个后台线程每隔 1 秒就会把 redo log buffer 中的日志调用操作系统函数 write 写到文件系统的page cache然后调用操作系统函数 fsync 持久化到磁盘文件。
redo log写入策略参看下图 binlog二进制归档日志
bin log二进制日志记录保存了所有执行过的修改操作语句不保存查询操作。如果 MySQL 服务意外停止可通过二进制日志文件排查用户操作或表结构操作从而来恢复数据库数据。一般来说redo log用于重启mysql时恢复数据bin log用于数据库的数据恢复和主从复制。
MySQL5.7 版本中bin log默认是关闭的8.0版本默认是打开的 redo log和bin log区别
redo log 是 InnoDB 引擎特有的binlog 是 MySQL 的 Server 层实现的所有引擎都可以使用。redo log 是物理日志记录的是“在某个数据页上做了什么修改”binlog 是逻辑日志记录的是这个语句的原始逻辑比如“给 ID2 这一行的 c 字段加 1 ”。redo log 是循环写的空间固定会用完binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个并不会覆盖以前的日志。 binlog 的日志格式
用参数 binlog_format 可以设置binlog日志的记录格式mysql支持三种格式类型
STATEMENT基于SQL语句的复制每一条会修改数据的sql都会记录到master机器的bin-log中这种方式日志量小节约IO开销提高性能但是对于一些执行过程中才能确定结果的函数比如UUID()、 SYSDATE()等函数如果随sql同步到slave机器去执行则结果跟master机器执行的不一样。ROW基于行的复制日志中会记录成每一行数据被修改的形式然后在slave端再对相同的数据进行修改记录下每一行数据修改的细节可以解决函数、存储过程等在slave机器的复制问题但这种方式日志量较 大性能不如Statement。举个例子假设update语句更新10行数据Statement方式就记录这条update语句Row方式会记录被修改的10行数据。MIXED混合模式复制实际就是前两种模式的结合在Mixed模式下MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式也就是在Statement和Row之间选择一种如果sql里有函数或一些在执行时才知道结果的情况会选择Row其它情况选择Statement推荐使用这一种。 binlog写入磁盘机制
binlog写入磁盘机制主要通过 sync_binlog 参数控制默认值是 0。可以类比下redo log相似但是少一个log buffer
为0的时候表示每次提交事务都只 write 到page cache由系统自行判断什么时候执行 fsync 写入磁盘。虽然性能得到提升但是机器宕机page cache里面的 binlog 会丢失。也可以设置为1表示每次提交事务都会执行 fsync 写入磁盘这种方式最安全。还有一种折中方式可以设置为N(N1)表示每次提交事务都write 到page cache但累积N个事务后才 fsync 写入磁盘这种如果机器宕机会丢失N个事务的binlog。 查看 binlog 日志文件
可以用mysql自带的命令工具 mysqlbinlog 查看binlog日志内容文件为二进制无法直接查看
# 查看bin‐log二进制文件命令行方式不用登录mysql mysqlbinlog ‐‐no‐defaults ‐v ‐‐base64‐outputdecode‐rows D:/dev/mysql‐5.7.25‐winx64/data/mysql‐binlog.000007 # 查看bin‐log二进制文件带查询条件 mysqlbinlog ‐‐no‐defaults ‐v ‐‐base64‐outputdecode‐rows D:/dev/mysql‐5.7.25‐winx64/data/mysql‐binlog.000007 start‐datetime2023‐01‐21 00:00:00 stop‐datetime2023‐02‐01 00:00:00 start‐position5000 stop‐position20000binlog日志文件恢复数据
首先bin log如果开启默认是不删除bin log文件将会越来越多不推荐。但是为了防止删库跑路需要结合数据库备份来设置bin log保留天数一般推荐每日备份一次数据库bin log保留大于一天。那么恢复数据库可以用最近的一次全量备份再加上备份时间点之后的binlog来恢复数据。
备份数据库
mysqldump ‐u root 数据库名备份文件名; #备份整个数据库 mysqldump ‐u root 数据库名 表名字备份文件名; #备份整个表 mysql ‐u root test 备份文件名 #恢复整个数据库test为数据库名称需要自己先建一个数据库test查看bin log日志
# at 291SET TIMESTAMP1674833560/*!*/;注意到上述的两行一个代表位置标识一个代表时间戳可以根据上面两个变量来恢复某一段的数据
# 根据位置标识恢复
mysqlbinlog ‐‐no‐defaults ‐‐start‐position219 ‐‐stop‐position701 ‐‐databasetest D:/dev/mysql‐5.7.25‐winx64/data/mysql‐binlog.000009 | mysql ‐uroot ‐p123456 ‐v test # 补充一个根据时间来恢复数据的命令我们找到第一条sql BEGIN前面的时间戳标记
SET TIMESTAMP1674833544 再找到第二条sql COMMIT后面的时间戳标记
SET TIMESTAMP1674833663转成datetime格式 mysqlbinlog ‐‐no‐defaults ‐‐start‐datetime2023‐1‐27 23:32:24 ‐‐stop‐datetime2023‐1‐27 23:34:23 ‐‐databasetest D:/dev/mysql‐5.7.25‐winx64/data/mysql‐binlog.000009 | mysql ‐uroot ‐p123456 ‐v test undo log回滚日志
InnoDB对undo log文件的管理采用段的方式也就是回滚段rollback segment 。每个回滚段记录了 1024 个
undo log segment 每个事务只会使用一个undo log segment。 undo log日志什么时候删除
新增类型的在事务提交之后就可以清除掉了。
修改类型的事务提交之后不能立即清除掉这些日志会用于mvcc。只有当没有事务用到该版本信息时才可以清 除。 错误日志
Mysql还有一个比较重要的日志是错误日志它记录了数据库启动和停止以及运行过程中发生任何严重错误时的相关信息。 通用查询日志
通用查询日志记录用户的所有操作包括启动和关闭MySQL服务、所有用户的连接开始时间和截止时间、发给 MySQL 数据库服务器的所有 SQL 指令等如select、show等无论SQL的语法正确还是错误、也无论SQL执行成功还是失败MySQL都会将其记录下来。
通用查询日志用来还原操作时的具体场景可以帮助我们准确定位一些疑难问题比如重复支付等问题。