【Mysql数据库从0到1】-入门基础篇--mysql基本使用
- 🔻一、Mysql5.7 VS Mysql8.0 详解
- 1.1 ⛳字符编码
- 1.2 ⛳用户的创建与授权
- 1.3 ⛳ 认证插件
- 1.4 ⛳ 隐藏索引
- 1.5 ⛳ 持久化设置
- 1.6 ⛳ 通用表表达式(Common Table Expressions)
- 1.7 ⛳ 性能提升
- 1.8 ⛳ 参数变化
- 1.9 ⛳ NoSQL文档支持
- 1.10⛳ 窗口函数
- 🔻二、Mysql数据库安装与升级
- 🔻三、Mysql数据库客户端使用及常规配置详解
- 2.1 🎈 Mysql版本查看及连接
- 2.2 🎈 Mysql进程查看及服务启停
- 2.3 🎈 Mysql密码策略详解、修改密码、授权root用户远程登录
- 2.3.1 🍃 Mysql密码策略详解
- 2.3.2 🍃 修改root用户密码
- 2.3.3 🍃 授权root用户远程登录
- 2.4 🎈 Mysql字符集
- 2.5 🎈 Mysql --sql大小写规范与sql_mode
- 2.5.1 🍃 sql大小写规范
- 2.5.2 🍃 sql_mode
- 🔻四、Mysql数据库目录结构详解--RPM方式安装
- 🍁 4.1 查看当前系统mysql有关目录
- 🍁 4.2 RPM方式安装mysql 默认目录
- 🔻五、Mysql数据库与文件系统关系详解
- 🍁 5.1 查看当前有哪些数据库
- 🍁 5.2 Mysql数据库在文件系统中的表示详解
- 🎑 5.2.1 Mysql 5.7数据库目录文件
- 🎑 5.2.2 Mysql 8.0 数据库目录文件
- 🎑 5.2.3 系统表空间与独立表空间设置
- 🔻六、总结—温故知新
🔻一、Mysql5.7 VS Mysql8.0 详解
1.1 ⛳字符编码
mysql5.7和之前版本,默认字符集为latin1,插入中文字符会出现乱码。在使用5.7及之前的版本时候需要将字符编码修改为utf8字符集,utf8字符集指的是utf8mb3。
从mysql8.0开始,数据库默认字符编码改为utf8mb4。
1.2 ⛳用户的创建与授权
#### mysql8.0 用户的创建 #### 授权时需要分开执行,不能用grant 建立用户
# create user '用户名'@'主机' identified by '密码';
mysql> create user 'zyl'@'%' identified by 'Zyl@123456';
Query OK, 0 rows affected (0.07 sec)
#grant all privileges on *.* to '用户名'@'主机';
mysql> grant all privileges on *.* to 'zyl'@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql>
#### Mysql5.7 授权root用户命令 ####
# grant all privileges on *.* to '用户名'@'主机' identified by '密码';
mysql> grant all privileges on *.* to 'root'@'%' identified by 'Zyl@123456';
mysql> flush privileges;
#### Mysql8.0 授权root命令 ####
# grant all privileges on . to '用户名'@'主机' with grant option;;
mysql> grant all privileges on *.* to 'root'@'%' with grant option;
Query OK, 0 rows affected (0.00 sec)
#### 修改root用户密码 #####
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Zyl@123456';
mysql> flush privileges;
1.3 ⛳ 认证插件
Mysql 5.7 默认身份插件是 mysql_native_password
Mysql 8.0 默认的身份插件是 caching_sha2_password
查看身份认证插件:
mysql> show variables like 'default_authentication_plugin%';
+-------------------------------+-----------------------+
| Variable_name | Value |
+-------------------------------+-----------------------+
| default_authentication_plugin | caching_sha2_password |
+-------------------------------+-----------------------+
1 row in set (0.00 sec)
1.4 ⛳ 隐藏索引
在Mysql 8.0 中, 可以将索引通过命令设置为 隐藏 或 显示。
对于被隐藏的索引,它不会被查询优化器所使用,我们可以使用这一功能,对相关的查询进行性能调试,通过隐藏或显示,分析数据库性能差异的原因,同时也可以去除无效的索引。
ALTER TABLE 表名 ALTER INDEX 索引名 INVISIBLE;
例子:
##创建名为idx_row_id的索引
CREATE INDEX idx_row_id ON tab1 ( row_id );
###隐藏索引
ALTER TABLE tab1 ALTER INDEX idx_row_id INVISIBLE;
###恢复隐藏索引
ALTER TABLE tab1 ALTER INDEX idx_row_id VISIBLE;
1.5 ⛳ 持久化设置
Mysql 8.0 新增 SET PERSIST 的命令,该命令的配置值保存到数据目录下的mysqld-auto.cnf文件中,下次启动时会读取该文件,用其中的配置来覆盖缺省的配置文件,补充了SET GLOBAL 命令只能临时生效的不足。
mysql> SET PERSIST max_connections = 500;
Query OK, 0 rows affected (0.00 sec)
mysql>
1.6 ⛳ 通用表表达式(Common Table Expressions)
Mysql 5.7 复杂的查询会使用嵌入式表,例如:
SELECT
t1.*,
t2.*
FROM
( SELECT id FROM tab1 ) t1,
( SELECT user_id FROM tab2 ) t2;
有了Mysql 8.0 通用表表达式(Common Table Expressions)之后:
WITH
t1 AS ( SELECT id FROM tab1 ),
t2 AS ( SELECT user_id FROM tab2 )
SELECT t1.*,t2.*
FROM t1,t2;
1.7 ⛳ 性能提升
官方表示Mysql 8.0 的速度要比 Mysql 5.7 快 2 倍。Mysql 8.0 在读/写工作负载、IO 密集型工作负载、以及高竞争工作负载时相比Mysql 5.7有更好的性能。
1.8 ⛳ 参数变化
mysql中想要模糊的查看某一个项目的配置,可以使用百分号%进行通配符搜索。
mysql> show variables like 'mysql%';
query_cahe参数已经不存在
binglog过期时间参数变更为:
| binlog_expire_logs_seconds | 2592000 |
mysql> show variables like 'binlog_%';
+------------------------------------------------+--------------+
| Variable_name | Value |
+------------------------------------------------+--------------+
| binlog_cache_size | 32768 |
| binlog_checksum | CRC32 |
| binlog_direct_non_transactional_updates | OFF |
| binlog_encryption | OFF |
| binlog_error_action | ABORT_SERVER |
| binlog_expire_logs_auto_purge | ON |
| binlog_expire_logs_seconds | 2592000 |
| binlog_format | ROW |
| binlog_group_commit_sync_delay | 0 |
| binlog_group_commit_sync_no_delay_count | 0 |
| binlog_gtid_simple_recovery | ON |
| binlog_max_flush_queue_time | 0 |
| binlog_order_commits | ON |
| binlog_rotate_encryption_master_key_at_startup | OFF |
| binlog_row_event_max_size | 8192 |
| binlog_row_image | FULL |
| binlog_row_metadata | MINIMAL |
| binlog_row_value_options | |
| binlog_rows_query_log_events | OFF |
| binlog_stmt_cache_size | 32768 |
| binlog_transaction_compression | OFF |
| binlog_transaction_compression_level_zstd | 3 |
| binlog_transaction_dependency_history_size | 25000 |
| binlog_transaction_dependency_tracking | COMMIT_ORDER |
+------------------------------------------------+--------------+
24 rows in set (0.00 sec)
mysql> show variables like 'query_cahe%';
Empty set (0.00 sec)
mysql>
1.9 ⛳ NoSQL文档支持
Mysql 从 5.7 版本开始提供 NoSQL 存储功能,目前在 8.0 版本中这部分功能也得到了更大的改进。该项功能消除了对独立的 NoSQL 文档数据库的需求,而 Mysql 文档存储也为 schema-less 模式的 JSON 文档提供了多文档事务支持和完整的 ACID 合规性。
1.10⛳ 窗口函数
创建了名为 w 的 window,规定它对表tab1 中 id 字段进行排序,然后在 select 子句中对 w 执行 rank() 方法,将结果输出为 rank 字段。
mysql> select *, rank() over w as 'rank' from tab1 window w as (order by id);
+------+--------+-------+------+
| id | name | class | rank |
+------+--------+-------+------+
| 1001 | 曹操 | 1班 | 1 |
| 1002 | 张飞 | 1班 | 2 |
| 1003 | 项羽 | 3班 | 3 |
| 1004 | 刘备 | 2班 | 4 |
+------+--------+-------+------+
4 rows in set (0.00 sec)
mysql>
🔻二、Mysql数据库安装与升级
01-mysql安装篇(rpm方式安装+二进制方式安装)
02-mysql升级篇(rpm方式+二进制方式升级)
🔻三、Mysql数据库客户端使用及常规配置详解
2.1 🎈 Mysql版本查看及连接
####方式一:服务器终端命令行####
[root@db-server ~]# mysql --version
mysql Ver 8.0.32 for Linux on x86_64 (MySQL Community Server - GPL)
[root@db-server ~]#
####方式二:Mysql终端命令行####
[root@db-server ~]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.32 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.32 |
+-----------+
1 row in set (0.00 sec)
####退出Mysql终端命令行####
mysql> exit
Bye
[root@db-server ~]#
2.2 🎈 Mysql进程查看及服务启停
🔧 进程查看
[root@db-server ~]# ps -ef | grep mysqld
🔨 服务启停
####服务启动####
[root@db-server ~]# systemctl start mysqld
####服务停止####
[root@db-server ~]# systemctl stop mysqld
####服务状态查看####
[root@db-server ~]# systemctl status mysqld
####设置开机自启####
[root@db-server ~]# systemctl enable mysqld
Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service to /usr/lib/systemd/system/mysqld.service.
####设置开机不自启####
[root@db-server ~]# systemctl disable mysqld
Removed symlink /etc/systemd/system/multi-user.target.wants/mysqld.service.
2.3 🎈 Mysql密码策略详解、修改密码、授权root用户远程登录
2.3.1 🍃 Mysql密码策略详解
mysql8.0 密码策略变量详解:
💦 validate_password.policy:密码策略,检查用户的密码。
0:(Low)密码长度最少8个字符
1:(Mediumpolicy)至少包含1个数字,1个小写字母,1个大写字母和1个特殊字符组成(默认值)
2:(Strongpolicy)长度为4或更长的密码子字符串不得与字典文件中的单词匹配
💦 validate_password.length:需要密码最小字符数,默认为8
💦 validate_password.number_count:需要密码的最小数字字符数,默认为1
💦 validate_password.mixed_case_count:需要密码的小写和大写的最小字符数,默认为1
💦 validate_password.special_char_count:需要密码的特殊字符的最小字符数,默认为1
💦 validate_password.dictionary_file:用于检查密码的字典文件的路径名,默认没有
2.3.2 🍃 修改root用户密码
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select host,user from user;
+-----------+------------------+
| host | user |
+-----------+------------------+
| localhost | mysql.infoschema |
| localhost | mysql.session |
| localhost | mysql.sys |
| localhost | root |
+-----------+------------------+
5 rows in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password.check_user_name | ON |
| validate_password.dictionary_file | |
| validate_password.length | 8 |
| validate_password.mixed_case_count | 1 |
| validate_password.number_count | 1 |
| validate_password.policy | MEDIUM |
| validate_password.special_char_count | 1 |
+--------------------------------------+--------+
7 rows in set (0.02 sec)
mysql> alter user root@localhost identified by 'Zyl@123456';
Query OK, 0 rows affected (0.01 sec)
2.3.3 🍃 授权root用户远程登录
mysql> update user set host='%' where user='root';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select host,user from user;
+-----------+------------------+
| host | user |
+-----------+------------------+
| % | root |
| localhost | mysql.infoschema |
| localhost | mysql.session |
| localhost | mysql.sys |
+-----------+------------------+
5 rows in set (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> grant all privileges on *.* to 'root'@'%' with grant option;
Query OK, 0 rows affected (0.00 sec)
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Zyl@123456';
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql>
授权远程登录与5.7语法有所区别:
🚩 mysql 5.7:
mysql> grant all privileges on *.* to 'root'@'%' identified by 'Zyl@123456' with grant option;
🚩 mysql 8.0,需要分开执行, 将创建账户和赋予权限分开了:
mysql> grant all privileges on *.* to 'root'@'%' with grant option;
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Zyl@123456';
mysql> flush privileges;
赋予CRUD权限:grant select,insert,update,delete on *.* to root'@'%';
赋予超级权限:grant all privileges on *.* to 'root'@'%' with grant option;
撤销授权: revoke all privileges on *.* from 'root'@'%';
刷新权限: flush privileges;
查看权限: show grants for 'root'@'%';
2.4 🎈 Mysql字符集
mysql 8.0之前默认的字符集是latin1,utf8字符集指向的是utf8mb3,从8.0开始默认编码使用utf8mb4,避免了乱码产生。
Mysql 各级别的字符集:
-
服务器级别-----(my.cnf配置)
-
数据库级别-----自动同步服务器级别字符集
-
表级别-----
ALTER TABLE 表名 DEFAULT CHARSET=‘字符集名’
,或者创建表时,创建语句后面加上"CHARACTER SET"子句,如:CREATE TABLE 表名 (列名1 INT,列名2 CHAR(20)) ENGINE = InnoDB DEFAULT CHARSET=utf8;
-
列级别-----
ALTER TABLE 表名 MODIFY 列名 列类型 CHARACTER SET ‘字符集名’;
mysql> show variables like 'character%';
####或者#####
mysql> show variables like '%char%';
+--------------------------+--------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8mb3 |
| character_sets_dir | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.00 sec)
mysql>
➰ 修改数据库字符
###alter database 数据库名 character set '字符编码';
mysql> alter database test01 character set 'utf8';
Query OK, 1 row affected, 1 warning (0.05 sec)
mysql>
➰ 修改表字符
###alter table 表名 convert to character set '字符编码';
mysql> alter table tab1 convert to character set 'utf8';
Query OK, 4 rows affected, 1 warning (0.10 sec)
Records: 4 Duplicates: 0 Warnings: 1
### ALTER TABLE 表名 DEFAULT CHARSET=‘字符集名’`
mysql> alter table tab1 DEFAULT CHARSET='utf8';
Query OK, 0 rows affected, 1 warning (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 1
mysql>
➰ utf8 与utf8mb4
🍀 utf8字符集表示一个字符需要 1 ~4个字节,一般常用字符 1 ~3个字节就可以表示,而字符集最大长度表示一个字符最大字节长度,所以会影响存储和性能,所以产生了utf8mb3 和utf8mb4 两个概念。
🍀 utfmb3:阉割版的utf8字符集,只使用 1 ~3个字节表示字符。
🍀 utfmb4:正宗的utf8字符集,使用 1 ~4个字节表示字符,如存储emoji表情。
2.5 🎈 Mysql --sql大小写规范与sql_mode
2.5.1 🍃 sql大小写规范
Mysql 在 Windows 和 Linux 的大小写规范不一样。
在 Windows 下全部都不区分大小写。
在 Linux 下:
数据库名、表名、表别名、变量名是严格区分大小写。
关键字、函数名称在 SQL 中不区分大小写。
字段名、列别名在所有的情况下都不区分大小写。
mysql> SHOW VARIABLES LIKE '%lower_case_table_names%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_table_names | 0 |
+------------------------+-------+
1 row in set (0.00 sec)
mysql>
lower_case_table_names 默认为0,大小写敏感。一般情况下不建议修改。
mysql> select * from tab1;
+------+--------+-------+
| id | name | class |
+------+--------+-------+
| 1001 | 曹操 | 1班 |
| 1002 | 张飞 | 1班 |
| 1003 | 项羽 | 3班 |
| 1004 | 刘备 | 2班 |
+------+--------+-------+
4 rows in set (0.00 sec)
mysql> select * from Tab1;
ERROR 1146 (42S02): Table 'test01.Tab1' doesn't exist
mysql>
2.5.2 🍃 sql_mode
sql_mode会影响mysql支持的sql语法及数据验证检查,通过设置sql_mode可以完成不同严格程度的数据校验,有效保障数据准确性。
#### 查询mysql数据库sql_mode
mysql> select @@session.sql_mode;
+-----------------------------------------------------------------------------------------------------------------------+
| @@session.sql_mode |
+-----------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select @@global.sql_mode;
+-----------------------------------------------------------------------------------------------------------------------+
| @@global.sql_mode |
+-----------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> show variables like 'sql_mode';
+---------------+-----------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+---------------+-----------------------------------------------------------------------------------------------------------------------+
| sql_mode | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+---------------+-----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
➰ 宽松模式 与 严格模式
🍀 宽松模式:插入数据时,即使给了一个错误数据,也可能被接受,并且不报错。
如:在表中,有字段name属性,字段类型char(10),如果插入数据时候,有一条数据name值为’zyl@123456789’,超过了设定字段长度,那么这条数据插入,不会报错,只会截取前10个字符’‘zyl@123456’,这就是宽松模式。
🍀 严格模式:出现上面情况,应该报错,插入数据出错,所以在数据库生产、开发、测试等环境,必须采用严格模式。
➰ 改为严格模式可能存在的问题:
sql_mode设置了含NO_ZERO_DATE,那么不允许插入0日期,插入0日期会抛出错误,如字段TIMESTAMP,在没声明为NULL或显示DEFAULT子句,会自动分配DEFAULT ‘0000-00-00 00:00:00’ 零时间戳。不满足NO_ZERO_DATE而报错。
🍀 1、通过命令临时设置sql_mode,重启后失效:
### 当前会话
SET SESSION sql_mode = '';
### 全局设置
SET GLOBAL sql_mode = '';
🍀 2、修改mysql的配置文件,重启mysql服务后生效
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
常用sql_mode各参数 | 描述 |
---|---|
ONLY_FULL_GROUP_BY | 对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中 |
NO_AUTO_VALUE_ON_ZERO | 该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户 希望插入的值为0,而该列又是自增长的,那么这个选项就有用了 |
STRICT_TRANS_TABLES | 在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制 |
STRICT_ALL_TABLES | 如果插入数据的第一行内容与字段类型兼容,但后续的数据行存在不兼容的情况,则兼容的数据正常插入,不兼容的数据则会报错并终止insert操作。 |
NO_ZERO_IN_DATE | 在严格模式下,不允许日期和月份为零 |
NO_ZERO_DATE | 设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告 |
ERROR_FOR_DIVISION_BY_ZERO | 在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时MySQL返回NULL |
NO_AUTO_CREATE_USER | 禁止GRANT创建密码为空的用户 |
NO_ENGINE_SUBSTITUTION | 如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常 |
PIPES_AS_CONCAT | 将“ll”作为字符串的链接字符操作,而不是作为或运算符,与“concat”相类似。 |
ANSI_QUOTES | 启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符 |
IGNORE_SPACE | 用于忽略mysql系统函数与之后的括号之间的空格。 |
🍀 不同版本默认的sql_mode
Mysql 5.5 :空
+---------------+-----------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+---------------+-----------------------------------------------------------------------------------------------------------------------+
| sql_mode | |
+---------------+-----------------------------------------------------------------------------------------------------------------------+
Mysql 5.6:
+---------------+-----------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+---------------+-----------------------------------------------------------------------------------------------------------------------+
| sql_mode | NO_ENGINE_SUBSTITUTION |
+---------------+-----------------------------------------------------------------------------------------------------------------------+
Mysql 5.7:
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
| sql_mode | ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION |
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------+
Mysql 8.0:
+---------------+-----------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+---------------+-----------------------------------------------------------------------------------------------------------------------+
| sql_mode | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+---------------+-----------------------------------------------------------------------------------------------------------------------+
🔻四、Mysql数据库目录结构详解–RPM方式安装
🍁 4.1 查看当前系统mysql有关目录
[root@db-server mysql]# find / -name mysql
/etc/selinux/targeted/active/modules/100/mysql
/etc/logrotate.d/mysql
/var/lib/mysql
/var/lib/mysql/mysql
/usr/bin/mysql
/usr/lib64/mysql
[root@db-server mysql]#
🍁 4.2 RPM方式安装mysql 默认目录
1、数据存储目录---存储mysql运行过程中产生的数据
/var/lib/mysql/
mysql> show variables like 'datadir';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| datadir | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.01 sec)
mysql>
2、配置文件---存放命令及配置文件,
/usr/share/mysql-8.0(mysql.server命令及配置文件)
/etc/my.cnf (mysql服务配置文件,指定端口、数据库的安装目录等参数)
3、相关命令目录---存放了控制客服端和服务端的命令(可执行文件)
/usr/bin(mysql、mysqladmin、mysqldump、mysqlcheck、mysqlshow、mysql_upgrade等命令)
/usr/sbin(mysqld命令)
4、启动脚本---
/etc/rc.d/init.d/(启动脚本文件mysql的目录)
🔻五、Mysql数据库与文件系统关系详解
🍁 5.1 查看当前有哪些数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test01 |
+--------------------+
5 rows in set (0.00 sec)
mysql>
➰ 4个mysql安装自带的数据库,1个自定义数据库:
🍀 information_schema----存储mysql服务器维护的数据库信息,有哪些表、视图、触发器、列、索引等,这些信息并不是真实数据,而是一些描述信息,称之为元数据。还存储了一些以innodb_sys开头的表(内部系统表)。
🍀 mysql----mysql自带核心数据库,存储用户账户及权限信息,其他一些存储过程、事件定义信息,运行过程日志、帮助信息、时区信息等。
🍀 performance_schema----保存mysql运行过程中的一些状态信息,用来监控mysql各项性能指标,如最近执行过的语句,内存使用情况,执行花费时长等。
🍀 sys----主要通过视图形式把 performance_schema和 information_schema 连接起来,帮助管理员和开发人员监控mysql的技术性能。
🍀 test01----自定义数据库
🍁 5.2 Mysql数据库在文件系统中的表示详解
🎑 5.2.1 Mysql 5.7数据库目录文件
如果存储引擎是InnoDB, 在data目录下会看到3类文件(.frm、.ibd、.opt):
🍀 db.opt----存放数据库使用字符集,字符校验规则,show create database时显示数据库默认字符集即db.opt中字符集。
这个文件丢失不影响数据库运行,该文件丢失之后新建表时,找不到数据库的默认字符集,就把character_set_server当成数据库的默认字符集,show create database时显示character_set_server字符集。
🍀 .frm----存放数据库的表结构。
🍀 .ibd----(独立表空间)存放表数据和索引的文件。该表的索引(B+树)的每个非叶子节点存储索引,叶子节点存储索引和索引对应的数据。
如果存储引擎是myisam, 在data目录下会看到3类文件(.frm、.myi、.myd):
🍀 .frm----表定义,是描述表结构的文件。
🍀 .MYD----(MYData)数据信息文件,是表的数据文件。
🍀 .MYI----(MYIndex)索引信息文件,是表数据文件中任何索引的数据树。
.MYD与.MYI合在一起相当于.ibd。
🎑 5.2.2 Mysql 8.0 数据库目录文件
如果存储引擎是InnoDB, 在data目录下只会看到1类文件(.ibd),没有.frm、 db.opt文件:
🍀 ibdata1----系统表空间,默认大小12M。
🍀 .ibd----独立表空间(存放表数据和索引的文件、数据库的表结构、数据库使用字符集,字符校验规则)。
如果存储引擎是myisam, 在data目录下会看到3类文件(.sdi、.myi、.myd):
🍀 .sdi----表定义,是描述表结构的文件(相当于mysql5.7中的.frm)。
🍀 .MYD----(MYData)数据信息文件,是表的数据文件。
🍀 .MYI----(MYIndex)索引信息文件,是表数据文件中任何索引的数据树。
🚩 注:
1、在一个MySQL服务器中,系统表空间只有一份。从MySOL5.5.7到MySOL5.6.6之间的各个版本中,我们表中的数据都会被默认存储到这个系统表空间。
2、在MySQL5.6.6以及之后的版本中,InnoDB并不会默认的把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是说我们创建了多少个表,就有多少个独立表空间。使用 独立表空间来存储表数据的话,会在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件,文件名和表名相同。
[root@db-server mysql]# cd test01/
[root@db-server test01]# ll
total 224
-rw-r----- 1 mysql mysql 114688 Jun 3 15:53 tab1.ibd
-rw-r----- 1 mysql mysql 114688 Jun 3 15:28 tab2.ibd
[root@db-server test01]# pwd
/var/lib/mysql/test01
[root@db-server test01]#
❓ .frm在MySQL8中不存在了。那去哪里了呢?
0racle 官方将frm文件的信息及更多信息移动到叫做序列化字典信息 (Serialized DictionaryInformation,SDI)中,SDI被写在ibd文件内部。
MySQL8.0属于Oradie旗下,同理为了从IBD文件中提取SDI信息,Oracle提供了一个应用程序ibd2sdi。ibd2sdi官方文档这个工具不需要下载,MySQL8自带的有,只要你配好环境变量就能到处用。
到存储ibd文件的目录下,执行下面的命令,解析.ibd 文件:
[root@db-server test01]# ibd2sdi --dump-file=tab1.txt tab1.ibd
[root@db-server test01]# ll
total 236
-rw-r----- 1 mysql mysql 114688 Jun 3 15:53 tab1.ibd
-rw------- 1 root root 11142 Jun 3 21:59 tab1.txt
-rw-r----- 1 mysql mysql 114688 Jun 3 15:28 tab2.ibd
[root@db-server test01]# cat tab1.txt
#####可以发现解析后的tab1.txt文件有表结构信息、字符编码等信息。
🎑 5.2.3 系统表空间与独立表空间设置
我们可以自己指定使用系统表空间还是独立表空间来存储数据,这个功能由启动参数 innodb_file_per_table控制,比如说我们想刻意将表数据都存储到系统表空间时,可以在启动MySOL服务器的时候这样配置:
[server]
innodb_file_per_table=0 # 0: 代表使用系统表空间; 1: 代表使用独立表空间
默认使用独立表空间:
mysql> show variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set (0.01 sec)
mysql>
🔻六、总结—温故知新
❓ Mysql5.7 与 Mysql8.0 区别
❓ Mysql数据库客户端使用及常规参数配置
❓ Mysql数据库目录结构了解
❓ Mysql数据库与文件系统关系
👈【上一篇】 |
💖The End💖 点点关注,收藏不迷路💖
| 【下一篇】👉 |