1.Mysql8.0体系结构整体预览
2.Mysql8.0 Server层结构
Connectors
分为Mysql Protocol(socket本地、TCP/IP远程)和API(本地和第三方开发工具的应用程序、开发)
Mysql Server
mysql处理数据时,会由mysqld服务守护进程产生多个线程(主线程+工作线程)在内存中具体操作,并且会在内存中单独申请独立的内存空间进行处理.统称为实例.
Mysql内存结构
Mysql线程
连接层功能
1.负责提供连接协议:socket、TCP/IP
2.提供用户认证:授权表
3.提供一个专用的连接线程:show processlist;
SQL层功能
1.解析预处理
2.优化
3.执行
InnoDB
IDB每个数据页默认16KB,占用4个磁盘Block.连续的64个数据页分一个1MB大小的区,形成连续的Block,提升IO性能.
如果要调整数据页大小等参数,需要在数据库建立时进行设置,一旦数据库运行后无法再修改.
存储结构
文件存储结构
表:数据行(记录) + 元数据(表属性、表列属性、表明)
8.0表存储方式:每张表的数据都存储在ibd中;5.7表存储方式:数据行——ibd 元数据——frm+idbata
表存储结构
Mysql 8.0用户及安全管理
用户的组成
用户名@’白名单’ 例如:matt@’%’、matt@’10.0.0.0.1’、matt@’10.0.0.%’、matt@’localhost’
创建用户
create user matt@'10.0.0.%'identifiedby'123';
sha2:8.0新的特性
native:兼容老版本
create user test@'10.0.0.%' identified with mysql_native_passwordby'123';
查询用户
mysql> select user,host,authentication_string,plugin from mysql.user;
+------------------+-----------+------------------------------------------------------------------------+-----------------------+
| user | host | authentication_string | plugin |
+------------------+-----------+------------------------------------------------------------------------+-----------------------+
| mysql.infoschema | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password |
| mysql.session | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password |
| mysql.sys | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password |
| root | localhost | $A$005$Ey!%WPv/Wy
Uk^suxGMQtr1AgJKWRa8TEqBn7LXZ.XZ6loabFSIFimXC6OLM1 | caching_sha2_password |
+------------------+-----------+------------------------------------------------------------------------+-----------------------+
4 rows in set (0.00 sec)
此命令可以查询mysql中所有存在用户的相关信息
删除用户
mysql> drop user test@'10.0.0.%';
Query OK, 0 rows affected (0.00 sec)
修改用户
mysql> alter user matt@'10.0.0.%' identified with mysql_native_password by '123456';
用户资源管理
密码重用
password_history=6
password_reuse_interval=365
锁定用户
ALTERUSER'old_app_dev'@'localhost'ACCOUNTLOCK;
密码过期时间
select @@default_password_lifetime;
SET PERSIST default_password_lifetime=180;
SET PERSIST default_password_lifetime=0;
CREATE USER'matt'@'localhost' PASSWORD EXPIRE INTERVAL 90DAY;
ALTER USER'matt'@'localhost' PASSWORD EXPIRE INTERVAL 90DAY;
CREATE USER'matt'@'localhost' PASSWORD EXPIRE NEVER;
ALTER USER'matt'@'localhost' PASSWOR DEXPIRE NEVER;
FAILED_LOGIN_ATTEMPTS N
忘记root管理原密码处理方式
1.关闭数据库
/etc/init.d/mysqld stop
2.安全模式启动数据库
[root@localhostdata]# mysqld_safe --skip-grant-tables --skip-networking &
3.登陆数据库
mysql
4.刷新授权表
flush privileges;
5.修改密码
mysql>alter user root@'localhost' identified with mysql_native_passwordby '123';
6.重启数据库到正常模式
[root@localhost data]# /etc/init.d/mysqld restart
密码管理规范
1.123、123456、admin、root等弱口令禁止使用
2.使用三种不同形式的字符,如大小写字母、数字、特殊字符
3.密码长度大于12位
8.0用户方面的新特性
1.密码插件,在8.0中替换为了sha2模式
2.在8.0中不支持grant直接创建用户并授权,必须先建用户后grant授权。
目前,关于密码插件sha2使用客户端工具:navicat、sqlyog工具,不支持(无法连接)主从复制,MGR,不支持新的密码插件的用户老的驱动无法连接数据库
解决方法:
create with mysql_native_password
alter with mysql_native_password
vim /etc/my.cnf
default_authentication_plugin=mysql_native_password
权限级别
GRANT 权限列表 ON 对象 TO 用户;
例如:grant all on *.* to matt@'localhost';
*.*:全库级别——管理员
———>mysql.user
test.*:单库级别——业务层面
———>mysql.db
test.t1:单表级别
———>mysql.tables_priv
select(id,name):列级别
———>mysql.columns_priv
mysql> show privileges; #可以查询所有的权限列表信息
授权管理
生产库:
管理员:ALL权限中不包含Grant option
业务用户:select insert delete update
开发用户—->开发库测试人员—->测试库
开发人员—->SQL审核平台—->生产库管理员
普通权限授权
mysql>grant all on *.* to test@'10.0.0.%';
mysql>grant select,update,delete,insert on *.* to matt@'10.0.0.%';
mysql>grant select,update,delete,insert on test.* to test@'10.0.0.%';
角色创建及授权
mysql>create role dev@'10.0.0.%';
mysql>grant select on* .* to dev@'10.0.0.%';
mysql>grant dev to user2@'10.0.0.%';
mysql.role_edges;
information_schema.user_privileges;
生产中用户类型规范
管理员:ALL
开发:Create,Create routine,Create temporary tables,Create view,Delete ,Event,Execute,Insert,References,Select,Showdatabases,Showview,Trigger,Update
监控:select,replicationslave,clientsupper
备份:ALL
主从:replicationslave
业务:insert,update,delete,select
查看权限
show grants for test@'10.0.0.%';
mysql.user 存放*.*级别的权限
mysql.db 存放db.*级别的权限
权限回收
grant授权是叠加的,并不覆盖之前赋予的权限
mysql>revoke delete on *.* from matt@'10.0.0.%';
Query OK, 0 rows affected(0.01sec)
mysql>show grants for matt@'10.0.0.%';
mysql>revoke select(id) on test.t1 from user1@'10.0.0.%';
MySQL多种连接方式介绍
Socket(本地)
前提:必须创建和授权localhost相关用户
mysql>create user matt@'localhost' identified by '123';
mysql>grant all on *.* to matt@'localhost'withgrantoption;
[root@db01~]# mysql-uroot -p123 -S /tmp/mysql.sock #-S 手动指定sock文件连接数据库
TCP/IP(远程)
前提:必须创建和授权远程网段相关用户
mysql>create user matt@'10.0.0.%'identified by '123';
mysql>grant all on *.* matt@'10.0.0.%'with grant option;
[root@db01]# mysql -umatt -p123 -h 10.0.0.51 -P 3306
如何查看和监控连接情况:
show process list;
select * from information_schema.processlist\G
客户端工具
sqlyog、navicat、workbench
注意:生产中不要用绿色版软件;mysql_native_password插件5.4基于SSL的安全连接
MySQL 8.0初始化配置方式
- 初始化配置文件应用
- 配置示例:
[root@db01]#cat/etc/my.cnf
[mysqld]user=mysql#管理用户
#basedir=/usr/local/mysql57
basedir=/usr/local/mysql8 #软件路径
datadir=/data/mysql/data_3306 #数据路径
socket=/tmp/mysql.sock #socket文件位置
server_id=6#服务器ID,主从时标识不同主机log_bin=/data/mysql/binlog_3306 #二进日志
port=3306 #端口
[mysql]
socket=/tmp/mysql.sock - 标签项:
[mysqld]、[mysql]
影响生效的程序,表现下根的是此标签项程序的相关配置信息
种类:服务端标签和客户端标签
服务器标签:[mysqld]、[mysqld_safe]
客户端标签:[mysql]、[mysqldump]、[client] - 配置项:
user=mysql #用户
port=3306 #端口
server-id=51 #服务ID
basedir=/usr/local/mysql #数据库程序位置
datadir=/data/3306/data #数据位置
socket=/tmp/mysql.sock #socket文件位置
在某个标签下相关配置信息,影响到此标签程序的相关功能
- 配置示例:
- 关于配置文件的调用
- 默认读取位置
[root@db01~]# mysqld --help --verbose|grep my.cnf
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
修改默认读取路径
mysqld_safe --defaults-file=/opt/matt.cnf &
- 指定配置文件应用
mysqld_safe --defaults-file=/opt/oldguo.cnf &
- 默认读取位置
MySQL8.0启动和关闭流程
- 启动方式介绍
systemd—->/etc/init.d/mysqld —->mysql.server—-> mysqld_safe &—->mysqld &
mysqld &
启动日志全部会打印到屏幕—->可以进行问题排查
mysqld_safe &
当mysqld异常crash会尝试去启动mysqld
关闭方式:
[root@db01~]#mysqladmin -uroot -p123 shutdown
db01 [(none)]>shutdown;