??一、Mysql5.7 VS Mysql8.0 詳解
1.1 ?字符編碼
mysql5.7和之前版本,默認字符集為latin1,插入中文字符會出現(xiàn)亂碼。在使用5.7及之前的版本時候需要將字符編碼修改為utf8字符集,utf8字符集指的是utf8mb3。
從mysql8.0開始,數(shù)據(jù)庫默認字符編碼改為utf8mb4。
1.2 ?用戶的創(chuàng)建與授權(quán)
#### mysql8.0 用戶的創(chuàng)建 #### 授權(quán)時需要分開執(zhí)行,不能用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 授權(quán)root用戶命令 ####
# grant all privileges on *.* to '用戶名'@'主機' identified by '密碼';
mysql> grant all privileges on *.* to 'root'@'%' identified by 'Zyl@123456';
mysql> flush privileges;
#### Mysql8.0 授權(quán)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 中, 可以將索引通過命令設(shè)置為 隱藏 或 顯示。
對于被隱藏的索引,它不會被查詢優(yōu)化器所使用,我們可以使用這一功能,對相關(guān)的查詢進行性能調(diào)試,通過隱藏或顯示,分析數(shù)據(jù)庫性能差異的原因,同時也可以去除無效的索引。
ALTER TABLE 表名 ALTER INDEX 索引名 INVISIBLE;
例子:
##創(chuàng)建名為idx_row_id的索引
CREATE INDEX idx_row_id ON tab1 ( row_id );
###隱藏索引
ALTER TABLE tab1 ALTER INDEX idx_row_id INVISIBLE;
###恢復(fù)隱藏索引
ALTER TABLE tab1 ALTER INDEX idx_row_id VISIBLE;
1.5 ? 持久化設(shè)置
Mysql 8.0 新增 SET PERSIST 的命令,該命令的配置值保存到數(shù)據(jù)目錄下的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 復(fù)雜的查詢會使用嵌入式表,例如:
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 ? 參數(shù)變化
mysql中想要模糊的查看某一個項目的配置,可以使用百分號%進行通配符搜索。
mysql> show variables like 'mysql%';
query_cahe參數(shù)已經(jīng)不存在
binglog過期時間參數(shù)變更為:
| 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 文檔數(shù)據(jù)庫的需求,而 Mysql 文檔存儲也為 schema-less 模式的 JSON 文檔提供了多文檔事務(wù)支持和完整的 ACID 合規(guī)性。
1.10? 窗口函數(shù)
創(chuàng)建了名為 w 的 window,規(guī)定它對表tab1 中 id 字段進行排序,然后在 select 子句中對 w 執(zhí)行 rank() 方法,將結(jié)果輸出為 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數(shù)據(jù)庫安裝與升級
01-mysql安裝篇(rpm方式安裝+二進制方式安裝)
02-mysql升級篇(rpm方式+二進制方式升級)
??三、Mysql數(shù)據(jù)庫基本使用及常規(guī)配置詳解
2.1 ?? Mysql版本查看及連接
####方式一:服務(wù)器終端命令行####
[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進程查看及服務(wù)啟停
?? 進程查看
[root@db-server ~]# ps -ef | grep mysqld
?? 服務(wù)啟停
####服務(wù)啟動####
[root@db-server ~]# systemctl start mysqld
####服務(wù)停止####
[root@db-server ~]# systemctl stop mysqld
####服務(wù)狀態(tài)查看####
[root@db-server ~]# systemctl status mysqld
####設(shè)置開機自啟####
[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.
####設(shè)置開機不自啟####
[root@db-server ~]# systemctl disable mysqld
Removed symlink /etc/systemd/system/multi-user.target.wants/mysqld.service.
2.3 ?? Mysql密碼策略詳解、修改密碼、授權(quán)root用戶遠程登錄
2.3.1 ?? Mysql密碼策略詳解
mysql8.0 密碼策略變量詳解:
?? validate_password.policy:密碼策略,檢查用戶的密碼。
0:(Low)密碼長度最少8個字符
1:(Mediumpolicy)至少包含1個數(shù)字,1個小寫字母,1個大寫字母和1個特殊字符組成(默認值)
2:(Strongpolicy)長度為4或更長的密碼子字符串不得與字典文件中的單詞匹配
?? validate_password.length:需要密碼最小字符數(shù),默認為8
?? validate_password.number_count:需要密碼的最小數(shù)字字符數(shù),默認為1
?? validate_password.mixed_case_count:需要密碼的小寫和大寫的最小字符數(shù),默認為1
?? validate_password.special_char_count:需要密碼的特殊字符的最小字符數(shù),默認為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 ?? 授權(quán)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>
授權(quán)遠程登錄與5.7語法有所區(qū)別:
?? mysql 5.7:
mysql> grant all privileges on *.* to 'root'@'%' identified by 'Zyl@123456' with grant option;
?? mysql 8.0,需要分開執(zhí)行, 將創(chuàng)建賬戶和賦予權(quán)限分開了:
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權(quán)限:grant select,insert,update,delete on *.* to root'@'%';
賦予超級權(quán)限:grant all privileges on *.* to 'root'@'%' with grant option;
撤銷授權(quán): revoke all privileges on *.* from 'root'@'%';
刷新權(quán)限: flush privileges;
查看權(quán)限: show grants for 'root'@'%';
2.4 ?? Mysql字符集
mysql 8.0之前默認的字符集是latin1,utf8字符集指向的是utf8mb3,從8.0開始默認編碼使用utf8mb4,避免了亂碼產(chǎn)生。
Mysql 各級別的字符集:
-
服務(wù)器級別-----(my.cnf配置)
-
數(shù)據(jù)庫級別-----自動同步服務(wù)器級別字符集
-
表級別-----
ALTER TABLE 表名 DEFAULT CHARSET=‘字符集名’
,或者創(chuàng)建表時,創(chuàng)建語句后面加上"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>
? 修改數(shù)據(jù)庫字符
###alter database 數(shù)據(jù)庫名 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個字節(jié),一般常用字符 1 ~3個字節(jié)就可以表示,而字符集最大長度表示一個字符最大字節(jié)長度,所以會影響存儲和性能,所以產(chǎn)生了utf8mb3 和utf8mb4 兩個概念。
?? utfmb3:閹割版的utf8字符集,只使用 1 ~3個字節(jié)表示字符。
?? utfmb4:正宗的utf8字符集,使用 1 ~4個字節(jié)表示字符,如存儲emoji表情。
2.5 ?? Mysql --sql大小寫規(guī)范與sql_mode
2.5.1 ?? sql大小寫規(guī)范
Mysql 在 Windows 和 Linux 的大小寫規(guī)范不一樣。
在 Windows 下全部都不區(qū)分大小寫。
在 Linux 下:
數(shù)據(jù)庫名、表名、表別名、變量名是嚴格區(qū)分大小寫。
關(guān)鍵字、函數(shù)名稱在 SQL 中不區(qū)分大小寫。
字段名、列別名在所有的情況下都不區(qū)分大小寫。
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語法及數(shù)據(jù)驗證檢查,通過設(shè)置sql_mode可以完成不同嚴格程度的數(shù)據(jù)校驗,有效保障數(shù)據(jù)準確性。
#### 查詢mysql數(shù)據(jù)庫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>
? 寬松模式 與 嚴格模式
?? 寬松模式:插入數(shù)據(jù)時,即使給了一個錯誤數(shù)據(jù),也可能被接受,并且不報錯。
如:在表中,有字段name屬性,字段類型char(10),如果插入數(shù)據(jù)時候,有一條數(shù)據(jù)name值為’zyl@123456789’,超過了設(shè)定字段長度,那么這條數(shù)據(jù)插入,不會報錯,只會截取前10個字符’‘zyl@123456’,這就是寬松模式。
?? 嚴格模式:出現(xiàn)上面情況,應(yīng)該報錯,插入數(shù)據(jù)出錯,所以在數(shù)據(jù)庫生產(chǎn)、開發(fā)、測試等環(huán)境,必須采用嚴格模式。
? 改為嚴格模式可能存在的問題:
sql_mode設(shè)置了含NO_ZERO_DATE,那么不允許插入0日期,插入0日期會拋出錯誤,如字段TIMESTAMP,在沒聲明為NULL或顯示DEFAULT子句,會自動分配DEFAULT ‘0000-00-00 00:00:00’ 零時間戳。不滿足NO_ZERO_DATE而報錯。
?? 1、通過命令臨時設(shè)置sql_mode,重啟后失效:
### 當前會話
SET SESSION sql_mode = '';
### 全局設(shè)置
SET GLOBAL sql_mode = '';
?? 2、修改mysql的配置文件,重啟mysql服務(wù)后生效
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各參數(shù) | 描述 |
---|---|
ONLY_FULL_GROUP_BY | 對于GROUP BY聚合操作,如果在SELECT中的列,沒有在GROUP BY中出現(xiàn),那么這個SQL是不合法的,因為列不在GROUP BY從句中 |
NO_AUTO_VALUE_ON_ZERO | 該值影響自增長列的插入。默認設(shè)置下,插入0或NULL代表生成下一個自增長值。如果用戶 希望插入的值為0,而該列又是自增長的,那么這個選項就有用了 |
STRICT_TRANS_TABLES | 在該模式下,如果一個值不能插入到一個事務(wù)表中,則中斷當前的操作,對非事務(wù)表不做限制 |
STRICT_ALL_TABLES | 如果插入數(shù)據(jù)的第一行內(nèi)容與字段類型兼容,但后續(xù)的數(shù)據(jù)行存在不兼容的情況,則兼容的數(shù)據(jù)正常插入,不兼容的數(shù)據(jù)則會報錯并終止insert操作。 |
NO_ZERO_IN_DATE | 在嚴格模式下,不允許日期和月份為零 |
NO_ZERO_DATE | 設(shè)置該值,mysql數(shù)據(jù)庫不允許插入零日期,插入零日期會拋出錯誤而不是警告 |
ERROR_FOR_DIVISION_BY_ZERO | 在INSERT或UPDATE過程中,如果數(shù)據(jù)被零除,則產(chǎn)生錯誤而非警告。如 果未給出該模式,那么數(shù)據(jù)被零除時MySQL返回NULL |
NO_AUTO_CREATE_USER | 禁止GRANT創(chuàng)建密碼為空的用戶 |
NO_ENGINE_SUBSTITUTION | 如果需要的存儲引擎被禁用或未編譯,那么拋出錯誤。不設(shè)置此值時,用默認的存儲引擎替代,并拋出一個異常 |
PIPES_AS_CONCAT | 將“l(fā)l”作為字符串的鏈接字符操作,而不是作為或運算符,與“concat”相類似。 |
ANSI_QUOTES | 啟用ANSI_QUOTES后,不能用雙引號來引用字符串,因為它被解釋為識別符 |
IGNORE_SPACE | 用于忽略mysql系統(tǒng)函數(shù)與之后的括號之間的空格。 |
?? 不同版本默認的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數(shù)據(jù)庫目錄結(jié)構(gòu)詳解–RPM方式安裝
?? 4.1 查看當前系統(tǒng)mysql有關(guān)目錄
[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、數(shù)據(jù)存儲目錄---存儲mysql運行過程中產(chǎn)生的數(shù)據(jù)
/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服務(wù)配置文件,指定端口、數(shù)據(jù)庫的安裝目錄等參數(shù))
3、相關(guān)命令目錄---存放了控制客服端和服務(wù)端的命令(可執(zhí)行文件)
/usr/bin(mysql、mysqladmin、mysqldump、mysqlcheck、mysqlshow、mysql_upgrade等命令)
/usr/sbin(mysqld命令)
4、啟動腳本---
/etc/rc.d/init.d/(啟動腳本文件mysql的目錄)
??五、Mysql數(shù)據(jù)庫與文件系統(tǒng)關(guān)系詳解
?? 5.1 查看當前有哪些數(shù)據(jù)庫
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test01 |
+--------------------+
5 rows in set (0.00 sec)
mysql>
? 4個mysql安裝自帶的數(shù)據(jù)庫,1個自定義數(shù)據(jù)庫:
?? information_schema----存儲mysql服務(wù)器維護的數(shù)據(jù)庫信息,有哪些表、視圖、觸發(fā)器、列、索引等,這些信息并不是真實數(shù)據(jù),而是一些描述信息,稱之為元數(shù)據(jù)。還存儲了一些以innodb_sys開頭的表(內(nèi)部系統(tǒng)表)。
?? mysql----mysql自帶核心數(shù)據(jù)庫,存儲用戶賬戶及權(quán)限信息,其他一些存儲過程、事件定義信息,運行過程日志、幫助信息、時區(qū)信息等。
?? performance_schema----保存mysql運行過程中的一些狀態(tài)信息,用來監(jiān)控mysql各項性能指標,如最近執(zhí)行過的語句,內(nèi)存使用情況,執(zhí)行花費時長等。
?? sys----主要通過視圖形式把 performance_schema和 information_schema 連接起來,幫助管理員和開發(fā)人員監(jiān)控mysql的技術(shù)性能。
?? test01----自定義數(shù)據(jù)庫
?? 5.2 Mysql數(shù)據(jù)庫在文件系統(tǒng)中的表示詳解
?? 5.2.1 Mysql 5.7數(shù)據(jù)庫目錄文件
如果存儲引擎是InnoDB, 在data目錄下會看到3類文件(.frm、.ibd、.opt):
?? db.opt----存放數(shù)據(jù)庫使用字符集,字符校驗規(guī)則,show create database時顯示數(shù)據(jù)庫默認字符集即db.opt中字符集。
這個文件丟失不影響數(shù)據(jù)庫運行,該文件丟失之后新建表時,找不到數(shù)據(jù)庫的默認字符集,就把character_set_server當成數(shù)據(jù)庫的默認字符集,show create database時顯示character_set_server字符集。
?? .frm----存放數(shù)據(jù)庫的表結(jié)構(gòu)。
?? .ibd----(獨立表空間)存放表數(shù)據(jù)和索引的文件。該表的索引(B+樹)的每個非葉子節(jié)點存儲索引,葉子節(jié)點存儲索引和索引對應(yīng)的數(shù)據(jù)。
如果存儲引擎是myisam, 在data目錄下會看到3類文件(.frm、.myi、.myd):
?? .frm----表定義,是描述表結(jié)構(gòu)的文件。
?? .MYD----(MYData)數(shù)據(jù)信息文件,是表的數(shù)據(jù)文件。
?? .MYI----(MYIndex)索引信息文件,是表數(shù)據(jù)文件中任何索引的數(shù)據(jù)樹。
.MYD與.MYI合在一起相當于.ibd。
?? 5.2.2 Mysql 8.0 數(shù)據(jù)庫目錄文件
如果存儲引擎是InnoDB, 在data目錄下只會看到1類文件(.ibd),沒有.frm、 db.opt文件:
?? ibdata1----系統(tǒng)表空間,默認大小12M。
?? .ibd----獨立表空間(存放表數(shù)據(jù)和索引的文件、數(shù)據(jù)庫的表結(jié)構(gòu)、數(shù)據(jù)庫使用字符集,字符校驗規(guī)則)。
如果存儲引擎是myisam, 在data目錄下會看到3類文件(.sdi、.myi、.myd):
?? .sdi----表定義,是描述表結(jié)構(gòu)的文件(相當于mysql5.7中的.frm)。
?? .MYD----(MYData)數(shù)據(jù)信息文件,是表的數(shù)據(jù)文件。
?? .MYI----(MYIndex)索引信息文件,是表數(shù)據(jù)文件中任何索引的數(shù)據(jù)樹。
?? 注:
1、在一個MySQL服務(wù)器中,系統(tǒng)表空間只有一份。從MySOL5.5.7到MySOL5.6.6之間的各個版本中,我們表中的數(shù)據(jù)都會被默認存儲到這個系統(tǒng)表空間。
2、在MySQL5.6.6以及之后的版本中,InnoDB并不會默認的把各個表的數(shù)據(jù)存儲到系統(tǒng)表空間中,而是為每一個表建立一個獨立表空間,也就是說我們創(chuàng)建了多少個表,就有多少個獨立表空間。使用 獨立表空間來存儲表數(shù)據(jù)的話,會在該表所屬數(shù)據(jù)庫對應(yīng)的子目錄下創(chuàng)建一個表示該獨立表空間的文件,文件名和表名相同。
[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文件內(nèi)部。
Mysql8.0屬于Oradie旗下,同理為了從IBD文件中提取SDI信息,Oracle提供了一個應(yīng)用程序ibd2sdi。Mysql8.0自帶。
到存儲ibd文件的目錄下,執(zhí)行下面的命令,解析.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
#####可以發(fā)現(xiàn)解析后的tab1.txt文件有表結(jié)構(gòu)信息、字符編碼等信息。
?? 5.2.3 系統(tǒng)表空間與獨立表空間設(shè)置
我們可以自己指定使用系統(tǒng)表空間還是獨立表空間來存儲數(shù)據(jù),這個功能由啟動參數(shù) innodb_file_per_table控制,比如說我們想刻意將表數(shù)據(jù)都存儲到系統(tǒng)表空間時,可以在啟動MySOL服務(wù)器的時候這樣配置:文章來源:http://www.zghlxwxcb.cn/news/detail-470570.html
[server]
innodb_file_per_table=0 # 0: 代表使用系統(tǒng)表空間; 1: 代表使用獨立表空間
默認使用獨立表空間:文章來源地址http://www.zghlxwxcb.cn/news/detail-470570.html
mysql> show variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set (0.01 sec)
mysql>
??六、總結(jié)—溫故知新
? Mysql5.7 與 Mysql8.0 區(qū)別
? Mysql數(shù)據(jù)庫基本使用及常規(guī)參數(shù)配置
? Mysql數(shù)據(jù)庫目錄結(jié)構(gòu)了解
? Mysql數(shù)據(jù)庫與文件系統(tǒng)關(guān)系
??【上一篇】 |
??The End?? 點點關(guān)注,收藏不迷路??
|
【下一篇】?? |
到了這里,關(guān)于【Mysql數(shù)據(jù)庫從0到1】-入門基礎(chǔ)篇--mysql基本使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!