02 MySQL體系結(jié)構(gòu)與管理

1. C/S(客戶端/服務(wù)端)模型介紹

image.png
TCP/IP方式(遠(yuǎn)程、本地):
mysql -uroot -p123 -h 10.0.0.15 -P3306
Socket方式(僅本地):
mysql -uroot -p123 -S /tmp/mysql.sock

2. 實例介紹

實例=mysql后臺守護(hù)進(jìn)程+ Master Thread + 干活的 Thread+ 與分配的內(nèi)存
公司=老板+經(jīng)歷+員工+辦公室

3. mysqld程序運行原理

  • MySQL在啟動過程

    • 啟動后臺守護(hù)進(jìn)程,并生成工作線程
    • 預(yù)分配內(nèi)存結(jié)構(gòu)供MySQL處理數(shù)據(jù)使用
  • 實例是什么?

    • MySQL的后臺進(jìn)程+線程+預(yù)分配的內(nèi)存結(jié)構(gòu)。
1. SQL語句
結(jié)構(gòu)化的查詢語句
DQL 數(shù)據(jù)查詢語言
DDL 數(shù)據(jù)定義語言
DML 數(shù)據(jù)操作語言
DCL 數(shù)據(jù)控制語言

mysql> select user,host from mysql.user;
image.png

連接層

  1. 提供連接協(xié)議(TCP/IP,Socket)
  2. 驗證用戶名\密碼\IP等合法性
  3. 開啟專用連接線程(接收語句,返回結(jié)果)
    show processlist;
  4. 將語句交給下一層
mysql> show processlist;
+----+------+-----------+------+---------+------+----------+------------------+
| Id | User | Host      | db   | Command | Time | State    | Info             |
+----+------+-----------+------+---------+------+----------+------------------+
|  6 | root | localhost | NULL | Query   |    0 | starting | show processlist |
+----+------+-----------+------+---------+------+----------+------------------+
1 row in set (0.00 sec)

mysql> show processlist;
+----+------+-----------+------+---------+------+----------+------------------+
| Id | User | Host      | db   | Command | Time | State    | Info             |
+----+------+-----------+------+---------+------+----------+------------------+
|  6 | root | localhost | NULL | Query   |    0 | starting | show processlist |
|  7 | root | localhost | NULL | Sleep   |    3 |          | NULL             |
+----+------+-----------+------+---------+------+----------+------------------+
2 rows in set (0.00 sec)

SQL層

  1. 接收語句
  2. 語法檢查和SQL_MODE
  3. 語義檢查與權(quán)限檢查
  4. 解析語句,生成多種執(zhí)行計劃樹
  5. 通過優(yōu)化器算法(執(zhí)行代價cpu,IO,Mem)
  6. 優(yōu)化器會選擇最優(yōu)的執(zhí)行方法
  7. 語句執(zhí)行器,運行SQL語句
  8. 提供查詢緩存(默認(rèn)不開啟)
  9. 日志記錄(審計日志,通用日志,binlog日志)

存儲引擎層(FS)

根據(jù)SQL層的執(zhí)行結(jié)果,去測盤上找到相應(yīng)的數(shù)據(jù)。找到磁盤上16進(jìn)制的數(shù)據(jù)。
再次返回SQL層,結(jié)構(gòu)化成二維表的方式。再由連接層線程,最終展現(xiàn)出來。

MySQL邏輯存儲結(jié)構(gòu)

  1. 庫 #Linux目錄
mysql> create database wordpress charset utf8mb4;          #  mkdir /wordpress
Query OK, 1 row affected (0.01 sec)

mysql> show databases;                    # ls /
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| wordpress          |
+--------------------+
5 rows in set (0.00 sec)

mysql> use wordpress             # cd /wordpress
Database changed
  1. 表 #Linux 文件
    列(字段)
    列屬性
    數(shù)據(jù)行(記錄) #Linux 數(shù)據(jù)行
    表屬性 (元數(shù)據(jù)) #Linux 文件屬性

MySQL物理存儲結(jié)構(gòu)

庫:使用FS上的目錄表示
表:

  • MyISAM(ext2)#淘汰了

    • user.frm #存儲的表結(jié)構(gòu)(列,列屬性)
    • user.MYD #存儲的數(shù)據(jù)記錄
    • user.MYI #存儲索引
  • InnoDB(XFS)

    • time_zone.frm #存儲的表結(jié)構(gòu)(列,列屬性)
    • time_zone.ibd #存儲的數(shù)據(jù)記錄和索引
    • ibdata1 #數(shù)據(jù)字典信息

innoDB 段 區(qū) 頁

數(shù)據(jù)行存儲:每次默認(rèn)64個連續(xù)的page,也就是1M,我們把它稱之為一個區(qū)。
MySQL的表根據(jù)存儲需求,會由多個區(qū)構(gòu)成。我們把表稱之為一個段。
一般情況下(非分區(qū)表)
一個表就是一個段
一個段由多個區(qū)構(gòu)成
一個區(qū)在(16K),64個連續(xù)的頁,1M大小

用戶和權(quán)限管理

作用

登錄MySQL
管理MySQL

用戶的定義

用戶名@'白名單'

wordpress@'%'
wordpress@'localhost'
wordpress@'127.0.0.1'
wordpress@'10.0.0.%'
wordpress@'10.0.0.5%'
wordpress@'10.0.0.0/255.255.254.0'
wordpress@'10.0.%'

用戶的操作

mysql> create user oldboy@'10.0.0.%' identified by '123';
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host from mysql.user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| oldboy        | 10.0.0.%  |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
4 rows in set (0.00 sec)

8.0版本以前,可以自動創(chuàng)建用戶并授權(quán)

  1. 創(chuàng)建用戶
mysql> grant all on *.* to oldguo@'10.0.0.%' identified by '123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select user,host from mysql.user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| oldboy        | 10.0.0.%  |
| oldguo        | 10.0.0.%  |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
5 rows in set (0.00 sec)
  1. 修改用戶密碼
mysql> alter user oldguo@'10.0.0.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
  1. 刪除用戶
mysql> drop user oldguo@'10.0.0.%';
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host from mysql.user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| oldboy        | 10.0.0.%  |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
4 rows in set (0.00 sec)

權(quán)限管理

權(quán)限列表

ALL 所有權(quán)限:
SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE

with grant option(給別人授權(quán)的權(quán)限)

授權(quán)命令

grant all on *.* to oldguo@'10.0.0.%' identified by '123' with grant option;
grant 權(quán)限 on 作用目標(biāo) to 用戶 identified by 密碼;
作用目標(biāo):
  *.* 
  wordpress.* 
  wordpress.t1

授權(quán)需求

  1. 創(chuàng)建一個管理員用戶root,可以通過10網(wǎng)段,管理數(shù)據(jù)庫
mysql> grant all on *.* to root@'1.0.0.%' identified by '123' with grant option;
Query OK, 0 rows affected, 1 warning (0.00 sec)
  1. 創(chuàng)建一個應(yīng)用用戶wordpress,可以通過10網(wǎng)段,wordpress庫下的所有表進(jìn)行增刪改查
mysql> grant SELECT, INSERT, UPDATE, DELETE on wordpress.* to wordpress@'10.0.0.%' identified by '123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

回收權(quán)限

1. 查看權(quán)限
mysql> show grants for wordpress@'10.0.0.%';
+---------------------------------------------------------------------------------+
| Grants for wordpress@10.0.0.%                                                   |
+---------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wordpress'@'10.0.0.%'                                    |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `wordpress`.* TO 'wordpress'@'10.0.0.%' |
+---------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

2. 回收權(quán)限
mysql> revoke delete on `wordpress`.* from 'wordpress'@'10.0.0.%';
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for wordpress@'10.0.0.%';
+-------------------------------------------------------------------------+
| Grants for wordpress@10.0.0.%                                           |
+-------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wordpress'@'10.0.0.%'                            |
| GRANT SELECT, INSERT, UPDATE ON `wordpress`.* TO 'wordpress'@'10.0.0.%' |
+-------------------------------------------------------------------------+
2 rows in set (0.00 sec)

MySQL的啟動方式

image.png
  1. 日常啟停
    mysql.server start ---> mysqld_safe --->mysqld
    mysql.service ---> mysqld
    需要依賴于/etc/my.cnf

  2. 維護(hù)性的任務(wù)
    mysqld_safe --skip-grant-tables --skip-networking &
    我們一般會將我們需要的參數(shù)臨時加到命令行。
    也會讀取/etc/my.cnf的內(nèi)容,但是如果沖突,命令行優(yōu)先級最高。

root@n37-081-120:~#  /etc/init.d/mysqld stop
[ ok ] Stopping mysqld (via systemctl): mysqld.service.
root@n37-081-120:~# mysqld_safe &
[1] 372929
root@n37-081-120:~# 2025-11-26T07:01:30.288800Z mysqld_safe Logging to '/data00/mysql/data/n37-081-120.err'.
2025-11-26T07:01:30.319864Z mysqld_safe Starting mysqld daemon with databases from /data00/mysql/data

root@n37-081-120:~# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.26 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

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> ^DBye
root@n37-081-120:~# mysqladmin -uroot -p123 shutdown
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
2025-11-26T07:01:55.545164Z mysqld_safe mysqld from pid file /data00/mysql/data/n37-081-120.pid ended
[1]+  Done                    mysqld_safe

初始化配置

  1. 作用
    1)影響數(shù)據(jù)庫的啟動
    2)影響到客戶端的功能(如:登錄)
  2. 初始化配置的方法
    1)初始化配置文件(例如:/etc/my.cnf)
    2)啟動命令行上進(jìn)行設(shè)置(例如:mysqld_safe mysqld)
    3)預(yù)編譯時設(shè)置(僅限于編譯安裝時設(shè)置)
  3. 初始化配置文件的書寫格式
[標(biāo)簽]
xxx=xxx
[標(biāo)簽]
xxx=xxx
  1. 配置文件標(biāo)簽的歸類
    服務(wù)器端標(biāo)簽:
    [mysqld]
    [mysqld_safe]
    [server]
    客戶端標(biāo)簽:
    [mysql]
    [mysqladmin]
    [mysqldump]
    [client]
  2. 配置文件設(shè)置模版(5.7)
#服務(wù)器端配置
[mysqld]
#用戶
user=mysql
#軟件安裝目錄
basedir=/application/mysql
#數(shù)據(jù)存放目錄
datadir=/data00/mysql/data
#socket文件位置
socket=/tmp/mysql.sock
#服務(wù)器id號
server_id=6
#服務(wù)端口號
port=3306
#客戶端配置
[mysql]
#socket文件位置
socket=/tmp/mysql.sock
  1. 配置文件讀取順序
root@n37-081-120:/data00/mysql/data# mysql --help --verbose | grep my.cnf
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf 

mysql -uroot -p -S socket文件地址
  1. 強制使用自定義配置文件
    --defaults-file
root@n37-081-120:~# cat /etc/systemd/system/mysqld.service 
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/application/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000

MySQL的連接管理

mysql命令

??:提前應(yīng)該將用戶授權(quán)做好

  1. TCPIP:
    mysql -uroot -p -h 10.37.81.120 -P3306
mysql> grant all on *.* to root@'10.37.81.%' identified by '123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

root@n37-081-120:~# mysql -uroot -p -h 10.37.81.120 -P3306
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.26 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

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> 
  1. Socket
    mysql -uroot -p

多實例管理

1. 創(chuàng)建多個目錄
root@n37-081-120:~# mkdir -p /data00/330{7,8,9}/data

2. 準(zhǔn)備配置文件
cat > /data00/3307/my.cnf << EOF
[mysqld]
basedir=/application/mysql
datadir=/data00/3307/data
socket=/data00/3307/mysql.sock
log_error=/data00/3307/mysql.log
server_id=7
port=3307
log_bin=/data00/3307/mysql-bin
EOF

cat > /data00/3308/my.cnf << EOF
[mysqld]
basedir=/application/mysql
datadir=/data00/3308/data
socket=/data00/3308/mysql.sock
log_error=/data00/3308/mysql.log
server_id=8
port=3308
log_bin=/data00/3308/mysql-bin
EOF

cat > /data00/3309/my.cnf << EOF
[mysqld]
basedir=/application/mysql
datadir=/data00/3309/data
socket=/data00/3309/mysql.sock
log_error=/data00/3309/mysql.log
server_id=9
port=3309
log_bin=/data00/3309/mysql-bin
EOF

3. 初始化數(shù)據(jù)
mysqld --initialize --user=mysql --basedir=/application/mysql/ --datadir=/data00/3307/data/
mysqld --initialize --user=mysql --basedir=/application/mysql/ --datadir=/data00/3308/data/
mysqld --initialize --user=mysql --basedir=/application/mysql/ --datadir=/data00/3309/data/

4. systemd管理多實例
root@n37-081-120:~# cd /etc/systemd/system/
root@n37-081-120:/etc/systemd/system# cp mysqld.service mysqld3307.service 
root@n37-081-120:/etc/systemd/system# cp mysqld.service mysqld3308.service 
root@n37-081-120:/etc/systemd/system# cp mysqld.service mysqld3309.service

root@n37-081-120:/etc/systemd/system# vim mysqld3307.service 
#修改為:
ExecStart=/application/mysql/bin/mysqld --defaults-file=/data00/3307/my.cnf
root@n37-081-120:/etc/systemd/system# vim mysqld3308.service 
#修改為:
ExecStart=/application/mysql/bin/mysqld --defaults-file=/data00/3308/my.cnf
root@n37-081-120:/etc/systemd/system# vim mysqld3309.service 
#修改為:
ExecStart=/application/mysql/bin/mysqld --defaults-file=/data00/3309/my.cnf

root@n37-081-120:/etc/systemd/system# grep "ExecStart" mysqld3307.service 
ExecStart=/application/mysql/bin/mysqld --defaults-file=/data00/3307/my.cnf
root@n37-081-120:/etc/systemd/system# grep "ExecStart" mysqld3308.service 
ExecStart=/application/mysql/bin/mysqld --defaults-file=/data00/3308/my.cnf
root@n37-081-120:/etc/systemd/system# grep "ExecStart" mysqld3309.service 
ExecStart=/application/mysql/bin/mysqld --defaults-file=/data00/3309/my.cnf
root@n37-081-120:/etc/systemd/system# 

5. 授權(quán)
root@n37-081-120:/etc/systemd/system# chown -R mysql.mysql /data00/*

6. 啟動
root@n37-081-120:/etc/systemd/system# systemctl start mysqld3307.service 
root@n37-081-120:/etc/systemd/system# systemctl start mysqld3308.service 
root@n37-081-120:/etc/systemd/system# systemctl start mysqld3309.service

7. 驗證多實例
root@n37-081-120:/etc/systemd/system# netstat -lntp | grep mysqld
tcp6       0      0 :::3306                 :::*                    LISTEN      557190/mysqld       
tcp6       0      0 :::3307                 :::*                    LISTEN      766463/mysqld       
tcp6       0      0 :::3308                 :::*                    LISTEN      766666/mysqld       
tcp6       0      0 :::3309                 :::*                    LISTEN      766855/mysqld

root@n37-081-120:/etc/systemd/system# mysql -S /data00/3307/mysql.sock -uroot -p -e "select @@server_id"
Enter password: 
+-------------+
| @@server_id |
+-------------+
|           7 |
+-------------+
root@n37-081-120:/etc/systemd/system# mysql -S /data00/3308/mysql.sock -uroot -p -e "select @@server_id"
Enter password: 
+-------------+
| @@server_id |
+-------------+
|           8 |
+-------------+
root@n37-081-120:/etc/systemd/system# mysql -S /data00/3309/mysql.sock -uroot -p -e "select @@server_id"
Enter password: 
+-------------+
| @@server_id |
+-------------+
|           9 |
+-------------+

8. 密碼過期修改密碼
root@n37-081-120:/etc/systemd/system# mysql -S /data00/3309/mysql.sock -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.26-log

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

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> set password = password('123');
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容