【Mysql数据库从0到1】-入门基础篇--mysql基本使用

news2024/11/23 15:23:56

【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💖 点点关注,收藏不迷路💖
【下一篇】👉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/606559.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

redis缓存单体服务测试本地锁失效问题

测试1&#xff1a;锁释放之后向redis缓存存入数据 //TODO 产生堆外内存溢出 OutOfDirectMemoryError//gulimall.com查询分类Overridepublic Map<String, List<CategoryLevel2Vo>> getCatelogJson() {/*** 问题 &#xff1a;解决办法* 1.缓存穿透 高并发情况下查询缓…

Java学习方式分享

哈喽&#xff0c;大家好呀&#xff0c;好久不见&#xff01;咱依然是那个腼腆害羞内向社恐文静、唱跳rap篮球都不大行的【三婶er】 坦白地说&#xff0c;今天是偶然看到C站这个活动的&#xff0c;这个主题我颇有感触&#xff0c;刚学java时的场景&#xff0c;历历在目。所以今天…

ChatGPT常见的报错解决方法(全网最全解决方法)

因为最近在使用ChatGPT的过程中&#xff0c;时常会出现一些错误提示&#xff0c;为了方便自己快速解决问题&#xff0c;所以也搜集了一些其他博主的解决方法&#xff0c;以下是整理的内容。 目录 1、拒绝访问 2、Access denied错误 3、We have detected suspicious 错误 4…

leetcode_19_相同的树

bool isSameTree(struct TreeNode* p, struct TreeNode* q){if(pNULL && qNULL)return true;//其中一个为空if(pNULL || qNULL)return false;//都不为空,且首节点的值不相等if(p->val ! q->val)return false;//p和q的值相等&#xff0c;分别比较左子树和右子树re…

如何使用debugHunter发现隐藏调试参数和Web应用程序敏感信息

关于debugHunter debugHunter是一款针对Web应用程序隐藏调试参数和敏感信息的识别扫描工具,该工具本质上是一个Chrome扩展,可以帮助广大研究人员扫描目标Web应用程序/网站以查找调试参数,并在发现了包含修改响应的URL时发送通知。该扩展利用了二分查找算法来有效地确定导致…

《基于Linux物联网综合项目》常见问题汇总fae

关于该课程说明 1&#xff09;本课程目标 通过web浏览器访问服务器&#xff0c;实现登录、注册、数据库操作、远程操控硬件、采集环境信息、远程监控、拍照、图片显示等功能。 将单片机、linux、html、摄像头、数据库等知识点融入到一个项目中。 2&#xff09;什么群体适合学…

JVM 虚拟机栈介绍

一、虚拟机栈&#xff08;VM Stack&#xff09; 1.1&#xff09;什么是虚拟机栈 虚拟机栈是用于描述java方法执行的内存模型。 每个java方法在执行时&#xff0c;会创建一个“栈帧&#xff08;stack frame&#xff09;”&#xff0c;栈帧的结构分为“局部变量表、操作数栈、动态…

JavaScript实现以数组方式输入数值,输出最大的数的代码

以下为实现以数组方式输入数值&#xff0c;输出最大的数的程序代码和运行截图 目录 前言 一、以数组方式输入数值&#xff0c;输出最大的数 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择&#xff0c;您可以在目录里进行快速查找…

基于html+css的图展示107

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

职业规划-论软件迭代变化和个人知识更新

职业规划-论软件迭代变化和个人知识更新 目录概述需求&#xff1a; 设计思路实现思路分析1.历程2.第一份工作3.后来4.BK毕业5.实习 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardnes…

冈萨雷斯DIP第6章知识点

6.1 彩色基础 区分不同颜色的特性&#xff1f; 区分不同颜色的特性通常是亮度、色调和饱和度。 亮度&#xff1a;亮度体现的是发光强度的消色概念&#xff08;不包含颜色的概念&#xff09;色调&#xff1a;表示被观察者感知的主导色&#xff0c;通常是混合光波中与主波长相关的…

深入理解设计原则之里氏替换原则(LSP)【软件架构设计】

系列文章目录 C高性能优化编程系列 深入理解软件架构设计系列 深入理解设计模式系列 高级C并发线程编程 LSP&#xff1a;里氏替换原则 系列文章目录1、里氏替换原则的定义和解读2、里氏替换原则可以用于哪些设计模式中&#xff1f;3、如何使用里氏替换原则来降低代码耦合度&a…

《微服务架构设计模式》第一章 逃离单体地狱

内容总结自《微服务架构设计模式》 逃离单体地狱 一、单体架构1、好处2、弊端 二、微服务架构1、定义2、好处3、弊端 三、模式的概念1、定义2、构成3、引申微服务 一、单体架构 1、好处 易于对应用程序进行大规模的更改&#xff1a;可以更改代码和数据库模式&#xff0c;然后…

华为OD机试真题 Java 实现【单词倒序】【2023Q1 100分】,附详细解题思路

一、题目描述 输入单行英文句子&#xff0c;里面包含英文字母&#xff0c;空格以及.? 三种标点符号&#xff0c;请将句子内每个单词进行倒序&#xff0c;并输出倒序后的语句。 二、输入描述 输入字符串S&#xff0c;S的长度1≤N≤100。 三、输出描述 输出逆序后的字符串 …

有道云笔记也挺速度,也搞了个AI助手,能抗衡Notion AI?

前言 小编平时做技术笔记的时候&#xff0c;经常使用到的软件就是有道云笔记&#xff0c;最近无意间发现&#xff0c;笔记编写的页面中&#xff0c;竟然集成了AI助手&#xff01;网易有道可真是低调&#xff01;毕竟最近AI圈大火&#xff0c;竟然没有蹭一波热度&#xff0c;直…

Spring Security 核心解读(二)自定义认证授权体系

自定义认证授权体系 概述自定义认证定义登录接口配置 Security 放行策略定义通用登录过滤器并将其配置到 Security 过滤器链上定义资源接口在 Security 授权设置中放行启动项目 结尾 概述 以前使用Spring Security 时&#xff0c;基本都是按部就班参考文档开发。 基本是从 Use…

【Python开发】FastAPI 06:处理错误

某些情况下&#xff0c;有必要向客户端&#xff08;包括前端浏览器、其他应用程序、物联网设备等&#xff09;返回错误提示&#xff0c;以便客户端能够了解错误的类型&#xff0c;从而做出应对。 目录 1 默认处理 1.1 错误介绍 1.2 使用 HTTPException 2 自定义处理 2.1 自…

论旅行之收获2

论旅行之收获2 概况站点第一站&#xff1a;北京市大兴区大兴机场基本情况吐槽小小趣事 第二站&#xff1a;云南省昆明长水机场云南省昆明市五华区基本概况经济分析 第三站&#xff1a;昆明站大理站云南省大理白族自治州大理市下关基本情况 第四站&#xff1a;云南省大理白族自治…

操作系统-进程和线程-处理机调度

目录 一、调度的概念 1.1调度的层次 1.1.1高级调度(作业调度) 1.1.2中级调度(内存调度) 1.1.3低级调度(进程调度) 1.2状态模型 1.3调度的时机 1.4调度方式 1.5进程的切换与过程 二、调度算法的评价指标 2.1CPU利用率 2.2吞吐量 2.3周转时间 2.4带权周转时间 2.5等…

Ansible基础6——文件模块、jinja2模板

文章目录 一、常用文件模块1.1 blockinfile模块1.2 file模块1.2.1 创建文件并赋予权限1.2.2 创建目录并赋予权限1.2.3 创建软连接1.2.4 删除文件或目录 1.3 fetch模块1.4 lineinfile模块1.5 stat模块1.6 synchronize模块 二、jinja2模板2.1 构建jinja2模板2.2 管理jinja2模板2.…