MySQL之2---基础管理

MySQL之2---基础管理

一、用户管理

作用:登录数据库,管理数据库对象

格式

mysql用户账号由两部分组成:

'USERNAME'@'HOST‘

HOST说明:

  • 限制此用户可通过哪些远程主机连接mysql服务器
  • 支持使用通配符:
% 匹配任意长度的任意字符
172.16.0.0/255.255.0.0 或 172.16.%.%
_ 匹配任意单个字符
示例:
'root'@'localhost‘               本地用户
'root'@'db02‘                    单一IP用户
'root'@'10.0.0.2‘                单一IP用户
'root'@'10.0.0.%‘                范围IP用户
'root'@'10.0.0.5%‘               范围IP用户
'root'@'10.0.0.0/255.255.254.0‘  范围IP用户
'root'@'%‘                       范围IP用户

不指定@'HOST‘默认@'%‘

  • 匹配优先级:

image-20201102145157246

安全规范:

a. 尽量小, 最好细化到单一IP, 不能使用%

b. 用户名有特点

c. 无用的用户要删除(5.7以前)或者锁定

d. 密码超过三种复杂度, 12位以上

操作命令

创建用户和密码

create user 'USERNAME'@'HOST' identified by 'PASSWORD';

8.0新特性:

  1. 8.0 之后语句变化, grant不再支持创建用户和修改密码的功能, 不能

    grant all on *.* to wordpress@'10.0.0.%' identified by '123';
    

    权限和用户分开管理

    必须先创建用户再授权

    create user 'wordpress'@'10.0.0.%' identified by '123';
    grant all on *.* to wordpress@'10.0.0.%';
    
  2. 8.0 之前使用的密码插件是mysql_native_password

    8.0 之后使用的密码插件是caching_sha2_password

    导致问题: 老的客户端程序, 连接不了8.0版本

    解决方法:

    • 创建用户时指定密码加密插件为mysql_native_password
    create user wordpress@'10.0.0.%' identified with mysql_native_password by '123';
    
    • 修改用户时替换密码加密插件为mysql_native_password
    alter user wordpress@'10.0.0.%' identified with mysql_native_password by '123';
    
    • 配置文件中指定默认加密插件为mysql_native_password
    
    

修改用户

alter user wordpress@'10.0.0.%' identified by '123';

锁定用户

alter user wordpress@'10.0.0.%' account lock;

解锁用户

alter user wordpress@'10.0.0.%' account unlock;

删除用户

drop user wordpress@'10.0.0.%';

获取数据表结构

desc mysql.user;

查询所有mysql用户

select user,host,authentication_string,plugin from mysql.user;

设置别名as ""

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

查看帮助

? 或者 help

查看创建用户帮助

help create user;

生产中开用户

  1. 如何沟通开用户
    1.是否有邮件批复
    2.对哪些库和表做操作
    3.做什么操作(增删改查)
    4.从什么地址来登录
  2. 开发人员找你要root用户密码?
    1.走流程拒绝他
    2.如果是金融类的公司
    (1)原则上是不允许任何非DBA人员持有或申请root
    (2)如果有人私下索要root密码,即时举报。

三、权限管理

作用:约束用户能够对数据库对象(库, 表)使用的功能(SQL)

语法格式

grant 权限 on 权限范围 to 用户;

权限范围

  • 对于数据库及内部其他权限
*.*               全局范围, 所有数据库
数据库名.*        单库范围, 指定数据库中的所有
数据库名.表        单表范围, 指定数据库中的某张表
数据库名.存储过程     指定数据库中的存储过程
  • 对于用户和IP的权限
用户名@IP地址      用户只能在该IP下才能访问
用户名@192.168.1.%   用户只能在该IP段下才能访问(通配符%表示任意)
用户名@%             用户可以再任意IP下访问(默认IP地址为%)

权限列表

查看所有权限列表

show privileges;
all:除 Grant option 外的所有权限

alter:使用alter table
alter routine:使用alter procedure和drop procedure
create:使用create table
create routine:使用create procedure
create temporary tables:使用create temporary tables
create user:使用create user、drop user、rename user和revoke  all privileges
create view:使用create view
delete:使用delete
drop:使用drop table
execute:使用call和存储过程
file:使用select into outfile 和 load data infile
grant option:使用grant 和 revoke
index:使用index
insert:使用insert
lock tables:使用lock table
process:使用show full processlist
select:使用select
show databases:使用show databases
show view:使用show view
update:使用update
usage:无权限-仅允许连接
reload:使用flush
shutdown:使用mysqladmin shutdown(关闭MySQL)
super:使用change master、kill、logs、purge、master和set global。还允许mysqladmin调试登陆
replication client:服务器位置的访问
replication slave:由复制从属使用
... ...

权限类别

管理类

CREATE TEMPORARY TABLES
CREATE USER
FILE
SUPER
SHOW DATABASES
RELOAD
SHUTDOWN
REPLICATION SLAVE
REPLICATION CLIENT
LOCK TABLES
PROCESS

程序类: FUNCTION、PROCEDURE、TRIGGER

CREATE
ALTER
DROP
EXCUTE

库和表级别:DATABASE、TABLE

ALTER
CREATE
CREATE VIEW
DROP
INDEX
SHOW VIEW
GRANT OPTION:能将自己获得的权限转赠给其他用户

数据操作

SELECT
INSERT
DELETE
UPDATE

字段级别

SELECT(col1,col2,...)
UPDATE(col1,col2,...)
INSERT(col1,col2,...)

所有权限

ALL PRIVILEGES 或 ALL

注意:

① MariaDB 服务进程启动时会读取mysql 库中所有授权表至内存

② GRANT 或 REVOKE 等执行权限操作会保存于系统表中,MariaDB 的服务进程通常会自动重读授权表,使之生效

③ 对于不能够或不能及时重读授权表的命令,可手动让MariaDB 的服务进程重读授权表:FLUSH PRIVILEGES;

操作命令

① 授权

grant 权限 on 数据库.表 to '用户'@'IP地址';

不能重复授权, 重复授权会追加而不是覆盖

② 取消授权(回收权限)

revoke 权限 on 数据库.表 from '用户名'@'IP地址';

③ 查看用户权限

  • 专用命令
show grants for '用户'@'IP地址';
  • 查看授权表
select * from mysql.user \G;

注意:用户权限相关数据保存在mysql数据库的user表中,所以也可以直接对其进行操作(不建议)

加载mysql库
use mysql;
查看表名
show tables;

user        : user host auth plugin 全局范围授权的用户权限  (*.*)
db          : user host auth plugin 单库范围授权的用户权限  (wp_user.*)
table_priv  : user host auth plugin 单表范围授权的用户权限  (wp_user.d1)

示例

create user root@'10.0.0.%' identified with mysql_native_password by '123';
grant all on *.* to root@'10.0.0.%';

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

revoke delete on *.* to wp_user@'10.0.0.%';

8.0 新特性

角色 role

创建角色

create role app_rw;

给角色授权

grant select,update,delete,insert on wordpress.* to app_rw;

创建用户

create user test@'10.0.0.%' identified by '123';

给用户授权

grant app_rw to test@'10.0.0.%';

查看当前登录用户所属角色

select * from information_schema.APPLICABLE_ROLES;

删除角色

drop role app_rw;

删除用户

drop user test@'10.0.0.%';

本地管理员( root@localhost 用户)

管理员密码设定(root@localhost)

[root@db01 ~]# mysqladmin password 1 # 设置密码为: 1
[root@db01 ~]# mysqladmin -uroot -p password 123 # 修改密码为: 123
Enter password:  # 输入旧密码: 1

本地管理员 root@localhost 用户 忘记密码(误删除\误修改)

  1. 关闭数据库
[root@db01 ~]# systemctl stop mysqld
  1. 维护模式启动数据库
[root@db01 ~]# mysqld_safe --skip-grant-tables --skip-networking &
--skip-grant-tables  # 跳过授权表
--skip-networking    # 跳过远程登录
vim /etc/my.cnf
[mysqld]
skip-grant-tables=1
skip-networking=1

skip-networking=1:关闭TCP/IP网络连接,只侦听本地客户端, 所有和服务器的交互都通过一个socket实现,socket的yum安装默认存放在/var/lib/mysql/mysql.sock

1,ON,TRUE,启用意义相同
0,OFF,FALSE,关闭意义相同
_和-相同
  1. 登录并修改密码
[root@db01 ~]# mysql
mysql> alter user root@'localhost' identified by '1';
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
mysql> flush privileges;
mysql> alter user root@'localhost' identified by '1';
Query OK, 0 rows affected (0.01 sec)
mysql> exit

如果 root@localhost 用户 (误删除\误修改) 不存在

误修改改回来就行

[root@db01 ~]# mysql
mysql> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | 10.0.0.%  |
+------------------+-----------+
4 rows in set (0.00 sec)
mysql> update mysql.user set host='localhost' where user='root' and host='10.0.0.%'
mysql> exit

误删除就只能重新建立, 不能使用 CREATE 创建语句, 只能使用 INSERT 插入语句直接编辑用户表

  1. 关闭数据库,正常启动验证
[root@db01 ~]# mysql -uroot -p1

四、连接管理

自带客户端命令

mysql

mysqldump

mysql 常用参数

-u USERNAME:  用户名; 默认为root
-h HOST:      服务器主机地址/主机名; 默认为localhost
-p PASSWORD: 用户密码; 默认为空
-P POST:     端口(大写字母); 默认为3306
-s            静默
-S            套接字位置(指定连接socket文件路径)
-e            免交互执行SQL命令
<             导入数据库恢复数据
[root@db01 ~]# mysql -uroot -p123 -h 10.0.0.51 -P3306
mysql> select @@socket;
+-----------------+
| @@socket        |
+-----------------+
| /tmp/mysql.sock |
[root@db01 ~]# mysql -uroot -p123 -S /tmp/mysql.sock
[root@db01 ~]# mysql -uroot -p123 -e "select user,host from mysql.user;"
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| root          | 10.0.0.%  |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
[root@db01 ~]# mysql -uroot -p123 < mysql.sql
[root@db01 ~]# mysql -uroot -p1 -e 'source /root/world.sql'

mysql 命令连接

mysql服务器监听两种socket地址:

  1. unix sock: 监听在sock文件上,仅支持本机通信,host为localhost,127.0.0.1时自动使用unix sock
  2. ip socket: 监听在tcp的3306端口,支持远程通信

① 本地(socket文件)连接

前提条件: 提前创建 localhost 用户和密码

mysql -uroot -p123 -S /tmp/mysql.sock

连接错误①:不能连接套接字文件

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2), it means that the MySQL server daemon (Unix) or service (Windows) is not running.

解决方案:检查配置文件指定路径,检查MySQL是否启动

② 远程网络连接串(TCP/IP)连接

前提条件: 提前创建 远程连接(IP) 用户和密码

mysql -uroot -p123 -h10.0.0.51 -P3306

mysql 内置命令

help 					打印mysql帮助
\c  ctrl+c 				结束上个命令运行
\q quit; exit; ctrl+d 	退出mysql连接
\G 						将数据竖起来显示
source 					恢复备份文件	

mysqld 帮助

# 获取mysqld的可用选项列表
mysqld --help --verbose
# 获取mysqld的默认设置
mysqld --print-defaults

MySQL服务器

MariaDB选项,系统和状态变量的完整列表


开发工具

sqlyog

navicat

workbench(官方开源)


程序(驱动)连接

PHP

python

go

java

五、配置文件

初始化方式

  1. 源码包, 编译时配置参数(CMAKE)
  2. 命令行启动时指定配置参数
  3. 配置文件配置参数:类ini格式,集中式的配置

如果冲突,命令行优先级最高


配置文件默认读取路径

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

注意:

  1. 默认情况下,MySQL启动时,从左到右依次读取以上配置文件,如果有重复选项,以最后一个文件设置的为准。

  2. 启动服务时, 强制指定读取那个配置文件 --defautls-file

[root@db01 ~]# mysqld --defaults-file=/tmp/aa.txt &
[root@db01 ~]# mysqld_safe --defaults-file=/tmp/aa.txt &

配置文件结构

[root@db01 ~]# cat >/etc/my.cnf << EOF
# 服务器端配置
[mysqld]
# 用户
user=mysql   
# 软件安装目录                
basedir=/application/mysql  
# 数据存放路径
datadir=/data/mysql/data 
# socket文件路径
socket=/tmp/mysql.sock
# 服务器id号
server_id=6
# 端口号
port=3306
# 客户端配置
[mysql]
# socket文件路径
socket=/tmp/mysql.sock
EOF
标签:
     服务端: [mysqld] [mysqld_safe] [server] [mysqld_safe] [mysqld_multi](多实例)
            影响: 数据库启动,初始化
     客户端: [mysql] [mysqladmin] [mysqldump] [client]
            影响: 只影响到本机客户端程序运行

格式:parameter = value

服务器端设置

获取系统变量

SHOW GLOBAL VARIABLES;
SHOW [SESSION] VARIABLES;
SELECT @@VARIABLES;

服务器状态变量(只读):用于保存mysqld运行中的统计数据的变量,不可更改

-- 全局
SHOW GLOBAL STATUS;
-- 会话
SHOW [SESSION] STATUS;

设置服务器变量的值:分全局和会话两种

help SET

设置全局变量:仅对修改后新创建的会话有效,对已经建立的会话无效,重启mysqld服务失效

SET GLOBAL system_var_name=value;
SET @@global.system_var_name=value;

设置会话变量:仅对当前建立的会话有效

SET [SESSION] system_var_name=value;
SET @@[session.]system_var_name=value;

设置服务器选项:重启永久生效

vim /etc/my.cnf
[mysqld]
...

六、启动关闭

img

以上多种方式,都可以单独启动MySQL服务
mysqld_safe和mysqld一般是在临时维护时使用。
从 CentOS 7 系统开始,支持systemd直接调用mysqld的方式进行启动数据库

image-20201103102826061

启动

/usr/local/mysql/bin/mysqld &

  • 二进制文件
  • 只有启动没有关闭, 不记录日志

/usr/local/mysql/bin/mysqld_safe &

  • shell脚本
  • 只有启动没有关闭, 记录日志, 监控状态, 异常重启, ... ...

/usr/local/mysql/support-files/mysql.server {start|stop|restart|reload|force-reload|status}

service mysqld (start, stop, restart, try-restart, reload, force-reload, status)

systemctl mysqld {start|stop|restart|reload|enable|disable|status}


关闭

/usr/local/mysql/bin/mysqladmin -uroot -p1 shutdown

[root@db01 ~]#  /usr/local/mysql/bin/mysql -uroot -p1
mysql> shutdown;
# 8.0新特性
mysql> restart;

/usr/local/mysql/support-files/mysql.server stop

service mysqld stop

systemctl mysqld stop

七、多实例

官方文档

MySQL5.7.12之后默认开启MySQL X插件, 监听33060端口, 多实例时必须关闭

查看

[root@db01 ~]# netstat -tupln | grep mysqld
tcp6       0      0 :::3306                 :::*                    LISTEN      2385/mysqld
tcp6       0      0 :::33060                :::*                    LISTEN      2385/mysqld

关闭

① 命令行启动使用参数: --mysqlx=0--skip-mysqlx

② 配置文件/etc/my.cnf[mysqld]添加配置mysqlx=0

单版本多实例

  1. 规划相关目录
mkdir /mysql/330{7,8,9}/{data,etc,socket,log,pid} -pv
chown -R mysql.mysql /mysql
  1. 准备配置文件
cat > /mysql/3307/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/mysql/3307/data
socket=/mysql/3307/mysql.sock
port=3307
server_id=7
log_error=/mysql/3307/mysql.log
log_bin=/mysql/3307/mysql-bin
EOF

cat > /mysql/3308/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/mysql/3308/data
socket=/mysql/3308/mysql.sock
port=3308
server_id=8
log_error=/mysql/3308/mysql.log
log_bin=/mysql/3308/mysql-bin
EOF

cat > /mysql/3309/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/mysql/3309/data
socket=/mysql/3309/mysql.sock
port=3309
server_id=9
log_error=/mysql/3309/mysql.log
log_bin=/mysql/3309/mysql-bin
EOF
  1. 初始化三套数据并授权
mv /etc/my.cnf /etc/my.cnf.bak
mysqld --initialize-insecure  --user=mysql --datadir=/mysql/3307/data --basedir=/usr/local/mysql
mysqld --initialize-insecure  --user=mysql --datadir=/mysql/3308/data --basedir=/usr/local/mysql
mysqld --initialize-insecure  --user=mysql --datadir=/mysql/3309/data --basedir=/usr/local/mysql
chown -R mysql.mysql /mysql
  1. systemd管理多实例
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=/mysql/3307/my.cnf --mysqlx=0
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=/mysql/3308/my.cnf --mysqlx=0
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=/mysql/3309/my.cnf --mysqlx=0
LimitNOFILE = 5000
EOF
  1. 启动
systemctl start mysqld3307.service
systemctl start mysqld3308.service
systemctl start mysqld3309.service
  1. 验证多实例
netstat -tlnp | grep 330
mysql -S /mysql/3307/mysql.sock -e "select @@server_id"
mysql -S /mysql/3308/mysql.sock -e "select @@server_id"
mysql -S /mysql/3309/mysql.sock -e "select @@server_id"

多版本多实例

  1. 解压二进制包和软链接
[root@db01 opt]# tar xf mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz 
[root@db01 opt]# tar xf mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz
[root@db01 opt]# ln -s /opt/mysql-5.6.46-linux-glibc2.12-x86_64 /usr/local/mysql56
[root@db01 opt]# ln -s /opt/mysql-5.7.30-linux-glibc2.12-x86_64 /usr/local/mysql57
  1. 创建相关目录并授权
mkdir /mysql/33{16,17}/{data,etc,socket,log,pid} -pv
chown -R mysql.mysql /mysql
  1. 准备配置文件
cat > /mysql/3316/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql56
datadir=/mysql/3316/data
socket=/mysql/3316/mysql.sock
port=3316
server_id=16
log_error=/mysql/3316/mysql.log
log_bin=/mysql/3316/mysql-bin
EOF

cat > /mysql/3317/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql57
datadir=/mysql/3317/data
socket=/mysql/3317/mysql.sock
port=3317
server_id=17
log_error=/mysql/3317/mysql.log
log_bin=/mysql/3317/mysql-bin
EOF
  1. 初始化两套数据并授权
/usr/local/mysql56/scripts/mysql_install_db --user=mysql --datadir=/mysql/3316/data --basedir=/usr/local/mysql56
/usr/local/mysql57/bin/mysqld --initialize-insecure  --user=mysql --datadir=/mysql/3317/data --basedir=/usr/local/mysql57
chown -R mysql.mysql /mysql
  1. systemd管理多实例并加载
cat > /etc/systemd/system/mysqld3316.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=/mysql/3316/my.cnf
LimitNOFILE = 5000
EOF

cat > /etc/systemd/system/mysqld3317.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=/mysql/3317/my.cnf
LimitNOFILE = 5000
EOF

systemctl daemon-reload
  1. 启动
systemctl start mysqld3316.service
systemctl start mysqld3317.service
  1. 验证多实例
netstat -tlnp | grep 331
mysql -S /mysql/3316/mysql.sock -e "select @@server_id"
mysql -S /mysql/3317/mysql.sock -e "select @@server_id"

八、升级

升级方式

  1. inplace (就地升级)

    适合于主从环境, 先升级从库, 没问题再升级主库

  2. merging (逻辑备份迁移升级)


INPLACE 升级注意事项

官网说明

5.6

  • 仅在一般可用性(GA)版本之间支持升级。
  • 支持从MySQL 5.5升级到5.6。建议先升级到最新版本,然后再升级到下一版本。例如,在升级到MySQL 5.6之前,先升级到最新的MySQL 5.5版本。
  • 不支持跳过版本的升级。例如,不支持直接从MySQL 5.1升级到5.6。
  • 支持在发行系列中进行升级。例如,支持从MySQL 5.6.x 升级至5.6.y。还支持跳过发行版。例如,从MySQL 5.6.x升级至5.6.z支持。

5.7

  • 仅在一般可用性(GA)版本之间支持升级。
  • 支持从MySQL 5.6升级到5.7。建议先升级到最新版本,然后再升级到下一版本。例如,在升级到MySQL 5.7之前,先升级到最新的MySQL 5.6版本。
  • 不支持跳过版本的升级。例如,不支持从MySQL 5.5直接升级到5.7。
  • 支持在发行系列中进行升级。例如,支持从MySQL 5.7.x升级至5.7.y。还支持跳过发行版。例如,从MySQL 5.7.x升级至5.7.z支持。

8.0

  • 支持从MySQL 5.7升级到8.0。但是,仅在一般可用性(GA)版本之间支持升级。对于MySQL 8.0,要求您从MySQL 5.7 GA版本(5.7.9或更高版本)升级。不支持从非GA版本的MySQL 5.7升级。
  • 建议先升级到最新版本,然后再升级到下一版本。例如,在升级到MySQL 8.0之前,先升级到最新的MySQL 5.7版本。
  • 不支持跳过版本的升级。例如,不支持直接从MySQL 5.6升级到8.0。
  • 某个发行系列达到通用(GA)状态后,便支持在该发行系列中进行升级(从一个GA版本升级到另一个GA版本)。例如,支持从MySQL 8.0.x升级到8.0.y。(不支持涉及开发状态非GA版本的升级。)还支持跳过版本。例如,支持从MySQL 8.0.x升级到8.0.z。MySQL 8.0.11是MySQL 8.0发行系列中的第一个GA状态发行版。

总结

  • 仅支持GA版本之间升级,不支持跳过版本的升级,支持从MySQL 5.7升级到8.0

  • 5.6 --> 5.7 ,先将5.6升级至最新版,再升级到5.7

  • 5.5 --> 5.7 ,先将5.5升级至最新,再 5.5 --> 5.6 最新,再 5.6 --> 5.7 最新

  • 回退方案要提前考虑好,最好升级前要备份(特别是往8.0版本升级)。

  • 降低停机时间(停业务的时间)


INPLACE 升级过程原理

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

INPLACE 升级演练 5.6.46 ---> 5.7.30

  1. 安装 新(5.7.30)版本软件

  2. 优雅关闭库(等待所有正在进行的事务运行完毕再关库)

mysql -S /mysql/3316/mysql.sock -e "set global innodb_fast_shutdown=0;"
mysql -S /mysql/3316/mysql.sock -e "select @@innodb_fast_shutdown;"
+------------------------+
| @@innodb_fast_shutdown |
+------------------------+
|                      0 |
+------------------------+
mysql -S /mysql/3316/mysql.sock -e "shutdown;"
  1. 冷备
cp -r /mysql/3316/data/ /tmp/3316bak
  1. 修改配置文件, 使用高版本(5.7.30)软件挂低版本(5.6.48)数据启动
cat > /mysql/3316/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql57
datadir=/mysql/3316/data
socket=/mysql/3316/mysql.sock
port=3316
server_id=16
log_error=/mysql/3316/mysql.log
log_bin=/mysql/3316/mysql-bin
EOF
/usr/local/mysql57/bin/mysqld_safe --defaults-file=/mysql/3316/my.cnf --skip-grant-tables --skip-networking &
  1. 升级(升级到8.0可以省略此步骤)
/usr/local/mysql57/bin/mysql_upgrade -S /mysql/3316/mysql.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
mysql.help_category                                OK
mysql.help_keyword                                 OK
mysql.help_relation                                OK
mysql.help_topic                                   OK
mysql.innodb_index_stats                           OK
mysql.innodb_table_stats                           OK
mysql.ndb_binlog_index                             OK
mysql.plugin                                       OK
mysql.proc                                         OK
mysql.procs_priv                                   OK
mysql.proxies_priv                                 OK
mysql.server_cost                                  OK
mysql.servers                                      OK
mysql.slave_master_info                            OK
mysql.slave_relay_log_info                         OK
mysql.slave_worker_info                            OK
mysql.slow_log                                     OK
mysql.tables_priv                                  OK
mysql.time_zone                                    OK
mysql.time_zone_leap_second                        OK
mysql.time_zone_name                               OK
mysql.time_zone_transition                         OK
mysql.time_zone_transition_type                    OK
mysql.user                                         OK
Upgrading the sys schema.
Checking databases.
sys.sys_config                                     OK
Upgrade process completed successfully.
Checking if update is needed.
  1. 修改并重载systemd管理配置文件
cat > /etc/systemd/system/mysqld3316.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=/mysql/3316/my.cnf
LimitNOFILE = 5000
EOF
systemctl daemon-reload
  1. 关闭数据库并正常启动
/usr/local/mysql57/bin/mysqladmin -S /mysql/3316/mysql.sock shutdown
systemctl start mysqld3316
  1. 验证
mysql -S /mysql/3316/mysql.sock -e "select user,host from mysql.user;"
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| root          | 127.0.0.1 |
| root          | ::1       |
|               | db01      |
| root          | db01      |
|               | localhost |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
mysql -S /mysql/3316/mysql.sock -e "SELECT @@VERSION;"
+------------+
| @@VERSION  |
+------------+
| 5.7.30-log |
+------------+

INPLACE 升级演练 5.7.30 ---> 8.0.20

  1. 安装 新(8.0.20)版本软件

  2. 优雅关闭库(等待所有正在进行的事务运行完毕再关库)

mysql -S /mysql/3317/mysql.sock -e "set global innodb_fast_shutdown=0;"
mysql -S /mysql/3317/mysql.sock -e "select @@innodb_fast_shutdown;"
+------------------------+
| @@innodb_fast_shutdown |
+------------------------+
|                      0 |
+------------------------+
mysql -S /mysql/3317/mysql.sock -e "shutdown;"
  1. 冷备
cp -r /mysql/3317/data/ /tmp/3317bak
  1. 修改配置文件, 使用高版本(8.0.20)软件挂低版本(5.7.30)数据启动
cat > /mysql/3317/my.cnf << EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/mysql/3317/data
socket=/mysql/3317/mysql.sock
port=3317
server_id=17
log_error=/mysql/3317/mysql.log
log_bin=/mysql/3317/mysql-bin
mysqlx=0
EOF
/usr/local/mysql/bin/mysqld_safe --defaults-file=/mysql/3317/my.cnf --skip-grant-tables --skip-networking &
  1. 修改并重载systemd管理配置文件
cat > /etc/systemd/system/mysqld3317.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=/mysql/3317/my.cnf
LimitNOFILE = 5000
EOF
systemctl daemon-reload
  1. 关闭数据库并正常启动
/usr/local/mysql/bin/mysqladmin -S /mysql/3317/mysql.sock shutdown
systemctl start mysqld3317
  1. 验证
mysql -S /mysql/3317/mysql.sock -e "select user,host from mysql.user;"
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
mysql -S /mysql/3317/mysql.sock -e "SELECT @@VERSION;"
+-----------+
| @@VERSION |
+-----------+
| 8.0.20    |
+-----------+

升级前预检查

  1. mysqlsh ( 最低8.0.20 ) 安装
[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]# echo export PATH=\$PATH:/usr/local/mysqlsh/bin/ >> /etc/profile && . /etc/profile
  1. 验证安装
[root@db01 opt]# mysqlsh --version
mysqlsh  Ver 8.0.20 for Linux on x86_64 - for MySQL 8.0.20 (MySQL Community Server (GPL))
  1. 在 5.7.30 数据库中创建远程用户
mysql -S /tmp/mysql3317.sock -e "create user root@'10.0.0.%' identified with mysql_native_password by '123';"
mysql -S /tmp/mysql3317.sock -e "grant all on *.* to root@'10.0.0.%';"
  1. 升级前检测
mysqlsh root:123@10.0.0.51:3317 -e "util.checkForServerUpgrade()" > /tmp/upcheck.log
posted @ 2021-01-06 15:47  原因与结果  阅读(116)  评论(0编辑  收藏  举报