3.MYSQL 体系结构和基础管理

3.1 工作模型(C/S)

MySQL 客户端/服务器
类比ssh连接工作原理:
image

一,本地socket连接方式: (已经封装了IP+端口:用于本地服务的连接)

前提:

需要提前创建xxx@'localhost' 本地用户

[root@db01 ~]# cat /etc/my.cnf | grep socket #socket=/tmp/mysql.sock

[root@db01 ~]# mysql -S /tmp/mysql.sock #socket登录方式

ps: 本地登录:只能在本地使用,不依赖于IP和端口

二, 远程TCPIP链接方式

前提:

需要提前创建remote@'10.0.0.%' 远程用户

[root@db01 ~]# mysql -uroot -p123456 -h 10.0.0.51 -p 3306

image

3.2 服务器端: 实例

mysql实例:指mysqld + 工作线程(main thread+多个线程) + 预分配的内存结构

--->>>

公司:boss+经理+员工+办公室

三:实例图解:

image

/xxx/xxx/mysql/bin/mysqld------->>启动----->>实例启动

🥇3.3 msqld程序执行过程

image

image

面试:经常被问道的体系结构原理,mysql语句执行流程:

连接层
(1)提供连接协议:TCP/IP 、SOCKET
(2)提供验证:用户、密码,IP,SOCKET
(3)提供专用连接线程:接收用户SQL,返回结果
通过以下语句可以查看到连接线程基本情况
mysql> show processlist;

SQL层

(1)验证SQL语法和SQL_MODE
(2)验证语义
(3)验证权限
(4)解析器进行语句解析,生成执行计划(解析树)
(5)优化器(各种算法,基于执行代价),根据算法,找到代价最低的执行计划。
    代价:CPU  IO  MEM
(6)执行器按照优化器选择执行计划,执行SQL语句,得出获取数据的方法。
(7)提供query cache(默认不开),一般不开,会用redis
(8)记录操作日志(binlog),默认没开


存储引擎层

真正和磁盘打交道的一个层次
根据SQL层提供的取数据的方法,拿到数据,返回给SQL,结构化成表,再又连接层线程返回给用户。


### 3.4 逻辑结构
1.mysql 物理存储结构认识
宏观:
库---->  对应着系统中: 目录  
#8.0之前版本在mysql数据目录下mkdir 一个目录  ---> 表中可以查看到 
8.0后规范了,不允许展示非数据库创建的目录。

表---->  对应系统中: xxx.idb   
微观:



彩蛋:
1. 磁盘建目录,5.6和5.7可以直接识别为一个库.
2. 8.0 之前,mysql下很多表是MyiSAM引擎.
user.frm    --->表结构
user.MYD    --->数据行
user.MYI    --->索引

3. 8.0之前 InnoDB表
t1.frm    --> 表结构
t1.ibd    --> 数据行+索引

Ps: 语义检查:语义类型有ddl,dcl,dml,dtl不同类型

3.4 MySQL的逻辑结构(操作对象)

逻辑-->抽象

MySQL Linux
库: 库名 +属性 目录: 文件名 + 属性
表: 文件名 + 表属性 + 表内容 + 列 文件: 文件名 + 文件属性 + 文件内容

mysql简单命令对比Linux系统:

​ mysql> show databases; ls /

​ mysql> use mysql; cd

​ mysql> show tables; ls ./

​ mysql> desc user; 看列定义

*3.5 MySQL的物理存储结构

image

段:一个表就是一个段,可以由1个或多个区构成

区:一个区(蔟),默认1M连续的64个page组成

页:一个页,默认16K,连续的4个OS block组成,最小的IO单元

3.6 MySQL基础管理

3.6.1 用户的作用
Linux用户作用: MySQL用户作用 :
登录Linux 登录MySQL数据库
管理Linux对象:文件 管理MySQL对象:表
3.6.2 用户定义

​ Linux用户:

​ MySQl用户: 用户名@'白名单'

白名单包括: 地址列表,允许白名单登录的IP登录MySQL,管理MySQL

例: oldhou@'localhost' :oldhou用户能够通过本地登录MySQL(socket)

oldhou@'10.0.0.10 或 .%' :oldhou用户能够通过10.0.0.10或10.0.0.0/24 网段远程登录

oldhou@'10.0.0.5%' : 10.0.0.50-59

oldhou@'10.0.0.0/255.255.254.0' # 网段只支持完整的子网掩码写法

oldhou@'%' # %: 排除本地的所有网段可以登录。

oldhou@'web01'

oldhou@'web01.oldguo.com'

3.6.3 用户的管理

查看用户:

记不住?---> mysql> select * from mysql.usr; ----> 选择你要的参数 (不能用户查业务表--> cat 大文件一样危险 )

image.pngmysql> desc mysql.user;

MySQL用户操作 SQL语句
查: mysql> select user,host from mysql.user; mysql> select user,host ,authentication_string from mysql.user ;
增: mysql> create user oldguo@'localhost'; mysql> create user oldboy@'10.0.0.%' identified by '123';
改: mysql> alter user oldguo@'localhost' identified by '123'; #用于添加和修改密码
删 (尽量精简用户) mysql> drop user oldguo@'localhost' ; mysql> drop user oldboy@'10.0.0.%'; #会删除用户的权限。

注意: 8.0版本以前是可以通过grant命令,建立用户 + 授权 (8.0, 必须先建立用户,后授权)

mysql升级8.0 后连接不上数据库?

----> 是因为升级了sha2加密插件---> 调整为mysql_native_password 加密插件可解决,

好习惯:命令行尽量使用mysql -uroot -p 隐藏登录

Linux 权限----> 对象:文件

mysql权限----> 对象:

3.7 权限管理

3.7.1 权限作用

linux中权限表现方式: RWX

MySQL的权限变更方式:增删改查,具体的 命令

mysql> show privileges; #查询权限

mysql> show  privileges;
3.7.2 授权操作
语法:
  grant   权限   on 对象   to 用户   identified by ' 密码 ';

8.0+ :
    create user 用于  identified by ' 密码 ' ;
    grant  权限1,权限2,权限3,...   on 对象 to 用户 identified by ' 密码 ';
   
权限:
    ALL               :管理员
    grant  option      : 给别的用户授权


对象范围: 库  , 表
linux权限存放于 inode中   
mysql  中权限存放与 授权表中

-user          * 存放全局范围内的权限
-db            * 存放单库级别
-columns_priv  : 单列
-tables_priv   : 存放单表级别
-procs_ priv
-proxies_ priv


*.*       : ------------> chmod -R  755 /           管理员
oldhou.*    : ------------> chmod -R  755 /oldhou     普通用户
oldguo.t1    : ------------> chmod -R  755 /oldhou/t1    单表

ALL 所有权限

(不包括 Crant option. ---> 拥有此权限可以给其他用户授权 )

应用用户一般具备以下权限即可

select , update , delete ,insert

3.7.3 授权案例

案例1:创建一个管理员用户oldguo, 能够通过10.0.0.% 网段登录,并管理数据库:

#创建用户并授权
mysql> grant all on *.* to oldguo@'10.0.0.%' identified by '123' with grant option;
Query OK, 0 rows affected, 1 warning (0.00 sec)


###查询:
mysql> show grants  for oldguo@'10.0.0.%' ;
+----------------------------------------------------------------------+
| Grants for oldguo@10.0.0.%                                           |
+----------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'oldguo'@'10.0.0.%' WITH GRANT OPTION |
+----------------------------------------------------------------------+
1 row in set (0.00 sec)


###查看用户权限:
mysql> select * from mysql.user\G   (\G : 列显示)
                ...
                
*************************** 4. row ***************************
                  Host: 10.0.0.%
                  User: oldguo
  
        ...
        

*案例2: 创建并授权一个aap@'10.0.0.%'业务用户,能对app库下所有的对象进行create,select,update,delete,insert操作

#创建用户并授权
mysql> grant create,update,select,insert on app.* to app@'10.0.0.%' identified by '123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

#查看用户权限
mysql> show grants for app@'10.0.0.%';
+---------------------------------------------------------------------+
| Grants for app@10.0.0.%                                             |
+---------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'app'@'10.0.0.%'                              |
| GRANT SELECT, INSERT, UPDATE, CREATE ON `app`.* TO 'app'@'10.0.0.%' |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)


mysql> select user,host from mysql.user ;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| app           | 10.0.0.%  |
| oldguo        | 10.0.0.%  |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
5 rows in set (0.01 sec)


#其他方式查看权限---查看基于库级别的权限
Ps:  通过修授权表的内容,也可以达到修改权限的目录,但是不建议 

mysql> select * from db\G
*************************** 3. row ***************************
                 Host: 10.0.0.%
                   Db: app
                 User: app
          Select_priv: Y
....

练习: 8.0 配置一个remote用户 ---> 开发工具连接:

create user remote@'10.0.0.%' identified with mysql_native_password by '123';

Grant ALL on . to remote@'10.0.0.%';

3.7.4 回收权限

Linux中:chmod -R 644 /oldhou ----> chmod -R 755 /oldhou

Msql中:不能通过重复授权的方式,修改权限(测试无效)只能通过收回权限的方式进行权限的授权

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


#收回权限
mysql> revoke create  on app.*  from app@'10.0.0.%';
Query OK, 0 rows affected (0.00 sec)

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

oracle 删除了用户,会删除库和表

mysql 中删除用户,不会影响库和表,但是会影响业务,删除类的操作都要谨慎

3.7.5 找回密码

思路:进入mysql维护模式,修改密码

​ --skip-grant-tables :跳过授权表

​ --skip-network : 跳过TCP/IP连接

​ #启动mysql_safe

​ [root@db01 ~]# mysqld_safe --skip-grant-tables &

​ [1] 2496

​ [root@db01 ~]# Logging to '/data/mysql/data/db01.err'.

​ 2020-09-24T09:27:44.696751Z mysqld_safe Starting mysqld daemon with databases from /data/mysql/data

#(1)关闭数据库:
[root@db01 ~]# systemctl  stop  mysqld

#(2)使用安全模式启动:
[root@db01 ~]# mysqld_safe  --skip-grant-tables --skip-networking &       #只允许本地无密码登录
[1] 4004
[root@db01 ~]# 2020-09-24T09:45:25.485161Z mysqld_safe Logging to '/data/mysql/data/db01.err'.
2020-09-24T09:45:25.521325Z mysqld_safe Starting mysqld daemon with databases from /data/mysql/data
#或者
service mysqld start -skip-grant-tables --skip-networking

#(3)修改密码:
mysql> flush privileges;                  #手工加载授权表
Query OK, 0 rows affected (0.00 sec)

mysql> alter  user root@'localhost'   identified by '123456' ;             #修改密码
Query OK, 0 rows affected (0.00 sec)


#(4)重启数据库到正常模式
[root@db01 ~]# systemctl  restart mysqld.service

3.8 连接管理

三种连接方式:

image

3.8.1 MySQL自带客户端

(1) mysql参数列表:

​ -u 用户名

​ -p 密码

​ -s 本地socket文件位置

​ -h 数据库IP地址

​ -p 数据库端口号,默认3306

​ -e 免交互进行数据库命令(写脚本时用)

​ mysql -uroot -p123 -e "select @@innodb_flush_log_at_trx_commit;"

< 导入数据库

​ mysql -uroot -p123 </root/world.sql

socket :

​ 前提:数据库中必须实现授权oldguo@'localhost' 用户

socket 常见登录方式:

mysql -uoldguo -p123 -S /tmp/mysql.sock (默认位置)

mysql -uoldguo -p -S /tmp/mysql.sock #推荐方式

mysql -p123 -S /tmp/mysql.sock

mysql

mysql -uroot -p123

mysqldump

mysqladmin

TCP/IP:

前提: 必须前提创建好,可以远程连接的用户(ex: oldhou@'10.0.0.%')

mysql -uoldhou -p123 -h 10.0.0.51 -p 3306

mysql -uoldhou -p123 -h 10.0.0.51

mysql -uoldhou -p -h 10.0.0.51 -p 3306

**
**

练习:授权一个oldboy管理用户,可以通过本地socket登录

mysql> grant all on . to oldboy@'localhost' identified by '123'

[root@db01 ~]# mysql -uoldboy -p123 -S /tmp/mysql.sock

如何查看链接是本地还是远程

有连接层会对每个连接有一个连接线程--->使用命令: show processlist; 查看

Ps: 查看连接用户:

mysql> show processlist;
+----+-----------------+------------+------+---------+------+------------------------+------------------+
| Id | User            | Host       | db   | Command | Time | State                  | Info             |
+----+-----------------+------------+------+---------+------+------------------------+------------------+
|  5 | event_scheduler | localhost  | NULL | Daemon  | 8206 | Waiting on empty queue | NULL             |
|  8 | root            | localhost  | NULL | Sleep   |  101 |                        | NULL             |
|  9 | oldguo          | localhost  | NULL | Query   |    0 | starting               | show processlist |
| 10 | remote          | db01:43552 | NULL | Sleep   |   68 |                        | NULL             |
+----+-----------------+------------+------+---------+------+------------------------+------------------+
4 rows in set (0.00 sec)

3.8.2 MySQL远程客户端

开发工具

前提:必须提前创建好,可以远程连接的用户,(例如:oldguo@"10.0.0.%")

mysqldump 备份工具

mysqladmin 管理工具

3.8.3 程序连接

yum install -y php-mysql

pip3 install pymysql

3.9 初始化配置

###方式
源码安装------>> 编译过程中设置初始化参数
配置文件------>>数据库启动之前,设定配置文件参数    /etc/my.cnf
启动脚本命令   ----->>mysql_safe  --skip-grant-tables  --skip-networking  &
配置文件应用


----------
a. 5.6,5.7初始化区别
5.6 : scripts/mysql_install_db         ---5.7以前使用
5.7 : mysqld --initialize-insecure     ---5.7以后使用mysqld

--initialize-insecure和--initialize     ---初始化参数说明
--initialize:
给root@'localhost'一个临时密码.四种复杂度12位密码.只能用户登录,需改密码,不能执行sql语句

配置文件个书写格式:

(1)配置文件读取顺序: mysqld  --help --verbose   |  grep my.cnf
-默认读取位置:
/etc/my.cnf  ---->>  /etc/mysql/my.cnf  ---->>  ~/usr/local/mysql/etc/my.cnf    ---->>  ~/.my.cnf

-手工定制配置文件位置点:
/opt/my.cnf       /data/3306/my.cnf    /data/3307/my.cnf   /data/3307/my.cnf
启动时:
mysql        --defaults-file=/opt/my.cnf  &
mysql_safe   --defaults-file=/opt/my.cnf  &



[标签]           
标签是什么?  #分类不同程序的参数

---------------------------------------
[服务器端] : 负责数据库服务端运行参数设定:
[mysqld]        *
[mysqld_safe]   *
[server]        #涵盖管理所有服务端标签

[客户端]: 影响客户端连接,不影响远程客户端
[mysql]
[mysqldump]
[client]        #涵盖管理所有客户端标签

基础配置文件模板介绍说明:

[root@db01 ~]# cat  /etc/my.cnf
[mysqld]                        ## 服务端标签
user=mysql                      #  负责数据库管理用户
basedir=/application/mysql      #  软件的安装位置
datadir=/data/mysql/data        #  数据的存放为位置
socket=/tmp/mysql.sock          #  套接字文件
server_id=6                     #  标识节点的唯一编号(主从复制有用)
port=3306                       #  端口号

[mysql]                         ## 客户端标签
socket=/tmp/mysql.sock          #  读取socket文件的位置点(如何创建本地多实例,就不要写,要不然默认读取配置文件的路径)

ps: 生产中,初始化数据库,需要加载配置文件。 (默认文件位置 /etc/my.cnf)

配置文件不在默认路径时:

mysqld --initialize-insecure --defaults-file=/opt/my.cnf

*3.10 启动和关闭

image-20201229191254836

日常启动使用:
service mysqld  start | stop |  restart
systemctl  start | stop |  restart        

关闭方式
1.    mysql> shutdown; #进入数据库
2.    mysqladmin -uroot -p123456  shutdown 
3.    mysql -uroot -p123456  -e "shutdown"
4.    service  mysqld  stop
5.    /etc/init.d/mysqld  stop
6.    systemctl  stop  mysql

3.11 多实例(测试,学习)

测试环境-大型架构常会用到多实例

3.11.1 同版本的多实例

image.png

###规划:
软件1份 

数据目录    3份      /data/330{7..9}
配置文件    3份      /data/330{7..9}/my.cnf
日志目录    3份      /binlog/330{7..9}
socket     3份      /tmp/mysql330{7..9}.socket
端口          3份      port=3307,3308,3309
server_id  3份      7,8,9
2.3 同版本 

2.3.1 准备目录 
[root@db01 ~]# mkdir -p /data/330{7..9}/data
[root@db01 ~]# chown -R mysql. /data

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

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

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

2.2.3 初始化三份数据
mysqld --defaults-file=/data/3307/my.cnf --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3307/data 
mysqld --defaults-file=/data/3308/my.cnf --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3308/data 
mysqld --defaults-file=/data/3309/my.cnf --initialize-insecure 

2.2.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  &

mysql -S /tmp/mysql3307.sock
mysql -S /tmp/mysql3308.sock
mysql -S /tmp/mysql3309.sock



2.2.5  准备启动脚本: systemd管理多实例
cd /etc/systemd/system
cp mysqld.service mysqld3307.service
cp mysqld.service mysqld3308.service
cp mysqld.service mysqld3309.service

######################################
cd /etc/systemd/system
[root@VM system]# cat 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
######################################

#依次修改:
sed -i 's#ExecStart=/application/mysql/bin/mysqld --defaults-.*$#ExecStart=/application/mysql/bin/mysqld  --defaults-file=/data/3307/my.cnf#g'  mysqld3307.service


sed -i 's#ExecStart=/application/mysql/bin/mysqld --defaults-.*$#ExecStart=/application/mysql/bin/mysqld  --defaults-file=/data/3308/my.cnf#g'  mysqld3308.service

sed -i 's#ExecStart=/application/mysql/bin/mysqld --defaults-.*$#ExecStart=/application/mysql/bin/mysqld  --defaults-file=/data/3309/my.cnf#g'  mysqld3309.service


5 授权
chown -R mysql. /data/*
---------


6. 启动
systemctl start mysqld3307.service
systemctl start mysqld3308.service
systemctl start mysqld3309.service

7. 验证多实例
netstat -lnp|grep 330
mysql -S /data/3307/mysql.sock -e "select @@server_id"
mysql -S /data/3308/mysql.sock -e "select @@server_id"
mysql -S /data/3309/mysql.sock -e "select @@server_id"
报错提示:初始化失败
报错原因:  data目录因为有数据或文件,所以不会初始化

报错处理:
多创建一层目录,用于存放mysql运行时的应用数据

1.新增目录  
[root@db01 ~]# mkdir -p /data/330{7..9}/data

2.配置文件修改
cat >/data/3307/my.cnf <<EOF
[mysqld]
basedir=/application/mysql/
datadir=/data/3307/data
socket=/tmp/mysql3307.socket
port=3307
EOF

3.11.2 不同版本多实例

image.png

测试环境使用较多不通版本的实例

0.#准备不同版本,并解压

#连接不通版本,修改环境变量(升级——>替换软链接)
ln -s /opt/mysql-5.6.46-linux-glibc2.12-x86_64   /usr/local/mysql56
ln -s /opt/mysql-5.7.30-linux-glibc2.12-x86_64   /usr/local/mysql57

#重名配置文件
[root@db01 ~]#  mv  /etc/my.cnf  /etc/my.cnf.bak 
 
#注释环境变量
vim /etc/profile
#export PATH=/usr/local/mysql/bin:$PATH

#检验:开以个新窗口
[root@db01 ~]# mysql -V
-bash: mysql: command not found     ---> ok

1. 准备不同目录
[root@db01 ~]# rm  -fr /data/331{7..9}/data/*
[root@db01 ~]# mkdir -p /data/331{7..9}/data/*


2.准备配置文件
cat >/data/3356/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql56
datadir=/data/3356/data
socket=/tmp/mysql3356.sock
port=3356
[mysql]
socket=/tmp/mysql3356.sock
EOF

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


3. 初始化数据库  #5.6 5.7
/usr/local/mysql56/scripts/mysql_install_db --defaults-file=/data/3356/my.cnf --user=mysql --basedir=/usr/local/mysql56 --datadir=/data/3356/data         #启动成功关键字:两个"ok"
/usr/local/mysql57/bin/mysqld --defaults-file=/data/3357/my.cnf --initialize-insecure

-----------------
-报错: FATAL ERROR: please install the following Perl modules before executing ...
-解决: yum -y install autoconf
------------------


4. 启动 
/usr/local/mysql57/bin/mysqld_safe --defaults-file=/data/3357/my.cnf  &
/usr/local/mysql56/bin/mysqld_safe --defaults-file=/data/3356/my.cnf  &


4.1.配置systemcd启动脚本
#5.6
cat >/etc/systemd/system/mysqld3356.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/mysql56/bin/mysqld --defaults-file=/data/3356/my.cnf
LimitNOFILE = 5000
EOF

#5.7
cat >/etc/systemd/system/mysqld3357.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/mysql57/bin/mysqld --defaults-file=/data/3357/my.cnf
LimitNOFILE = 5000
EOF

5. 启动&测试
[root@db01 ~]# systemctl  start mysqld3317.service
[root@db01 ~]# systemctl  start mysqld3318.service
[root@db01 ~]# netstat -lntp | grep 331
tcp6       0      0 :::3317                 :::*                    LISTEN      9529/mysqld         
tcp6       0      0 :::3318                 :::*                    LISTEN      9557/mysqld       

6. 连接
/usr/local/mysql56/bin/mysql -S  /tmp/mysql3356.sock
/usr/local/mysql57/bin/mysql -S /tmp/mysql3357.sock

或直接: mysql -uroot -p -S   /tmp/mysql3356.sock
        mysql -uroot -p -S  /tmp/mysql3357.sock
        
解决:
(-bash: mysql: command not found)
[root@db01 ~]# vim  /etc/profile
export  PATH=/usr/local/mysql/bin:$PATH
[root@db01 ~]# source /etc/profile 
[root@db01 ~]# mysql  -V
mysql  Ver 8.0.20 for Linux on x86_64 (MySQL Community Server - GPL)


ps : 对于客户端服务端不是同一版本,可以通用连接。
客户端V:  mysql  Ver 14.14 Distrib 5.7.31
服务端V:  Server version: 8.0.18 MySQL Community Server - GPL

5.6的客户端连接8.0的服务端,报错? 8.0验证方式不一样,建议把环境变量设为5.7/8.0的版本,调用相应客户端连接。

[root@db01 ~]# /application/mysql56/bin/mysql -S /tmp/mysql3318.sock

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql3318.sock' (2)

3.11.3 升级

1.测试5.6.46 升级到5.7.30

  • 5.6-----> 5.7
a. 优雅(干净)的关闭5.6 
/usr/local/mysql56/bin/mysql -S /tmp/mysql3356.sock
mysql> set global innodb_fast_shutdown=0;
[root@db01 data]# /usr/local/mysql56/bin/mysqladmin -S /tmp/mysql3356.sock  shutdown

b. 高版本挂低版本数据启动
[root@db01 data]# vim /data/3356/my.cnf 
[mysqld]
user=mysql
basedir=/usr/local/mysql57
datadir=/data/3356/data
socket=/tmp/mysql3356.sock
port=3356
[mysql]
socket=/tmp/mysql3356.sock

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


c. 升级
[root@db01 ~]# /usr/local/mysql57/bin/mysql_upgrade -S /tmp/mysql3356.sock --force
Checking server version.
Running queries to upgrade MySQL server.
Checking system database.
mysql.columns_priv                                 OK
mysql.db                                           OK
mysql.engine_cost                                  OK
mysql.event                                        OK
mysql.func                                         OK
mysql.general_log                                  OK
mysql.gtid_executed                                OK
...
...
Upgrading the sys schema.
Checking databases.
sys.sys_config                                     OK
Upgrade process completed successfully.
Checking if update is needed.


c. 正常重启数据库 
[root@db01 data]# /usr/local/mysql57/bin/mysqladmin  -S /tmp/mysql3356.sock shutdown 
[root@db01 data]# /usr/local/mysql57/bin/mysqld_safe --defaults-file=/data/3356/my.cnf   &

2.Mysql 5.7.30 Inplace升级到MySQL 8.0.20

  • 5.7-----> 8.0
3.1 Mysql 5.7.30 Inplace升级到MySQL 8.0.20

7.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. 在3357数据库中root@root@10.0.0.%创建链接用户
[root@db01 bin]# mysql -S /tmp/mysql3357.sock -uroot -p123
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:3357 -e "util.checkForServerUpgrade()" >>/tmp/up.log


7.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 opt]# vim /data/3357/my.cnf 
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3357/data
socket=/tmp/mysql3357.sock
port=3357
default_authentication_plugin=mysql_native_password
[mysql]
socket=/tmp/mysql3357.sock


[root@db01 data]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3357/my.cnf --skip-grant-tables --skip-networking &          #启动 并 升级
Ps:  升级时添加参数的意义:1. 跳过网络连接: 不让用户登入操作数据库  2.跳过授权表: 升级时可能升级系统表,尽可能不要占用

d. 重启数据库到正常状态  
[root@db01 data]# mysqladmin -S /tmp/mysql3357.sock shutdown
[root@db01 data]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3357/my.cnf &
posted @ 2020-12-29 19:15  HSping  阅读(104)  评论(0编辑  收藏  举报