1.innodb存储引擎文件组织
[root@mysql8 ~]# ps -ef | grep mysqld
mysql 18070 1 0 14:35 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysql/mysql_3306/my_3306.cnf
mysql 19690 18070 4 14:35 ? 00:00:05 /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql_3306/my_3306.cnf --basedir=/usr/local/mysql --datadir=/data/mysql/mysql_3306/data --plugin-dir=/usr/local/mysql/lib/plugin --log-error=/data/mysql/mysql_3306/logs/error.log --open-files-limit=65535 --pid-file=mysql_3306.pid --socket=/data/mysql/mysql_3306/tmp/mysql_3306.sock --port=3306
root 19822 19760 0 14:37 pts/2 00:00:00 grep --color=auto mysqld
根据进程查看数据文件位置
datadir=/data/mysql/mysql_3306/data
[root@mysql8 ~]# cd /data/mysql/mysql_3306/data/
[root@mysql8 data]# ll
total 7376968
-rw-r----- 1 mysql mysql 56 Aug 4 11:04 auto.cnf
-rw------- 1 mysql mysql 1676 Aug 4 11:04 ca-key.pem
-rw-r--r-- 1 mysql mysql 1112 Aug 4 11:04 ca.pem
-rw-r--r-- 1 mysql mysql 1112 Aug 4 11:04 client-cert.pem
-rw------- 1 mysql mysql 1680 Aug 4 11:04 client-key.pem
-rw-r----- 1 mysql mysql 4241 Sep 2 22:06 ib_buffer_pool
-rw-r----- 1 mysql mysql 1073741824 Sep 3 14:35 ibdata1
-rw-r----- 1 mysql mysql 2147483648 Sep 3 14:35 ib_logfile0
-rw-r----- 1 mysql mysql 2147483648 Aug 4 11:04 ib_logfile1
-rw-r----- 1 mysql mysql 2147483648 Aug 4 11:04 ib_logfile2
-rw-r----- 1 mysql mysql 12582912 Sep 3 14:35 ibtmp1
-rw-r----- 1 mysql mysql 6859 Aug 28 11:54 innodb_status.18767
-rw-r----- 1 mysql mysql 6950 Sep 3 14:38 innodb_status.19690
drwxr-x--- 2 mysql mysql 187 Sep 3 14:35 #innodb_temp
drwxr-x--- 2 mysql mysql 143 Aug 4 11:04 mysql
-rw-r----- 1 mysql mysql 6 Sep 3 14:35 mysql_3306.pid
-rw-r----- 1 mysql mysql 25165824 Sep 3 14:35 mysql.ibd
drwxr-x--- 2 mysql mysql 4096 Aug 4 11:04 performance_schema
-rw------- 1 mysql mysql 1680 Aug 4 11:04 private_key.pem
-rw-r--r-- 1 mysql mysql 452 Aug 4 11:04 public_key.pem
-rw-r--r-- 1 mysql mysql 1112 Aug 4 11:04 server-cert.pem
-rw------- 1 mysql mysql 1680 Aug 4 11:04 server-key.pem
drwxr-x--- 2 mysql mysql 28 Aug 4 11:04 sys
drwxr-x--- 2 mysql mysql 102 Aug 19 17:00 test
[root@mysql8 logs]# ll
total 284
-rw-r----- 1 mysql mysql 250217 Sep 3 14:58 error.log
-rw-r----- 1 mysql mysql 494 Aug 19 16:51 mysql-bin.000001
-rw-r----- 1 mysql mysql 399 Aug 19 20:05 mysql-bin.000002
-rw-r----- 1 mysql mysql 218 Aug 26 19:18 mysql-bin.000003
-rw-r----- 1 mysql mysql 195 Aug 31 14:04 mysql-bin.000004
-rw-r----- 1 mysql mysql 218 Aug 31 19:26 mysql-bin.000005
-rw-r----- 1 mysql mysql 218 Sep 2 22:06 mysql-bin.000006
-rw-r----- 1 mysql mysql 195 Sep 3 14:35 mysql-bin.000007
-rw-r----- 1 mysql mysql 315 Sep 3 14:35 mysql-bin.index
-rw-r----- 1 mysql mysql 4029 Sep 3 14:35 slow.log
slow.log:记录慢查询日志,当一条语句执行时间超过在配置参数long_query_time中指定的值时,这条语句会被记录在这个文件中。
error.log:记录一些系统启动和运行时的错误或者警告信息,通过配置参数log_error来设置。
general.log:会记录在数据库中执行的语句,经常用来追踪问题,但会影响性能,所以一般不会打开,只有调试的时候才会开启,QPS较低可以考虑开启。直接开启:set global general_log = ON;(永久修改需要在my.cnf的【mysqld】中添加:general_log = 1)
在mysql数据库系统中,一个数据库就是一个目录,如果在datadir下创建一个目录那么在mysql命令行中执行show databases也会显现出来。需要注意的是,这个问题在8.0已经被解决,只会出现在5.X版本
mysql目录,这个目录实际上是mysql的一些系统表比如权限和用户等。这个表在mysql8.0时发生了很大的变化。
mysql 5.7
mysql 8.0

2.三个数据库
information_schema
MySQL自带数据库,提供了访问数据库元数据的方式,也就是通常所说的Metadata。在MySQL中,information_schema被看作是一个信息数据库,其中包含了关于MySQL服务器维护的所有其他数据库的信息,比如数据库名,数据库表,数据库列的数据类型和访问权限等。在这个数据库中,有数个只读表。他们实际上只是视图,而不是基本表,因此无法看到与之相关的任何文件。需要查看它所包含的信息,只需要进入这个数据库然后执行show create table tablename即可。这样就可以看到每个表的功能了。
缺点:每次查找都会现场统计相应的信息,这需要将相应的信息加载到内存中,做成内存表,然后将信息返回给客户端。如果表比较多这些语句会执行的非常慢,造成一些不可预估的风险。
mysql> show tables;
+---------------------------------------+
| Tables_in_information_schema |
+---------------------------------------+
| CHARACTER_SETS |
| COLLATIONS |
| COLLATION_CHARACTER_SET_APPLICABILITY |
| COLUMNS |
| COLUMN_PRIVILEGES |
| COLUMN_STATISTICS |
| ENGINES |
| EVENTS |
| FILES |
| INNODB_BUFFER_PAGE |
| INNODB_BUFFER_PAGE_LRU |
| INNODB_BUFFER_POOL_STATS |
| INNODB_CACHED_INDEXES |
| INNODB_CMP |
| INNODB_CMPMEM |
| INNODB_CMPMEM_RESET |
| INNODB_CMP_PER_INDEX |
| INNODB_CMP_PER_INDEX_RESET |
| INNODB_CMP_RESET |
| INNODB_COLUMNS |
| INNODB_DATAFILES |
| INNODB_FIELDS |
| INNODB_FOREIGN |
| INNODB_FOREIGN_COLS |
| INNODB_FT_BEING_DELETED |
| INNODB_FT_CONFIG |
| INNODB_FT_DEFAULT_STOPWORD |
| INNODB_FT_DELETED |
| INNODB_FT_INDEX_CACHE |
| INNODB_FT_INDEX_TABLE |
| INNODB_INDEXES |
| INNODB_METRICS |
| INNODB_SESSION_TEMP_TABLESPACES |
| INNODB_TABLES |
| INNODB_TABLESPACES |
| INNODB_TABLESPACES_BRIEF |
| INNODB_TABLESTATS |
| INNODB_TEMP_TABLE_INFO |
| INNODB_TRX |
| INNODB_VIRTUAL |
| KEYWORDS |
| KEY_COLUMN_USAGE |
| OPTIMIZER_TRACE |
| PARAMETERS |
| PARTITIONS |
| PLUGINS |
| PROCESSLIST |
| PROFILING |
| REFERENTIAL_CONSTRAINTS |
| RESOURCE_GROUPS |
| ROUTINES |
| SCHEMATA |
| SCHEMA_PRIVILEGES |
| STATISTICS |
| ST_GEOMETRY_COLUMNS |
| ST_SPATIAL_REFERENCE_SYSTEMS |
| ST_UNITS_OF_MEASURE |
| TABLES |
| TABLESPACES |
| TABLE_CONSTRAINTS |
| TABLE_PRIVILEGES |
| TRIGGERS |
| USER_PRIVILEGES |
| VIEWS |
| VIEW_ROUTINE_USAGE |
| VIEW_TABLE_USAGE |
+---------------------------------------+
66 rows in set (0.00 sec)
performance_schema
这个数据库是在mysql5.5后新增的,命名为performance_schema,这是一个针对性能的数据库,主要用于收集数据库服务器性能参数。performance_schema提供如下功能:
- 提供进程等待详细信息,包括锁互斥变量,文件信息等。
- 保存历史事件汇总信息,为判断mysql性能作出详细依据。
- 添加或删除监控事件点非常容易,并可以随意改变mysql服务器的监控周期。
sys
sys数据库是在mysql5.7后新加入的系统信息库。类似于oracle中的动态性能视图,这个库可以帮助DBA了解系统的元数据信息,也可以解决性能瓶颈,相当于通过视图的形式把information_schema和perfomance_schema结合起来,得到更易理解的结果。
以下为innodb存储引擎文件组织结构示意图:
上图中userdb为用户创建的数据库,里面有三张表分别是t1,t2,t3对应了三个.frm文件,但是只有一个.ibd文件,这是因为InnoDB又一个参数innodb_file_per_table可以对创建表时是否使用单独表空间进行设置,所以t1是在这个参数设置为ON的时候创建的,而另外两张表使用的是共享表空间。也就是这两个表的数据会存储到ibdata中。还有一个小文件db.opt,这个文件存储的是mysql数据库的一些配置信息,例如编码排序等,如果在创建数据库的时候指定了一些非默认的参数就会在这个文件中存储这些信息。