[转帖]第二章 MySQL的体系结构与基础管理

第二章,mysql,体系结构,基础,管理 · 浏览次数 : 0

小编点评

**升级到 MySQL 8.0.2011.5.1 之前检测** ```sql mysqlsh root:123@10.0.0.51:3317 -e \"util.checkForServerUpgrade()\" >>/tmp/up.log11.5.2 ``` **安装 新版本软件 8.0.20ok。b。 停原库** ```sql mysql> set global innodb_fast_shutdown=0 ;mysql> select @@innodb_fast_shutdown;mysql> shutdown ;c. 使用高版本软件(8.0.20)挂低版本(5.7.30)数据启动[root@db01 data]# vim /data/3317/my.cnf [mysqld]user=mysqlbasedir=/usr/local/mysqldatadir=/data/3317/datasocket=/tmp/mysql3317.sockport=3317[root@db01 data]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3317/my.cnf --skip-grant-tables --skip-networking &d. 重启数据库到正常状态[root@db01 data]# mysqladmin -S /tmp/mysql3317.sock shutdown[root@db01 data]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3317/my.cnf &11.5 ``` **归纳总结以上内容,生成内容时需要带简单的排版**

正文

第二章 MySQL的体系结构与基础管理

https://www.jianshu.com/p/6d017ac5e685

 

本课程,适合具备一定Linux运维或者开发基础的朋友,课程定级中、高级DBA。
只要掌握80%,轻松助力薪资15k-25K。
课程内容均来自与MySQL官网+MySQL源码。
配套精品视频(2021 5月全新录制,版权所有:郭加磊 oldguo。),获取方法私聊。

1. MySQL C/S结构

Clinet : mysql mysqldump ,sqlyog,API
Server : mysqld守护进程

 
image.png

2. 实例(instance)

实例: mysqld + 线程(Master thread , IO ,SQL ,purge...) + 预分配内存(数据\日志\线程)
公司: boss + 员工(总经理+普通员工) + 办公室

3. MySQL服务的构成

 
image.png

3.1 Server层

a. 连接层

b. SQL 层

3.2 engine 存储引擎层

4. 对象存储结构和逻辑结构的对比

逻辑结构:

库 : 库名,库属性(字符集,校对规则)
表 : 列+行+表属性+表名

存储结构:

库---> 目录
表---> xx.ibd ---> 区(extents)---->页(pages)

5. 用户管理

5.1 作用

登陆数据库
管理数据库对象

5.2 长成啥样?

名字@'白名单'
白名单? ----> 在白名单中的IP才能连MySQL
oldguo@'localhost' --> 本地用户
oldguo@'10.0.0.2' --> 单一IP
oldguo@'10.0.0.%' --> 范围IP
oldguo@'10.0.0.5%' --> 范围IP
oldguo@'10.0.0.0/255.255.254.0' --> 范围IP
oldguo@'%' --> 范围IP

安全规范:

a. 白名单尽量小,最好细化到单一IP, %要不得.
b. 用户名有特点.
c. 无用的用户要删除或者锁定.
d. 密码超过三种复杂度,12位以上.

5.3 查\增\删\改

5.3.1 查询

mysql> desc mysql.user;
mysql> select user,host ,authentication_string ,plugin from mysql.user;
mysql> select user as "用户",host as "白名单" ,authentication_string as "密码",plugin as "插件" from mysql.user;
mysql> select user as "用户",host as "白名单" ,plugin as "插件" from mysql.user;

5.3.2 创建用户

mysql> create user oldboy@'10.0.0.%' identified by '123';
mysql> create user oldguo@'10.0.0.%' identified with mysql_native_password by '123';

命令不会,看帮助.
mysql> help create user;

5.5.3 彩蛋:

  • 8.0 之后必须先建用户后授权,grant不再支持建用户功能和密码修改功能;
  • 密码插件,8.0之前使用mysql_native_password,8.0 之后使用caching_sha2_password
  • 导致的问题: 使用老的客户端程序,连接不了8.0版本
    解决方法:
    a. 建用户时,指定mysql_native_password插件进行密码加密.
    b. 修改用户时,可以修改插件
    c. 配置文件中指定默认加密插件为mysql_native_password

5.3.4 修改用户

mysql> alter user oldboy@'10.0.0.%'  identified with mysql_native_password by '123';
mysql> select user as "用户",host as "白名单" ,plugin as "插件" from mysql.user;

mysql> alter user oldboy@'10.0.0.%' ACCOUNT LOCK;
mysql> alter user oldboy@'10.0.0.%' ACCOUNT UNLOCK;

5.3.5 删除用户

mysql> drop user oldboy@'10.0.0.%';

6. 权限管理

6.1 作用

约束用户能够对数据库对象(库,表)干啥(SQL).

6.2 权限列表

mysql> SHOW PRIVILEGES;
ALL ?   除了Grant option所有权限.

2.3 授权

grant 权限 on 权限范围 to 用户;
权限范围?
*.* 全局范围,包含了所有库表 chmod 777 -R /
wordpress.* 单库范围 chmod 777 -R /wordpress
wordpress.t1 单表

mysql> create user root@'10.0.0.%' identified with mysql_native_password by '123';
mysql> grant all on *.* to  root@'10.0.0.%';
mysql> create user wp_user@'10.0.0.%' identified with mysql_native_password by '123';
mysql> grant select,update,delete,insert  on wordpress.* to  wp_user@'10.0.0.%';

6.4 查询用户权限

6.4.1 专用命令

mysql> show grants for wp_user@'10.0.0.%';

6.4.2. 授权表查询

use mysql ;
user         :  user  host auth plugin  全局授权(*.*)的权限   
db           :  user  host              单库范围授权(wordpress.* )的用户权限
table_priv   :  user  host              单表范围授权(wordpress.t1)的用户权限

6.5 回收权限

mysql> revoke delete  ON `wordpress`.* from `wp_user`@`10.0.0.%`;
mysql> show grants for wp_user@'10.0.0.%';

6.6 角色 role MySQL 8.0 中的role支持

需求
oldguo.*  rw(insert,update,delete,select)     --->oldguo_rw
oldguo.*  r (select)                          --->oldguo_r

mysql> create role oldguo_rw,oldboy_r;
mysql> grant select on oldguo.* to oldboy_r;
mysql> grant select,update,insert,delete  on oldguo.* to oldguo_rw;
mysql> create user user1@'%' identified by '123';
mysql> create user user2@'%' identified by '123';
mysql> grant oldguo_r  to user1@'%';
mysql> grant oldguo_rw  to user2@'%';

6.7 彩蛋 本地管理员root@'localhost',密码忘记(误删除\误修改)

a. 重启数据库到无验证模式 
[root@db01 ~]# /etc/init.d/mysqld stop
[root@db01 ~]# mysqld_safe --skip-grant-tables --skip-networking &
b. 登录改密码 
[root@db01 ~]# mysql
mysql> flush privileges;
mysql> alter user root@'localhost' identified by '123';
c. 正常启动数据库
[root@db01 ~]# /etc/init.d/mysqld restart

6.8 彩蛋: 如何暴力破解弱口令

 

7. 连接管理

7.1 自带客户端程序

7.1.1 mysql

(1) 本地 socket文件连接 
条件: localhost用户需要提前创建.
[root@db01 ~]# mysql -uroot -p123 -S /tmp/mysql.sock
(2) 网络连接串(TCP/IP)
条件: 远程连接用户必须出现在白名单.
[root@db01 ~]# mysql -uoldguo -p123 -h10.0.0.51 -P3306

7.2 开发工具

sqlyog 
navicat 
workbench 

7.3 程序(驱动)连接

php 
python
go
java
等。

8. 配置文件

8.1 方式

a. 源码包,编译时配置一些参数(CMAKE)
b. 配置文件
c. 命令行指定

8.2 配置文件应用

8.2.1 配置文件的默认读取路径

[root@db01 ~]# mysqld --help --verbose |grep my.cnf
/etc/my.cnf     /etc/mysql/my.cnf     /usr/local/mysql/etc/my.cnf      ~/.my.cnf 

注意:
a. 多个文件会依次从左到右读取,如果有重复,最后读取的生效.
b. 启动时,强制指定读取哪个配置文件(--defaults-file=/opt/aa.txt),mysqld mysqld_safe 程序能够调用

8.2.2 基本结构

[mysqld]
user=mysql
basedir=/usr/local/mysql 
datadir=/data/3306/data
port=3306 
socket=/tmp/mysql.sock 
[client]
socket=/tmp/mysql.sock

[标签] :
[服务端]:  [mysqld]  [mysqld_safe]  [server]
影响: 数据库启动,初始化.
[客户端]:  [mysql] [mysqldump]     [client]
影响:  只影响到本机客户端程序运行.

9. 启动关闭

9.1 启动方式

mysqld & 
mysqld_safe & 
mysql.server start
service  start    systemd   start 

9.2 关闭方式

mysql.server stop 
sys-v  systemd  stop
mysqladmin -uroot -p123 shutdown  
shutdown 

10. 多实例

10.1 同版本

10.1.1 多套目录

mkdir -p /data/330{7..9}/data 
chown -R mysql. /data

10.1.2 配置文件

cat >/data/3307/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql 
datadir=/data/3307/data
port=3307 
socket=/tmp/mysql3307.sock 
EOF

cat >/data/3308/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql 
datadir=/data/3308/data
port=3308 
socket=/tmp/mysql3308.sock 
EOF


cat >/data/3309/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql 
datadir=/data/3309/data
port=3309 
socket=/tmp/mysql3309.sock 
EOF

10.1.3 初始化数据

mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3307/data
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3308/data
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3309/data

10.1.4 启动数据库

mysqld_safe --defaults-file=/data/3307/my.cnf &
mysqld_safe --defaults-file=/data/3308/my.cnf &
mysqld_safe --defaults-file=/data/3309/my.cnf &


cat >/etc/systemd/system/mysqld3307.service <<EOF
[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=/usr/local/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf
LimitNOFILE = 5000
EOF

cat >/etc/systemd/system/mysqld3308.service <<EOF
[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=/usr/local/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf
LimitNOFILE = 5000
EOF

cat >/etc/systemd/system/mysqld3309.service <<EOF
[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=/usr/local/mysql/bin/mysqld --defaults-file=/data/3309/my.cnf
LimitNOFILE = 5000
EOF


systemctl start mysqld3307
systemctl start mysqld3308
systemctl start mysqld3309

10.2 多版本多实例

10.2.1 5.6和5.7 解压和软连接

[root@db01 opt]# ln -s /opt/mysql-5.7.30-linux-glibc2.12-x86_64 /usr/local/mysql57
[root@db01 opt]# ln -s /opt/mysql-5.6.46-linux-glibc2.12-x86_64  /usr/local/mysql56

10.2.2 目录及授权

mkdir -p /data/331{6..7}/data 
chown -R mysql. /data

10.2.3 配置文件

cat >/data/3316/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql56 
datadir=/data/3316/data
port=3316 
socket=/tmp/mysql3316.sock 
EOF

cat >/data/3317/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql57 
datadir=/data/3317/data
port=3317 
socket=/tmp/mysql3317.sock 
EOF

10.2.4 初始化数据

/usr/local/mysql57/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql57 --datadir=/data/3317/data
/usr/local/mysql56/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql56 --datadir=/data/3316/data

10.2.5 启动

[root@db01 opt]# /usr/local/mysql56/bin/mysqld_safe --defaults-file=/data/3316/my.cnf &
[root@db01 opt]# /usr/local/mysql57/bin/mysqld_safe --defaults-file=/data/3317/my.cnf &

10.2.6 连接

[root@db01 opt]# mysql -S /tmp/mysql3307.sock
[root@db01 opt]# mysql -S /tmp/mysql3316.sock
[root@db01 opt]# mysql -S /tmp/mysql3317.sock

11. 升级

11.1 升级方式

a. inplace (就地升级)
适合于有主从环境.
b. merging (逻辑备份迁移升级)

11.2 升级注意事项(INPLACE)

来自于MySQL官网
Upgrade is only supported between General Availability (GA) releases.
Upgrade from MySQL 5.6 to 5.7 is supported. Upgrading to the latest release is recommended before upgrading to the next version. For example, upgrade to the latest MySQL 5.6 release before upgrading to MySQL 5.7.
Upgrade that skips versions is not supported. For example, upgrading directly from MySQL 5.5 to 5.7 is not supported.
Upgrade within a release series is supported. For example, upgrading from MySQL 5.7.x to 5.7.y is supported. Skipping a release is also supported. For example, upgrading from MySQL 5.7.x to 5.7.z is supported.

翻译:
a. 支持GA版本之间升级
b. 5.6--> 5.7 ,先将5.6升级至最新版,再升级到5.7
c. 5.5 ---> 5.7 ,先将5.5 升级至最新,再5.5---> 5.6最新,再5.6--->5.7 最新
d. 回退方案要提前考虑好,最好升级前要备份(特别是往8.0版本升级)。
e. 降低停机时间(停业务的时间)

11.3 INPLACE 升级过程原理

1.备份原数据库数据
2. 安装新版本软件
3. 关闭原数据库(挂维护页
4. 使用新版本软件 “挂” 旧版本数据启动(--skip-grant-tables ,--skip-networking)
5. 升级 : 只是升级系统表。升级时间和数据量无关的。
6. 正常重启数据库。
7. 验证各项功能是否正常。
8. 业务恢复。

11.4 5.6.48 ----> 5.7.30 Inplace 升级演练

11.4.1 安装 新版本软件 5.7.30

ok。

11.4.2 停原库 ,做冷备.

a. 快速关库功能关闭(优雅关闭)

连接到数据库中(5.6.48),执行以下语句:
[root@db01 ~]# mysql -S /tmp/mysql3316.sock -e "set global innodb_fast_shutdown=0 ;"
[root@db01 ~]# mysql -S /tmp/mysql3316.sock -e "select @@innodb_fast_shutdown ;"
[root@db01 ~]# /usr/local/mysql56/bin/mysqladmin -S /tmp/mysql3316.sock  shutdown 

b. 冷备:

[root@db01 ~]# cp -r /data/3316/data/ /tmp/bak

c. 使用高版本软件(5.7.30)挂低版本(5.6.48)数据启动

[root@db01 data]# vim /data/3316/my.cnf 
[mysqld]
user=mysql
basedir=/usr/local/mysql57
datadir=/data/3316/data
socket=/tmp/mysql3316.sock
port=3316
innodb_fast_shutdown=0

[root@db01 data]# /usr/local/mysql57/bin/mysqld_safe --defaults-file=/data/3316/my.cnf --skip-grant-tables --skip-networking &

d. 升级 (升级到8.0可以省略)

[root@db01 data]# /usr/local/mysql57/bin/mysql_upgrade -S /tmp/mysql3316.sock --force 

e. 重启数据库到正常状态

[root@db01 data]# /usr/local/mysql57/bin/mysqladmin -S /tmp/mysql3316.sock shutdown
[root@db01 data]# /usr/local/mysql57/bin/mysqld_safe --defaults-file=/data/3316/my.cnf &

11.5 Mysql 5.7.30 Inplace升级到MySQL 8.0.20

11.5.1 升级之前的预检查

a. 安装mysqlsh

[root@db01 opt]# tar xf mysql-shell-8.0.20-linux-glibc2.12-x86-64bit.tar.gz 
[root@db01 opt]# ln -s /opt/mysql-shell-8.0.20-linux-glibc2.12-x86-64bit /usr/local/mysqlsh
[root@db01 opt]# cd /usr/local/mysqlsh/
[root@db01 bin]# vim /etc/profile
export PATH=/usr/local/mysqlsh/bin:$PATH
[root@db01 bin]# source /etc/profile
[root@db01 bin]# mysqlsh --version
mysqlsh   Ver 8.0.20 for Linux on x86_64 - for MySQL 8.0.20 (MySQL Community Server (GPL))

b. 在5730数据库中创建链接用户

[root@db01 bin]# mysql -S /tmp/mysql3317.sock
mysql> create user root@'10.0.0.%' identified with mysql_native_password by '123';
mysql> grant all on *.* to root@'10.0.0.%';

c. 升级前检测

[root@db01 ~]# mysqlsh root:123@10.0.0.51:3317 -e "util.checkForServerUpgrade()" >>/tmp/up.log

11.5.2 正式升级

a. 安装 新版本软件 8.0.20

ok。

b. 停原库

# 1. 快速关库功能关闭(优雅关闭)  

连接到数据库中(5.7.30),执行以下语句。

mysql> set global innodb_fast_shutdown=0 ;
mysql> select @@innodb_fast_shutdown;
mysql> shutdown ;

c. 使用高版本软件(8.0.20)挂低版本(5.7.30)数据启动

[root@db01 data]# vim /data/3317/my.cnf 
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3317/data
socket=/tmp/mysql3317.sock
port=3317

[root@db01 data]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3317/my.cnf --skip-grant-tables --skip-networking &

d. 重启数据库到正常状态

[root@db01 data]# mysqladmin -S /tmp/mysql3317.sock shutdown
[root@db01 data]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3317/my.cnf &

 

与[转帖]第二章 MySQL的体系结构与基础管理相似的内容:

[转帖]第二章 MySQL的体系结构与基础管理

第二章 MySQL的体系结构与基础管理 https://www.jianshu.com/p/6d017ac5e685 本课程,适合具备一定Linux运维或者开发基础的朋友,课程定级中、高级DBA。只要掌握80%,轻松助力薪资15k-25K。课程内容均来自与MySQL官网+MySQL源码。配套精品视频

[转帖]第五章 MySQL 存储引擎

第五章 MySQL 存储引擎 https://www.jianshu.com/p/d12191803f17 本课程,适合具备一定Linux运维或者开发基础的朋友,课程定级中、高级DBA。只要掌握80%,轻松助力薪资15k-25K。课程内容均来自与MySQL官网+MySQL源码。配套精品视频(2021

[转帖]第一章 MySQL 8.0 介绍及安装配置

第一章 MySQL 8.0 介绍及安装配置 https://www.jianshu.com/p/d190c6b3520d 本课程,适合具备一定Linux运维或者开发基础的朋友,课程定级中、高级DBA。只要掌握80%,轻松助力薪资15k-25K。课程内容均来自与MySQL官网+MySQL源码。配套精品

[转帖]深入理解mysql-第十二章 mysql查询优化-Explain 详解(下)

我们前面两章详解了Explain的各个属性,我们看到的都是mysql已经生成的执行计划,那这个执行计划的是如何生成的?我们能看到一些过程指标数据吗?实际mysql贴心为我们提供了执行计划的各项成本评估指标的以及优化器生成执行计划的整个过程的方法。 一、查看执行计划计算的成本数据 我们上边介绍的EXP

[转帖]深入理解mysql-第六章 mysql存储引擎InnoDB的索引-B+树索引

一、引入索引 在没有索引的情况下,不论是根据主键列或者其他列的值进行查找,由于我们并不能快速的定位到记录所在的页,所以只能从第一个页沿着双向链表一直往下找,因为要遍历所有的数据页,时间复杂度就是O(n),所以这种方式显然是超级耗时的。所以我们需要采取一定的数据结构来存储数据,方便我们进行数据的增删改

[转帖]深入理解mysql-第十章 mysql查询优化-Explain 详解(上)

目录 一、初识Explain 二、执行计划-table属性 三、执行计划-id属性 四、执行计划-select_type属性 一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划,这个执行计划展示了接下来具体执行查询的方式,比如多表连接的顺序是什么,对于每个表采

[转帖]第四章节 索引及执行计划

第四章节 索引及执行计划 https://www.jianshu.com/p/fdd3c5e815e9 本课程,适合具备一定Linux运维或者开发基础的朋友,课程定级中、高级DBA。只要掌握80%,轻松助力薪资15k-25K。课程内容均来自与MySQL官网+MySQL源码。配套精品视频(2021 5

[转帖]第六章 日志管理

第六章 日志管理 https://www.jianshu.com/p/e0d95da89fee 本课程,适合具备一定Linux运维或者开发基础的朋友,课程定级中、高级DBA。只要掌握80%,轻松助力薪资15k-25K。课程内容均来自与MySQL官网+MySQL源码。配套精品视频(2021 5月全新录

[转帖]第七章 备份恢复

第七章 备份恢复 https://www.jianshu.com/p/e62d83516e75 本课程,适合具备一定Linux运维或者开发基础的朋友,课程定级中、高级DBA。只要掌握80%,轻松助力薪资15k-25K。课程内容均来自与MySQL官网+MySQL源码。配套精品视频(2021 5月全新录

[转帖]第三章 SQL 基础及元数据获取

第三章 SQL 基础及元数据获取 https://www.jianshu.com/p/f07416c419da 本课程,适合具备一定Linux运维或者开发基础的朋友,课程定级中、高级DBA。只要掌握80%,轻松助力薪资15k-25K。课程内容均来自与MySQL官网+MySQL源码。配套精品视频(20