1、背景
安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的数据都是存储在这个目录中,可以大概了解一下这个目录下是怎么存储数据的。
2、版本
mysql> status -------------- e:\mysql_install\mysql\bin\mysql.exe ver 8.0.40 for win64 on x86_64 (mysql community server - gpl)
3、数据目录
可以通过sql命令来查找数据目录,命令如下:
mysql> show variables like 'datadir'; +---------------+------------------------------+ | variable_name | value | +---------------+------------------------------+ | datadir | e:\mysql_install\mysql\data\ | +---------------+------------------------------+ 1 row in set, 1 warning (0.00 sec)
再看看这个目录有哪些文件:
$ ls e:\\mysql_install\\mysql\\data\\ '#ib_16384_0.dblwr' a030414-nc.err a030414-nc-bin.000003 ca.pem ib_buffer_pool mysql.ibd server-cert.pem undo_001 '#ib_16384_1.dblwr' a030414-nc.pid a030414-nc-bin.index ca-key.pem ibdata1 performance_schema/ server-key.pem undo_002 '#innodb_redo'/ a030414-nc-bin.000001 a030414-nc-slow.log client-cert.pem ibtmp1 private_key.pem sys/ '#innodb_temp'/ a030414-nc-bin.000002 auto.cnf client-key.pem mysql/ public_key.pem
看一下有哪些数据库:
mysql> show databases; +--------------------+ | database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.01 sec)
查询结果有4个可以发现除了data目录下除了没有名为information_schema的目录,其它三个数据库都存在同名的目录,其它三个数据库的数据就存在对应的同名目录里,只是information_schema比较特殊。
接下来我们创建一个新的数据库:
mysql> create database test;
然后可以发现data目录下多了一个test的空目录,里面啥也没有,每创建一个数据库,data目录下就会多一个同名的目录:
$ ll e:\\mysql_install\\mysql\\data\\test total 0
再创建一张innodb的表看看:
mysql> use test; database changed mysql> create table test1 -> ( -> id int auto_increment primary key, -> str1 varchar(255) not null default '', -> str2 varchar(255), -> str3 char(5), -> str4 varchar(255), -> str5 char(10), -> index idx_str1 (str1), -> index idx_str4_str5 (str4, str5) -> ) engine = innodb default charset = utf8mb4; query ok, 0 rows affected (0.05 sec)
可以发现test目录下产生了一个test1.ibd的二进制文件:
$ ll e:\\mysql_install\\mysql\\data\\test\\ total 192 -rw-r--r-- 1 xxx 1049089 147456 1月 15 10:11 test1.ibd
我们的表结构信息和插入此表的数据都存在这个文件中,这个文件也可以叫做独立表空间,里面存储多个页,我们的数据都在页上。
以前版本的mysql默认使用的是系统表空间,也就是所有表数据和信息存储到一个公共的地方,对应着数据目录data下的ibdata1文件,这个文件大小和路径还有名称都是可以在配置文件修改的。
有的版本还会把表结构信息单独存储到表名.frm里,和存储数据文件分开。
接下来再创建一个myisam存储引擎的表来看看有什么区别:
mysql> create table test2 -> ( -> id int auto_increment primary key, -> str1 varchar(255) not null default '', -> str2 varchar(255), -> str3 char(5), -> str4 varchar(255), -> str5 char(10), -> index idx_str1 (str1), -> index idx_str4_str5 (str4, str5) -> ) engine = myisam default charset = utf8; query ok, 0 rows affected, 1 warning (0.02 sec)
查看data目录下test目录下有哪些文件:
$ ll -a e:\\mysql_install\\mysql\\data\\test\\ total 212 drwxr-xr-x 1 xxx 1049089 0 1月 15 10:57 ./ drwxr-xr-x 1 xxx 1049089 0 1月 15 09:59 ../ -rw-r--r-- 1 xxx 1049089 147456 1月 15 10:41 test1.ibd -rw-r--r-- 1 xxx 1049089 0 1月 15 10:57 test2.myd -rw-r--r-- 1 xxx 1049089 4096 1月 15 10:57 test2.myi -rw-r--r-- 1 xxx 1049089 7733 1月 15 10:57 test2_366.sdi
发现生成了与test2相关的3个文件,这3个文件的作用分别为:
test2.myd
:存放数据信息test2.myi
:存放索引信息test2_366.sdi
:存放表结构信息
有的版本表结构信息是存储在表名.frm文件中。
4、总结
本文大概讲了一下我们插入数据库的用户记录是存储在哪些目录哪些文件里的,注意不同版本的数据库存储的文件是有区别的,不过都大差不差,了解一下就行。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论