草庐IT

MySQL的文件系统(Linux环境)

玮浩同学 2023-03-28 原文

目录

数据库文件目录

/var/lib/mysql/

可通过以下sql命令查看:

mysql> show variables like 'datadir';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.00 sec)

相关命令目录

/usr/bin/

mysqladmin、mysqlbinlog、mysqldump等命令

[root@shanghai01 bin]# cd /usr/bin
[root@shanghai01 bin]# find . -name "*mysql*"
./mysql_secure_installation
./mysql_upgrade
./mysql_migrate_keyring
./mysql_config_editor
./mysqlimport
./mysqlpump
./mysql
./mysqlslap
./mysqld_pre_systemd
./mysqlshow
./mysqlbinlog
./mysqldumpslow
./mysql_ssl_rsa_setup
./mysqlcheck
./mysqladmin
./mysqldump
./mysql_tzinfo_to_sql

/usr/sbin/

[root@shanghai01 bin]# cd /usr/sbin
[root@shanghai01 sbin]# find . -name "*mysql*"
./mysqld
./mysqld-debug

配置文件目录

/usr/share/mysql-8.0/

错误消息,字符集、安装文件和配置文件等

[root@shanghai01 mysql-8.0]# cd /usr/share/mysql-8.0
[root@shanghai01 mysql-8.0]# ll
total 1100
drwxr-xr-x 2 root root   4096 Apr 25 00:25 bulgarian
drwxr-xr-x 2 root root   4096 Apr 25 00:25 charsets
drwxr-xr-x 2 root root   4096 Apr 25 00:25 czech
drwxr-xr-x 2 root root   4096 Apr 25 00:25 danish
-rw-r--r-- 1 root root  25575 Dec 18 00:07 dictionary.txt
drwxr-xr-x 2 root root   4096 Apr 25 00:25 dutch
drwxr-xr-x 2 root root   4096 Apr 25 00:25 english
drwxr-xr-x 2 root root   4096 Apr 25 00:25 estonian
drwxr-xr-x 2 root root   4096 Apr 25 00:25 french
drwxr-xr-x 2 root root   4096 Apr 25 00:25 german
drwxr-xr-x 2 root root   4096 Apr 25 00:25 greek
drwxr-xr-x 2 root root   4096 Apr 25 00:25 hungarian
-rw-r--r-- 1 root root   3999 Dec 18 00:07 innodb_memcached_config.sql
-rw-r--r-- 1 root root   2216 Dec 18 00:58 install_rewriter.sql
drwxr-xr-x 2 root root   4096 Apr 25 00:25 italian
drwxr-xr-x 2 root root   4096 Apr 25 00:25 japanese
drwxr-xr-x 2 root root   4096 Apr 25 00:25 korean
-rw-r--r-- 1 root root 616528 Dec 18 00:07 messages_to_clients.txt
-rw-r--r-- 1 root root 359072 Dec 18 00:07 messages_to_error_log.txt
-rw-r--r-- 1 root root   1977 Dec 18 00:58 mysql-log-rotate
drwxr-xr-x 2 root root   4096 Apr 25 00:25 norwegian
drwxr-xr-x 2 root root   4096 Apr 25 00:25 norwegian-ny
drwxr-xr-x 2 root root   4096 Apr 25 00:25 polish
drwxr-xr-x 2 root root   4096 Apr 25 00:25 portuguese
drwxr-xr-x 2 root root   4096 Apr 25 00:25 romanian
drwxr-xr-x 2 root root   4096 Apr 25 00:25 russian
drwxr-xr-x 2 root root   4096 Apr 25 00:25 serbian
drwxr-xr-x 2 root root   4096 Apr 25 00:25 slovak
drwxr-xr-x 2 root root   4096 Apr 25 00:25 spanish
drwxr-xr-x 2 root root   4096 Apr 25 00:25 swedish
drwxr-xr-x 2 root root   4096 Apr 25 00:25 ukrainian
-rw-r--r-- 1 root root   1248 Dec 18 00:58 uninstall_rewriter.sql

/etc/my.cnf

[root@shanghai01 /]# cat /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove the leading "# " to disable binary logging
# Binary logging captures changes between backups and is enabled by
# default. It's default setting is log_bin=binlog
# disable_log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
#
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

文件

数据库在文件系统中的表示

除了information_schema这个系统数据库外,其他的数据库在数据目录下都有对应的子目录。

[root@shanghai01 ~]# cd /var/lib/mysql/
[root@shanghai01 mysql]# ll
total 188876
-rw-r----- 1 mysql mysql       56 Apr 25 00:43 auto.cnf
-rw-r----- 1 mysql mysql     1433 Apr 25 11:26 binlog.000001
-rw-r----- 1 mysql mysql       16 Apr 25 00:48 binlog.index
-rw------- 1 mysql mysql     1676 Apr 25 00:43 ca-key.pem
-rw-r--r-- 1 mysql mysql     1112 Apr 25 00:43 ca.pem
-rw-r--r-- 1 mysql mysql     1112 Apr 25 00:43 client-cert.pem
-rw------- 1 mysql mysql     1676 Apr 25 00:43 client-key.pem
-rw-r----- 1 mysql mysql   196608 Apr 25 12:11 #ib_16384_0.dblwr
-rw-r----- 1 mysql mysql  8585216 Apr 25 00:43 #ib_16384_1.dblwr
-rw-r----- 1 mysql mysql     5517 Apr 25 00:43 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582912 Apr 25 12:11 ibdata1
-rw-r----- 1 mysql mysql 50331648 Apr 25 12:11 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 Apr 25 00:43 ib_logfile1
-rw-r----- 1 mysql mysql 12582912 Apr 25 00:48 ibtmp1
drwxr-x--- 2 mysql mysql     4096 Apr 25 00:48 #innodb_temp
drwxr-x--- 2 mysql mysql     4096 Apr 25 00:43 mysql
-rw-r----- 1 mysql mysql 25165824 Apr 25 11:25 mysql.ibd
srwxrwxrwx 1 mysql mysql        0 Apr 25 00:48 mysql.sock
-rw------- 1 mysql mysql        6 Apr 25 00:48 mysql.sock.lock
drwxr-x--- 2 mysql mysql     4096 Apr 25 00:43 performance_schema
-rw------- 1 mysql mysql     1680 Apr 25 00:43 private_key.pem
-rw-r--r-- 1 mysql mysql      452 Apr 25 00:43 public_key.pem
-rw-r--r-- 1 mysql mysql     1112 Apr 25 00:43 server-cert.pem
-rw------- 1 mysql mysql     1676 Apr 25 00:43 server-key.pem
drwxr-x--- 2 mysql mysql     4096 Apr 25 00:43 sys
-rw-r----- 1 mysql mysql 16777216 Apr 25 11:27 undo_001
-rw-r----- 1 mysql mysql 16777216 Apr 25 00:55 undo_002

MySQL5.7中会在数据库子目录下生成db.opt文件,用于保存数据库的相关配置。比如:字符集、比较规则。而MySQL8.0不再提供db.opt文件。

表在文件系统中的表示

创建测试数据库和表

CREATE DATABASE db_innodb_myisam;

USE db_innodb_myisam;

CREATE TABLE tb_innodb
(
    id INT PRIMARY KEY,
    NAME VARCHAR(20) NOT NULL
)
    ENGINE = innodb;

SHOW CREATE TABLE tb_innodb;

CREATE TABLE tb_myisam
(
    id INT PRIMARY KEY,
    NAME VARCHAR(20) NOT NULL
)
    ENGINE = myisam;

SHOW CREATE TABLE tb_myisam;

查看数据库目录下的文件

[root@shanghai01 mysql]# cd /var/lib/mysql/db_innodb_myisam/
[root@shanghai01 db_innodb_myisam]# ll
total 120
-rw-r----- 1 mysql mysql 114688 May  7 14:50 tb_innodb.ibd
-rw-r----- 1 mysql mysql   2901 May  7 14:51 tb_myisam_363.sdi
-rw-r----- 1 mysql mysql      0 May  7 14:51 tb_myisam.MYD
-rw-r----- 1 mysql mysql   1024 May  7 14:51 tb_myisam.MYI

InnoDB存储引擎模式

表结构:

在mysql8以前,为了保存表结构,InnoDB会在数据目录下对应的数据库子目录下创建一个专门用于描述表结构的文件,文件名是表名.frm,这个后缀名为.frm是以二进制格式存储的。在mysql8中,表结构和表数据一起存在后缀名为.ibd的文件中。

表中数据和索引:

系统表空间

默认情况下,InnoDB会在数据目录下创建一个名为ibdata1、大小为12M的文件,这个文件就是系统表空间在文件系统上的表示。这个文件是自扩展文件,当不够用的时候它会自己增加文件大小。

当然,如果想让系统表空间对应文件系统上多个实际文件,或者想要修改ibdata1这个文件名,那可以在MySQL启动时,配置对应的文件路径以及它们的大小,比如这样修改一下my.cnf配置文件:

[server]
innodb_data_file_path=data1:512M;data2:512M:autoextend

独立表空间

在MySQL5.6.6以及之后的版本中,InnoDB并不会默认的把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是说我们创建了多少个表,就有多少个独立表空间。

使用独立表空间来存储表数据的话,会在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件,文件名和表名相同,只不过添加了一个.ibd的扩展名而已,所以完整的文件名称长这样:表名.ibd

例如tb_innodb.ibd中存储了测试表tb_innodb的结构、数据、索引。

可以用ibd2sdi工具解析ibd文件。

系统表空间与独立表空间的设置

可以自己指定使用系统表空间还是独立表空间来存储数据,这个功能由启动参数innodb_file_per_table控制,比如说我们想刻意将表数据都存储到系统表空间时,可以在启动MySQL服务器的时候这样配置:

[server]
innodb_file_per_table=0 # 0:代表使用系统表空间; 1:代表使用独立表空间

其他类型的表空间

随着MySQL的发展,除了上述两种老牌表空间之外,现在还新提出了一些不同类型的表空间,比如通用
表空间(general tablespace)、临时表空间(temporary tablespace)等。

MyISAM存储引擎模式

表结构:

mysql8中后缀为.sdi,mysql5.7中后缀为.frm。

例如tb_myisam_363.sdi中存储了测试表tb_myisam表结构。

表中数据和索引:

在MyISAM中的索引全部都是二级索引,该存储引擎的数据和索引是分开存放的。所以在文件系统中也是使用不同的文件来存储数据文件和索引文件,同时表数据都存放在对应的数据库子目录下。

例如tb_myisam.MYD存储数据(MYData)、tb_myisam.MYI存储索引(MYIndex)。

参考资料:

  • MySQL - 尚硅谷 - 宋红康
  • MySQL官方文档

有关MySQL的文件系统(Linux环境)的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  5. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  8. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  9. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  10. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

随机推荐