文件——MySQL技术内幕 InnoDB存储引擎
参数文件#
my.cnf
文件。
mysql --help | grep my.cnf
命令显示了读取的顺序
参数类型#
SHOW VARIABLES
查看所有参数,一直到我这个版本一共有610个参数
参数分为运行期可以改变的动态参数和运行期不能改变的静态参数。通过SET
可以设置这些参数。
@@global
设置的参数在全局范围内生效,@@session
设置的参数在本次会话范围内生效。使用SET
时如果不指定范围,则默认是会话范围。
有些参数只能在会话范围内修改,比如autocommit
;有些参数只能在全局范围内修改,比如什么缓冲区大小,有些则可以在两个范围内修改。
日志文件#
错误日志#
记录所有错误信息的日志,也记录了一些警告信息和正确信息。
慢查询日志#
慢查询日志可以记录系统中消耗时间过长的查询,从而针对性的进行优化。
这个参数指定了超过十秒钟,不包含10秒钟的查询会被认为是慢查询
这两个参数指定了男查询是否开启,并记录到哪个文件中。
在稍老一些的版本中,这两个参数名字可能不同。
这还有一个用来记录没有使用索引的查询的参数。
查询日志#
查询日志记录了所有的查询。
默认是没有开启的,如果我们不需要,就不用开启占用IO性能。这里开启了。
二进制日志#
记录对数据库进行更改的所有操作,有几个用处:
- 方便宕机后数据恢复
- 方便两台服务器进行数据同步
- 审计是否有对数据库进行注入攻击的SQL语句
查看当前binlog文件
尝试修改
修改已经被记录
二进制日志文件只会带来1%的IO性能损耗,这是因为它并不是修改时直接写入磁盘,而是先写入到一个会话范围内的binlog_cache_size
中,等事务提交时再写入。
这是binlog的缓冲区大小
使用缓冲的代价就是容忍宕机时一部分数据丢失的风险。可以使用sync_binlog=1
设置每次同步写二进制日志。
binlog_format
参数指定二进制日志文件的格式
有三种取值
- STATEMENT:记录造成内容修改的SQL语句
- ROW:记录被更改的行整行的情况
- MIXED:混用前面两者
使用STATEMENT
的好处就是它占用空间少,因为它只记录SQL语句,缺点就是如果语句中使用了UUID
这类随机或依赖环境的函数,那么当需要通过二进制日志复制时就会出现数据不一致的问题。
使用ROW
的好处就是它不会出现数据不一致问题,还有什么启用这个就可以开启已提交读隔离级别,因为它相当于在日志中记录了整行修改后的快照。缺点就是占用空间极大。
使用MIXED
会在必要的时候使用ROW记录,其他时候使用STATEMENT记录。必要时候包括:
套接字文件#
在unix下使用套接字连接MySQL需要建立的一个套接字文件。
pid文件#
MySQL启动后会向这个文件中写入自己的进程ID。
可以去data目录中找
表定义文件#
表定义文件存储在datadir
中对应数据库下,扩展名为.frm
。每个表对应一个。这个文件记录了表的结构。视图也有一个.frm
文件。
MySQL8.0开始取消了.frm
文件,这个文件被写入到.idb
文件内部。
InnoDB存储引擎文件#
表空间文件#
InnoDB可以将所有的表数据存储在一个datadir
下名为ibdata1
的表空间文件中。默认大小是10MB,用完会自动增长。
可以通过参数innodb_data_file_path
对其进行设置,可以设置两个表空间文件并分配到不同的磁盘上,使磁盘负载均衡。
InnoDB也可以为每一个表单独建立一个.idb
格式的表空间,并且在我的8.x版本下,这是默认的行为。这个参数控制了是否为每个表单独建立一个表空间文件。
单独表空间文件仅存放表的数据、索引和插入缓冲Bitmap,其余的还是在共享表空间文件中。
重做日志文件#
默认在数据目录下有两个InnoDB重做日志文件,它们记录了InnoDB存储引擎所执行的事务,所以在数据库异常宕机时,它们是InnoDB用来恢复数据库完整性和一致状态的文件。
InnoDB的重做日志以两个为一组,比如默认的两个。
InnoDB会先写组内的第一个文件,满了换成第二个,第二个满了再换成第一个。
重做日志文件太大会带来很长的恢复时间,太小可能会让一个事务多次切换重做日志文件,还会频繁的发生async checkpoint,造成性能抖动。
如果最后的检查点超过了日志文件的容量,那么就需要将脏页列表中的数据刷回磁盘。
InnoDB的重做日志文件只记录和InnoDB引擎相关的事务日志,它记录的不是更新修改的状态,而是每个页的物理情况。
重做日志缓冲写入磁盘时不需要doublewrite
,因为它采用每次写入512字节(扇区最小单位),能够保证写入成功。
innodb_flush_log_at_trx_commit
这个参数用于指定重做日志刷新到磁盘的时机(除了Master中刷入的之外)。
为0代表不会主动刷入,等待Master线程刷入,为1代表事务提交时同步写入磁盘,为2代表事务提交时异步写入磁盘。
只有1能完全保证数据库的持久性。
作者:Yudoge
出处:https://www.cnblogs.com/lilpig/p/15591987.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
欢迎按协议规定转载,方便的话,发个站内信给我嗷~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)