我最早接触mysql用的一直是5.5版本,用5.5版本遇到比较难搞定的问题就是复制单线程,包括一些性能上面的问题,后来升级到5.6到后面的5.7能带来直观的感受就是性能上做的优化以及提升,后来得知5.7即将停服不在更新,加上在项目交付归档安全扫描时遇到的安全漏洞(5.7已经不在提供漏洞修补),决定将mysql来一次大版本升级,最大的风险就是停服风险,数据备份相关工作一定要做好,因为8.0版本相对比与5.7还是有很多改进地方,下面会一一列举,要做好一切计划准备避免未知风险,如果项目整体结构庞大,涉及到的业务场景居多,更要做好abc方案,之前在做小版本升级的时候采用更多的就是in-place升级方案,但是要注意在大版本升级上使用这种升级方案是会出问题的,数据量如果庞大更不必说,因为原先的5.7版本采用的数据字符集是utf-8mb3而8.0后统一升级为utf-8mb4,以及数据库表结构的大小写区分,所以如果使用in-place方式升级大概率会出现问题,而且再出现问题后数据库结构是会产生变化的可以导致再回退到原来的版本后依旧无法使用,风险极大,所以我这里做的是逻辑升级,但是升级时也要注意数据兼容问题,建议先在测试服务器做充足准备考虑做好回退方案在进行升级。
1 默认字符集由latin1变为utf8mb4。
2 MyISAM系统表全部换成InnoDB表。
3 JSON特性增强。
4 支持不可见索引,支持直方图。
5 sql_mode参数默认值变化。
6 默认密码策略变更。
7 新增角色管理。
8 支持窗口函数,支持Hash join
注意字符集设置。为了避免新旧对象字符集不一致的情况,可以在配置文件将字符集和校验规则设置为旧版本的字符集和比较规则。
密码认证插件变更。为了避免连接问题,可以仍采用5.7的mysql_native_password认证插件。
sql_mode支持问题。8.0版本sql_mode不支持NO_AUTO_CREATE_USER,要避免配置的sql_mode中带有NO_AUTO_CREATE_USER。
是否需要手动升级系统表。在MySQL 8.0.16版本之前,需要手动的执行mysql_upgrade来完成该步骤的升级,在MySQL 8.0.16版本及之后是由mysqld来完成该步骤的升级。
升级前还是先注意,备份数据!备份数据!备份数据!
执行这三个命令,然后依次rm -rf,全部删除干净即可。
rm -rf ‘上面命令搜索出来的路径及文件名’
在进行这一步操作时如果出现删除不掉或者无法删除可以用下面方法删除:
使用命令 rpm -ev 对应文件名 移除剩余安装,如果存在依赖检测失败,则先移除被依赖的文件
示例:rpm -ev mysql-community-common-8.0.31-1.el7.x86_64
rm -rf ‘上面命令搜索出来的路径及文件名’
rm -rf ‘上面命令搜索出来的路径及文件名’
删除MySQL配置文件
执行rm -rf /etc/my.cnf命令删除/etc/my.cnf文件,执行rm -rf /etc/init.d/mysqld命令删除/etc/init.d/下跟MySQL有关的全部文件,一般包括mysql文件或mysqld文件,如果存在mysql文件则执行:
[root@localhost local]# sudo rm -rf /etc/mysql
删除mysql用户及用户组
[root@localhost local]# id mysql
uid=11(mysql) gid=23(mysql) groups=26(mysql)
[root@localhost local]# sudo userdel mysql
// 再/usr/local目录下解压
tar -xvf mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz
//将解压后文件夹更名
mv mysql-8.0.30-linux-glibc2.12-x86_64 mysql
centos7.5以上虚拟机在安装mysql时都会在/etc目录下自动生成my.cnf文件,所以不用再手动去创建这里我们直接将下面内容复制到my.cnf文件中
首先进行 vim /etc/my.cnf
[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
port = 3306
socket = /tmp/mysql.sock
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
log-error = /usr/local/mysql/mysqld.log
pid-file = /usr/local/mysql/mysqld.pid
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
lower_case_table_names = 1 # 不区分大小写
sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO'
default-time_zone = '+8:00'
//创建用户组
groupadd mysql
//创建用户
useradd -r -g mysql mysql
//赋予权限
chown -R mysql /usr/local/mysql/
chgrp -R mysql /usr/local/mysql/
// 进入mysql Bin目录下
cd /usr/local/mysql/bin/
//进行初始化操作
[root@localhost bin]# ./mysqld --initialize --user=mysql
//查看mysql原始登录密码
[root@localhost bin]# cat /usr/local/mysql/mysqld.log
//进入 cd /usr/local/mysql/support-files/
./mysql.server start 启动服务
这里可能会报错,如果出现:
Starting MySQL. ERROR! The server quit without updating PID file (/usr/local/mysql/mysqld.pid).
这个报错信息 就进入cat日志中查看具体报错原因 我这里的解决方案就是把mysql目录下的data删除掉
然后重新./mysqld --initialize --console初始化
重新给目录授权
命令:
chown -R mysql:mysql /usr/local/mysql/data
如果仍然为结局 请根据日志报错 进一步查看,此报错可能涉及多种原因,需要一一排查。
// 进入bin目录下登录mysql
./mysql -uroot -p
//输入密码 此密码就是初始化后给的初始密码
之后停止服务并退出
shutdown;
quit;
//将 mysql.server 复制至/etc/init.d/并且重命名为 mysqld :
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
// 修改 vim /etc/init.d/mysqld 配置文件
// 修改内容:
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
// 添加系统服务(service)启动信息
chkconfig --add mysqld
// 服务名字为mysqld
systemctl start mysqld
systemctl status mysqld
当然也可以使用:
service mysql start 来进行启动
//在vi /etc/profile文件添加如下:
export MYSQL_HOME=/usr/local/mysql
export PATH=$PATH:$JAVA_HOME/bin:$MYSQL_HOME/bin
# 改表法
# 选择数据库
use mysql;
# 最后授权 MySQL,允许远程用户登录访问 MySQL
update user set host = '%' where user = 'root';
# 刷新权限
flush privileges;
到这一步我们基本上8.0属于安装成功了,接下来就要进行数据迁移了,前移恢复步骤具体我就不在演示,目前可以确定这种升级是可以实现的,in-place升级可能会造成数据不可逆的丢失,请谨慎操作,凡是进行与数据相关的任何操作,都要进行备份,以及回退策略,避免造成损失,数据无价 数据无价,先更新到这里,后续再补充,如有疑问可在评论区评论,晚安