3.MYSQL 体系结构和基础管理
3.1 工作模型(C/S)
MySQL 客户端/服务器
类比ssh连接工作原理:
一,本地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
3.2 服务器端: 实例
mysql实例:指mysqld + 工作线程(main thread+多个线程) + 预分配的内存结构
--->>>
公司:boss+经理+员工+办公室
三:实例图解:
/xxx/xxx/mysql/bin/mysqld------->>启动----->>实例启动
🥇3.3 msqld程序执行过程
面试:经常被问道的体系结构原理,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的物理存储结构
段:一个表就是一个段,可以由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 大文件一样危险 )
mysql> 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 连接管理
三种连接方式:
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 启动和关闭
日常启动使用:
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 同版本的多实例
###规划:
软件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 不同版本多实例
测试环境使用较多不通版本的实例
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 &