Mysql数据库入门基础篇--mysql基本了解

news2024/12/22 20:30:47

【Mysql数据库入门基础篇--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.0中不存在了

0racle 官方将frm文件的信息及更多信息移动到叫做序列化字典信息 (Serialized DictionaryInformation,SDI)中,SDI被写在ibd文件内部。

Mysql8.0属于Oradie旗下,同理为了从IBD文件中提取SDI信息,Oracle提供了一个应用程序ibd2sdi。Mysql8.0自带。

到存储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/618545.html

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

相关文章

chatgpt赋能python:Python如何输出在同一行

Python如何输出在同一行 在Python编程中,有时候我们需要将多个输出放在同一行中。这篇文章将介绍几种方法来实现这个任务,并给出一些例子来帮助你更好地理解。 方法一:使用print函数 Python中的print函数默认会在每个输出之间换行。但是&a…

【大数据工具】HBase 集群搭建与基本使用

HBase 集群搭建 HBase 安装包下载地址:https://archive.apache.org/dist/hbase/ 安装 HBase 的前提: ZooKeeper 集群 OKHadoop 集群 OK 1. HBase 集群安装 1. 将 HBase 软件包上传至 Hadoop0 解压并重命名 使用 FileZilla 将 hbase-1.3.1-bin.tar.g…

pytorch中Dataloader读取数据太慢的问题

文章目录 pytorch中Dataloader读取数据太慢的问题1. 方法2. 方法3. 解决方法:提取加载数据 pytorch中Dataloader读取数据太慢的问题 数据读取的速度远远大于GPU训练的速度,导致整个训练流程中有大部分时间都在等待数据发送到GPU,在资源管理器…

七年磨一剑!苹果王炸产品Vision Pro诞生,未来已来

这是第一款「不见却可透见」的苹果产品 等了整整七年!2023年6月5日,WWDC23大会上,苹果发布首款头显Vision Pro,Vision Pro 可以算是苹果公司自 2015 年 Apple Watch 首次亮相以来最大的硬件产品发布,或许它会彻底改变数…

【深度学习】BERT变种—百度ERNIE 1.0

ERNIE: Enhanced Representation through Knowledge Integration是百度在2019年4月的时候,基于BERT模型,做的进一步优化,在中文的NLP任务上得到了state-of-the-art的结果。 ERNIE 是百度开创性提出的基于知识增强的持续学习语义理解框架&…

苹果又一黑科技产品 Apple Vision Pro,正式问世!

公众号关注 “GitHubDaily” 设为 “星标”,每天带你逛 GitHub! 在电影《钢铁侠》中,托尼通过简单的手势动作,配合空间中的虚拟界面,成功将贾维斯创造出来。 当时片中的这个镜头,让无数科幻迷为之疯狂&…

pyspark数据输入

学习目标: 现在只需要知道PDD是一个数据集。 【运行实例(1)】: from pyspark import SparkConf, SparkContext # conf:创建对象;Sparkconf:创建入口;setMaster:运行方式&#xff1…

chatgpt赋能python:Python如何输出两个值

Python如何输出两个值 在Python编程中,经常需要输出多个值。下面我们来介绍几种常用的方法。 方法一:使用逗号分隔符 使用逗号分隔符可以在一行代码中输出多个值。例如: a, b 1, 2 print(a, b) # 输出 1 2在输出时,多个值之…

图解未成年人个人信息保护要求(附下载)

未成年人互联网普及率持续提升。据2023年中国互联网络信息中心发布的第51次《中国互联网络发展状况统计报告》数据,2021年我国未成年人互联网普及率达96.8%;截至2022年12月,使用过短视频的青少年群体占比65.6%,未成年人已成网络参…

【Linux:进程间信号】

文章目录 1 生活角度的信号2 技术应用角度的信号3 信号的产生3.1 由系统调用向进程发信号3.1.1 signal3.1.2 kill3.1.3 raise 3.2 由软件条件产生信号3.3 硬件异常产生信号3.4 通过终端按键产生信号3.5 总结思考一下 4 信号的保存4.1信号其他相关常见概念4.2在内核中的表示4.3 …

如何评价 Facebook 发布的数字货币 Libra?

一句话总结:Libra 最大的亮点,在于它是 Facebook 做的。 随着数字货币市场的迅速发展,各类加密货币层出不穷。然而,在这个领域中,Facebook 所推出的 Libra 显得尤为引人关注。那么,Libra 到底有何特点&…

专家助阵!IoTDB X EMQ 智慧工厂主题 Meetup 讲师曝光!

期待已久的智慧工厂主题 Meetup 活动将在 4 天后线下线上同步举办! 天谋科技将联手 EMQ,通过数据基础设施平台的核心技术与实践经验分享,提供流程协同、运营提效、生产质量保障等智能制造目标的可行方案。快来在推文结尾预约直播,…

【大数据工具】Flink集群搭建

Flink 集群安装 1. 单机版 Flink 安装与使用 1、下载 Flink 安装包并上传至服务器 下载 flink-1.10.1-bin-scala_2.11.tgz 并上传至 Hadoop0 /software 下 2、解压 [roothadoop0 software]# tar -zxvf flink-1.10.1-bin-scala_2.11.tgz3、创建快捷方式 [roothadoop0 soft…

100天精通Python(可视化篇)——第90天:Pyecharts可视化神器基础入门

文章目录 专栏导读一、pyecharts 介绍1. 简介2. 版本说明 二、pyecharts 特点三、pyecharts 安装四、基本步骤五、快速开始1. 数据准备1)类别数据2)时间数据3)颜色数据4)地理数据5)世界人口数据6)选择数据7…

Netty核心源码剖析(三)

1.Pipeline,Handler和HandlerContext创建源码剖析 1.1.三者的关系 1>.每当ServerSocket创建一个新的连接,就会创建一个Socket,对应的就是目标客户端; 2>.每一个新创建的Socket都将会分配一个全新的ChannelPipeline(以下简称pipeline); 3>.每一个ChannelPipeline内…

LKY_OfficeTools 一键优雅的安装并激活你的Office

何为优雅? 说到Office办公软件 相信都不陌生,一般包括Word、Excel、PowerPoint默认三件套,和Outlook、OneNote、Access。 几乎每台电脑都会配置的 但大多数的情况下 都是先去软件仓库下载 Office 然后使用激活工具去激活Office 这种操作听起…

国内首款医疗大语言模型MedGPT发布,专业医疗标注数据成关键

5月25日,国内互联网医院、慢病管理平台医联今日正式发布了自主研发的基于Transformer架构的国内首款医疗大语言模型——MedGPT。 与通用型的大语言模型产品不同,MedGPT主要致力于在真实医疗场景中发挥实际诊疗价值,实现从疾病预防、诊断、治疗…

机器学习 day14 ( 神经网络,计算机视觉中的引用:人脸识别和汽车识别)

神经网络的发展 最开始的动机:是通过构建软件来模拟大脑,但今天的神经网络几乎与大脑的学习方式无关 我们依据大脑中的神经网络,来构建人工神经网络模型。左图中:一个神经元可以看作一个处理单元,它有很多的输入/树突…

图论与算法(6)最小生成树

1. 带权图及实现 1.1 带全图概述 带权图是一种图形结构,其中图中的边具有权重或成本。每条边连接两个顶点,并且具有一个与之关联的权重值,表示了两个顶点之间的某种度量、距离或成本。 带权图可以用邻接矩阵或邻接表来表示。邻接矩阵是一个…

集成电路(芯片)中VCC、VDD、VSS、GND和AGND等概念

IC芯片 Integrated Circuit Chip 即集成电路芯片,是将大量的微电子元器件(晶体管、电阻、电容、二极管等) 形成的集成电路放在一块塑基上,做成一块芯片。目前几乎所有看到的芯片,都可以叫做 IC芯片 。 SOP与DIP SOP(Small Outline Package…