数据库内存和磁盘架构
data目录展示
[root@DESKTOP-9ADRUGP data]# pwd
/usr/local/software/mysql/3312/data
[root@DESKTOP-9ADRUGP data]# ls -l
total 96616
-rw-r----- 1 systemd-coredump input 56 Jul 24 2023 auto.cnf
-rw-r----- 1 systemd-coredump input 3025899 Mar 11 12:03 binlog.000001
-rw-r----- 1 systemd-coredump input 157 Mar 11 13:51 binlog.000002
-rw-r----- 1 systemd-coredump input 180 Mar 11 13:53 binlog.000003
-rw-r----- 1 systemd-coredump input 157 Mar 11 13:54 binlog.000004
-rw-r----- 1 systemd-coredump input 64 Mar 11 13:54 binlog.index
-rw------- 1 systemd-coredump input 1680 Mar 11 12:02 ca-key.pem
-rw-r--r-- 1 systemd-coredump input 1112 Mar 11 12:02 ca.pem
-rw-r--r-- 1 systemd-coredump input 1112 Mar 11 12:02 client-cert.pem
-rw------- 1 systemd-coredump input 1676 Mar 11 12:02 client-key.pem
-rw-r----- 1 systemd-coredump input 196608 Mar 11 13:58 '#ib_16384_0.dblwr'
-rw-r----- 1 systemd-coredump input 8585216 Jul 24 2023 '#ib_16384_1.dblwr'
-rw-r----- 1 systemd-coredump input 3773 Mar 11 13:53 ib_buffer_pool
-rw-r----- 1 systemd-coredump input 12582912 Mar 11 13:57 ibdata1
-rw-r----- 1 systemd-coredump input 12582912 Mar 11 13:54 ibtmp1
drwxr-xr-x 2 systemd-coredump root 4096 Mar 11 13:54 '#innodb_redo'
drwxr-x--- 2 systemd-coredump input 4096 Mar 11 13:54 '#innodb_temp'
drwxr-xr-x 2 systemd-coredump root 4096 Mar 11 12:08 luckyframe
drwxr-x--- 2 systemd-coredump input 4096 Mar 11 12:02 mysql
-rw-r----- 1 systemd-coredump input 28311552 Mar 11 13:57 mysql.ibd
lrwxrwxrwx 1 systemd-coredump input 27 Mar 11 13:54 mysql.sock -> /var/run/mysqld/mysqld.sock
drwxr-xr-x 2 systemd-coredump root 4096 Mar 11 12:08 nacos@002dexample
drwxr-x--- 2 systemd-coredump input 4096 Mar 11 12:02 performance_schema
-rw------- 1 systemd-coredump input 1680 Mar 11 12:02 private_key.pem
-rw-r--r-- 1 systemd-coredump input 452 Mar 11 12:02 public_key.pem
drwxr-xr-x 2 systemd-coredump root 4096 Mar 11 12:08 ruoyi@002dvue@002dpro
-rw-r--r-- 1 systemd-coredump input 1112 Mar 11 12:02 server-cert.pem
-rw------- 1 systemd-coredump input 1680 Mar 11 12:02 server-key.pem
drwxr-x--- 2 systemd-coredump input 4096 Mar 11 12:02 sys
drwxr-xr-x 2 systemd-coredump root 4096 Mar 11 12:08 test
-rw-r----- 1 systemd-coredump input 16777216 Mar 11 13:58 undo_001
-rw-r----- 1 systemd-coredump input 16777216 Mar 11 13:58 undo_002
1.auto.cnf
MySQL启动时,会自动从data_dir/auto.cnf 文件中获取server-uuid值,并将这个值存储在全局变量server_uuid中。如果这个值或者这个文件不存在,那么将会生成一个新的uuid值,并将这个值保存在auto.cnf文件中。这个uuid的作用是在mysql复制时如果发生故障,slave可以通过uuid辨识master的日志。
2.binlog.index
用于记录MySQL产生的binlog日志的具体位置,binlog是MySQL记录所有操作的逻辑日志,主要用于故障恢复和主从同步时使用,由于MySQL数据库是一个多类型存储引擎并存的数据库,binlog就起着一个实例(instance)总体重做信息的角色。
3.*.pem文件
此类文件是在MySQL8.0以后加入的,用于ssl认证登陆
4.ib_buffer_pool
mysql innodb buffer pool 预热,当mysql数据库innodb buffer pool达到一定量级之后再异常宕机重启之后,就会面临一个严峻的问题,就是如何快速预热buffer pool,光靠innodb是不够的,这时就需要将innodb buffer pool存储到存储中,在数据文件中进行备份,在重启时innodb 直接读取此文件,但是要保证innodb版本 page页大小,buffer pool大小前后一致。
innodb_buffer_dump_at_shutdown:默认为关闭OFF。如果开启该参数,停止MySQL服务时,InnoDB将InnoDB缓冲池中的热数据保存到本地硬盘。
innodb_buffer_pool_load_at_startup:默认为关闭OFF。如果开启该参数,启动MySQL服务时,MySQL将本地热数据加载到InnoDB缓冲池中。
innodb_buffer_pool_load_now:默认为关闭OFF。如果开启该参数,停止MySQL服务时,以手动方式将InnoDB缓存池中的热数据保存到本地硬盘。
innodb_buffer_pool_filename:如果开启InnoDB预热功能,停止MySQL服务时,MySQL将InnoDB缓冲池中的热数据保存到数据库根目录中,默认文件名为ib_buffer_pool.
innodb_buffer_pool_load_aborr:默认为关闭OFF。如果开启该参数,即便开启InnoDB预热功能,启动MySQL服务室,MySQL也不会将本地硬盘的热数据加载到InnoDB缓冲池中。
5.#ib_16384_0.dblwr #ib_16384_1.dblwr
Doublewrite buffer是一个存储,InnoDB将页写入InnoDB数据文件适当位置之前,会将缓冲池中页刷新到该存储中。如果操作系统,存储子系统,或者mysqld进程在页写入中途崩溃,InnoDB可以在崩溃恢复中从doublewrite buffer中找到一份好的备份。
虽然数据写了2次,doublewrite buffer不会需要2倍的IO负载和2倍的IO操作。数据将以一个大的连续块写入到doublewrite buffer中,操作系统单次调用fsync()(除非innodb_flush_method被设置为O_DIRECT_NO_FSYNC)。
MySQL8.0.20之前,doublewrite buffer存储在InnoDB 系统表空间中。从MySQL8.0.20开始,doublewrite buffer存储在双写文件中。
doublewrite buffer配置提供以下参数:
innodb_doublewrite:控制是否启用doublewrite buffer。默认启用。设置innodb_doublewrite=0或者启动MySQL服务时加–skip-innodb-doublewrite选项禁用。
如果doublewrite buffer位于支持原子写的Fusion-io设备上,则自动禁用doublewrite buffer,并使用Fusion-io原子写来执行数据文件写。
innodb_doublewrite_dir:8.0.20引入的,定义了InnoDB创建双写文件的目录。如果目录没有指定,双写文件创建在innodb_data_home_dir目录下,没有指定默认在数据目录下。
哈希符’#‘会自动创建在指定目录名前缀,避免与shema名冲突。然而,如果使用了’.‘, ‘#’. 或者’/‘指定了目录前缀,则不在目录名前缀没有哈希符’#'。
innodb_doublewrite_files:参数定义了双写文件的数量。默认情况下,每个缓冲池实例都会创建2个双写文件:一个刷新列表双写文件和一个LRU列表双写文件。
刷新列表双写文件用于从缓冲池刷新列表中刷新页。刷新列表双写文件默认大小是InnoDB page size * doublewrite page bytes.
LRU列表双写文件是用于刷新从缓冲池LRU列表的页。它也包括单个页刷新的槽。LRU列表双写文件默认大小为InnoDB page size * (doublewrite pages + (512 / the number of buffer pool instances)),512是为单个页刷新保留的槽的总数。
至少有2个双写文件。双写文件的最大数量是缓冲池实例的两倍。(缓冲池实例的数量由参数innodb_buffer_pool_instances控制)
双写文件有以下格式:#ib_page_size_file_number.dblwr。例如,下面的双写文件是在一个InnoDB页大小为16KB,单个缓冲池的MySQL实例上创建:
innodb_doublewrite_pages:MySQL8.0.20引入的,控制每个线程双写页的最大数量。如果这个值没有指定,innodb_doublewrite_pages设置为innodb_write_io_threads值。这个参数用于高级性能调优。默认值已经适用于大多数用户。
innodb_doublewrite_batch_size:参数MySQL8.0.20引入的,控制一批写入双写页的数量。这个参数用于高级性能调优。默认值已经适用于大多数用户。
参考:https://dev.mysql.com/doc/refman/8.0/en/innodb-doublewrite-buffer.html
6.ibdata1
innodb默认共享表空间,在不指定下默认所有表共享一个表空间,但是一般生产环境中建议修改默认值,每个表一个表空间
7.ib_logfile*
innodbredo日志,区别于binlog,由于mysql是一个支持多存储引擎共存的数据库,所以innodb redo只记录innodb 存储引擎的重做日志,并且redo是一个物理日志,通过xid记录数据文件位置和binlog中的位置,而binlog记录的是记录mysql全局的变化量,是一个逻辑日志。实际中mysql中由于两阶段commit的存在弱化了innodb redo的管理,也不需要像Oracle中需要备份redo日志,mysql中只需要备份binlog日志即可。
8.ibtmp1
innodb临时表空间
9.undo_001
innodbundo表空间
上面第7个,ib_logfile*,我发现MySQL8.0.30版本里面没看到这个文件,是为啥呢?欢迎评论区指教。