1. C/S(客户端/服务端)模型介绍

image.png
TCP/IP方式(远程、本地):
mysql -uroot -p123 -h 10.0.0.15 -P3306
Socket方式(仅本地):
mysql -uroot -p123 -S /tmp/mysql.sock
2. 实例介绍
实例=mysql后台守护进程+ Master Thread + 干活的 Thread+ 与分配的内存
公司=老板+经历+员工+办公室
3. mysqld程序运行原理
-
MySQL在启动过程
- 启动后台守护进程,并生成工作线程
- 预分配内存结构供MySQL处理数据使用
-
实例是什么?
- MySQL的后台进程+线程+预分配的内存结构。
1. SQL语句
结构化的查询语句
DQL 数据查询语言
DDL 数据定义语言
DML 数据操作语言
DCL 数据控制语言
mysql> select user,host from mysql.user;

image.png
连接层
- 提供连接协议(TCP/IP,Socket)
- 验证用户名\密码\IP等合法性
- 开启专用连接线程(接收语句,返回结果)
show processlist; - 将语句交给下一层
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层
- 接收语句
- 语法检查和SQL_MODE
- 语义检查与权限检查
- 解析语句,生成多种执行计划树
- 通过优化器算法(执行代价cpu,IO,Mem)
- 优化器会选择最优的执行方法
- 语句执行器,运行SQL语句
- 提供查询缓存(默认不开启)
- 日志记录(审计日志,通用日志,binlog日志)
存储引擎层(FS)
根据SQL层的执行结果,去测盘上找到相应的数据。找到磁盘上16进制的数据。
再次返回SQL层,结构化成二维表的方式。再由连接层线程,最终展现出来。
MySQL逻辑存储结构
- 库 #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
- 表 #Linux 文件
列(字段)
列属性
数据行(记录) #Linux 数据行
表属性 (元数据) #Linux 文件属性
MySQL物理存储结构
库:使用FS上的目录表示
表:
-
MyISAM(ext2)#淘汰了
- user.frm #存储的表结构(列,列属性)
- user.MYD #存储的数据记录
- user.MYI #存储索引
-
InnoDB(XFS)
- time_zone.frm #存储的表结构(列,列属性)
- time_zone.ibd #存储的数据记录和索引
- ibdata1 #数据字典信息
innoDB 段 区 页
数据行存储:每次默认64个连续的page,也就是1M,我们把它称之为一个区。
MySQL的表根据存储需求,会由多个区构成。我们把表称之为一个段。
一般情况下(非分区表)
一个表就是一个段
一个段由多个区构成
一个区在(16K),64个连续的页,1M大小
用户和权限管理
作用
登录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版本以前,可以自动创建用户并授权
- 创建用户
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)
- 修改用户密码
mysql> alter user oldguo@'10.0.0.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
- 删除用户
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)
权限管理
权限列表
ALL 所有权限:
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(给别人授权的权限)
授权命令
grant all on *.* to oldguo@'10.0.0.%' identified by '123' with grant option;
grant 权限 on 作用目标 to 用户 identified by 密码;
作用目标:
*.*
wordpress.*
wordpress.t1
授权需求
- 创建一个管理员用户root,可以通过10网段,管理数据库
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)
- 创建一个应用用户wordpress,可以通过10网段,wordpress库下的所有表进行增删改查
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)
回收权限
1. 查看权限
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. 回收权限
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
日常启停
mysql.server start ---> mysqld_safe --->mysqld
mysql.service ---> mysqld
需要依赖于/etc/my.cnf维护性的任务
mysqld_safe --skip-grant-tables --skip-networking &
我们一般会将我们需要的参数临时加到命令行。
也会读取/etc/my.cnf的内容,但是如果冲突,命令行优先级最高。
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)影响数据库的启动
2)影响到客户端的功能(如:登录) - 初始化配置的方法
1)初始化配置文件(例如:/etc/my.cnf)
2)启动命令行上进行设置(例如:mysqld_safe mysqld)
3)预编译时设置(仅限于编译安装时设置) - 初始化配置文件的书写格式
[标签]
xxx=xxx
[标签]
xxx=xxx
- 配置文件标签的归类
服务器端标签:
[mysqld]
[mysqld_safe]
[server]
客户端标签:
[mysql]
[mysqladmin]
[mysqldump]
[client] - 配置文件设置模版(5.7)
#服务器端配置
[mysqld]
#用户
user=mysql
#软件安装目录
basedir=/application/mysql
#数据存放目录
datadir=/data00/mysql/data
#socket文件位置
socket=/tmp/mysql.sock
#服务器id号
server_id=6
#服务端口号
port=3306
#客户端配置
[mysql]
#socket文件位置
socket=/tmp/mysql.sock
- 配置文件读取顺序
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文件地址
- 强制使用自定义配置文件
--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命令
⚠️:提前应该将用户授权做好
- 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>
- Socket
mysql -uroot -p
多实例管理
1. 创建多个目录
root@n37-081-120:~# mkdir -p /data00/330{7,8,9}/data
2. 准备配置文件
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. 初始化数据
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. 授权
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>