时间很快,到2023年10月底,MySQL 5.7就到了它的EOL(End of Life),届时将不会提供任何补丁,无法应对潜在的安全风险;是时候和 MySQL 5.7 说再见了!!!!回顾自Mysql5.7 版本2015年10月发布,它带来很多新的特性,比如:默认引擎改成了InnoDB,更新了安全策略,性能方面的提升,新增JSON数据类型,增强了sql模式及用户权限等等强大的功能。因此,这个版本自从发布之后一直受到业界的欢迎,也成为了众多开发者的首选数据库版本,至今仍被广泛使用于很多中小生产环境。各个MySQL发行版本官方提供5年的支持期限,MySQL和Percona还提供额外的3年补丁更新期限,总计提供8年的服务支持。2018年4月,MySQL 8.0 正式发布。
相关资源:Mysql 5.7.43发布说明、Mysql版本差异说明、Mysql平台兼容性、Mysql文档中心、Mysql5.7升级说明、升级Mysql8.0官网说明、Mysql EOL、Oracle lifetime-support、MariaDB、brary-mariadb、percona生命周期说明、版本对比、postgresql、Mysql8 LTS
Mysql产品的生命周期分为三个支持阶段,标准支持服务、延伸支持服务和持续支持服务,一旦进入延伸支持阶段,MySQL仅在认为有必要升级的时候才会提供补丁,通常是为了解决安全性问题。对应这三个阶段的时间分别是产品从GA(正式发布)开始1-5年、6-8年及9年以上。
如下图所示,今年的10月份,5.7版本会停止延伸阶段支持,即2023年10月以后,停止发布补丁,Oracle 将不再为 MySQL 5.7 提供官方更新、错误修复或安全补丁。
Release | Release Date | End of life |
---|---|---|
MySQL 8.0 | April 19, 2018 | |
MySQL 8.0 | April 19, 2018 | |
MySQL 5.7 | October 21, 2015 | October 21, 2023 |
MySQL 5.6 | February 5, 2013 | February 5, 2021 |
MySQL 5.5 | December 3, 2010 | December 3, 2018 |
MySQL 5.1 | November 14, 2008 | December 31, 2013 |
MySQL 5.0 | January 9, 2012 |
Mysql 8.0x版本的长期稳定版(LTS)生命周期图,途中蓝色部分。
1)MySQL 8.0 的新特性
原子 DDL
一种原子数据定义语言 (DDL) 语句,用于组合对数据字典、存储引擎操作等所做的更新。
加密默认值
已为表加密全局定义和实施加密默认值。 “default_table_encryption”变量用于为新创建的模式定义加密默认值。在创建模式时,可以借助“DEFAULT ENCRYPTION”子句定义模式的默认加密。默认密码策略变更。
资源组
可以创建和管理资源组,并且服务器能够将线程分配给在服务器内运行的特定组的资源。组属性可用于控制资源、限制或授予线程使用资源的权限等。支持窗口函数,支持Hash join。
默认字符集
版本更新后,默认字符集由‘latin1’改为‘utf8mb4’。新字符集“utf8mb4”有多个排序规则,其中包括“utf8mb4_ja_0900_as_cs”,这是 MySQL 中第一个可用于 Unicode 的日语特定排序规则。MyISAM系统表全部换成InnoDB表。支持不可见索引,支持直方图。sql_mode参数默认值变化。
JSON 增强
对 MySQL 的 JSON 功能进行了 JSON 增强,其中添加了“->>”,即内联路径运算符。这相当于对调用‘JSON_EXTRACT()’函数后得到的结果调用‘JSON_UNQUOTE()’函数。
对 DBA 的控制
新增角色管理,DBA 已被授予根据工作负载修改属性的控制权。服务器确定虚拟 CPU 是否可用,具有所需权限的 DBA 可以使用这些 CPU 并将它们分配给某些资源组和线程。
据相关经验表明,性能上测试如下,仅供参考:
1、读写模式下,mysql5.7.22和mysql8.0.15tps、qps性能差不多,mysql8.0.15在120线程并发时,性能出现了下降抖动:
2、只读模式下,mysql5.7.22的tps、qps比mysql8.0.15好1/3左右;并发线程数增加后,tps、qps并没有随着增加,反而出现了下降的趋势:
3、只写模式下,随着并发数的上升,mysql5.7.22的性能比mysql8.0.15好1/4左右。
4、读写模式下,并发数低时,mysql5.7.22性能好于mysql8.0.15;并发数比较高时,mysql8.0.15性能好于mysql5.7.22;在80线程的并发以上时,性能开始下降。
5、只读模式下,mysql5.7.22性能比mysql8.0.15好1/3左右;随着并发数的上升,性能也没有上升,反而有下降的趋势。
6、只写模式下,mysql5.7.22的tps抖动比较大;mysql5.7.22的qps比mysql8.0.15好1/3左右。
根据MySQL8.0官方升级教程,列举出以下几点注意事项:
1、注意字符集设置。为了避免新旧对象字符集不一致的情况,可以在配置文件将字符集和校验规则设置为旧版本的字符集和比较规则。
2、密码认证插件变更。为了避免连接问题,可以仍采用5.7的mysql_native_password认证插件。
3、sql_mode支持问题。8.0 版本sql_mode不支持NO_AUTO_CREATE_USER,要避免配置的sql_mode中带有NO_AUTO_CREATE_USER。
4、是否需要手动升级系统表。在MySQL 8.0.16版本之前,需要手动的执行mysql_upgrade来完成该步骤的升级,在MySQL 8.0.16版本及之后是由mysqld来完成该步骤的升级。
5、mysql 5.7升级到MySQL8,官方强烈建议先将当前的mysql5.7升级到最新的GA版本的5.7.x,然后再升级mysql8.0;但是不支持跨大版本升级,比如 从MySQL 5.6 直接升级到 8.0;现场版本:5.7.31
6、对于同一GA系列版本,升级时支持的,比如MySQL 8.0.x升级 到 8.0.y;不支持涉及开发状态非GA版本的升级,跨小版本也可以,比如从8.0.x 升级到 8.0.z;. MySQL 8.0.11是第一个GA版本;
升级前检查工具,更多参看升级检查
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.34-1.el7.x86_64.rpm-bundle.tar #解压文件 tar zxvf mysql-8.0.34-el7-x86_64.tar.gz -C /usr/local/mysql8.0/ #更改目录属性 chown -R mysql.mysql /usr/local/mysql8.0/ #MySQL提供mysql-shell验证方式,可以下载后进行验证,没有0.34: wget https://cdn.mysql.com/archives/mysql-shell/mysql-shell-8.0.33-linux-glibc2.12-x86-64bit.tar.gz tar -xf mysql-shell-8.0.33-linux-glibc2.12-x86-64bit.tar.gz cd mysql-shell-8.0.33-linux-glibc2.12-x86-64bit/bin ./mysqlsh -uroot -p'123456' -S /tmp/mysql.sock -e "util.checkForServerUpgrade()" #全备份 mysqldump -uroot -p'123456' --all-databases --lock-tables=0 > all.sql.bak.20231012 或 mysqldump -uroot -p'123456' --all-databases --single-transaction > all.sql.bak.20231012
1)会更新mysql的system schema库,详见System Schema说明,该库存储了mysql数据库运行时所需信息的表,数据库对象元数据的数据字典表,以及用于其他操作目的的系统表;
2)其他schema:Performance Schema, INFORMATION_SCHEMA, ndbinfo, and sys schema、User schemas;
3)数据字典版本,需要与新的主版本适应;新版本会创建具有更新定义的数据字典表,将持久化元数据复制到新表,用新表原子替换旧表,并重新初始化数据字典,更新Performance Schema, INFORMATION_SCHEMA, and ndbinfo;MySQL 8.0.16之前版本, 手动执行mysql_upgrade脚本会更新相关如Performance Schema、INFORMATION_SCHEMA等;该版本之后增加了更多其他升级方式;
4)与当前版本关联的安装文件和组件版本的更新;mysql schem种的系统表的更新,sys schema和User schemas更新;
注意:MySQL 5.7种配置选项和变量的变化、
注:命名规则:packagename-version-distribution-arch.rpm,我们只需下载RPM bundle tar包就好,里面已经处理了包之间的依赖;
1)升级步骤
第一种方式:rpm包安装(需将所有同一版本的上述rpm包全部下载下来,放在同一个目录)
mysql-5.7.31-1.el7.x86_64.rpm-bundle.zip mysql-community-client-5.7.31-1.el7.x86_64.rpm mysql-community-common-5.7.31-1.el7.x86_64.rpm mysql-community-devel-5.7.31-1.el7.x86_64.rpm mysql-community-libs-5.7.31-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.31-1.el7.x86_64.rpm mysql-community-server-5.7.31-1.el7.x86_64.rpm #查看rpm内文件 rpm -qpl mysql-community-server-version-distribution-arch.rpm #安装 yum install mysql-community-{server,client,common,libs}-* 或 yum install mysql-community-{server,client,common,libs}-* mysql-5.* #启动,在使用RPM和DEB包进行升级安装的过程中,如果升级时MySQL服务器正在运行,则MySQL服务器将停止、升级并重新启动 service mysqld start #删除旧的数据包 rpm --oldpackage -ivh mysql-community-libs-5.5.50-2.el6.x86_64.rpm
第二种方式:MySQL Binary包升级替换
#配置优雅关停,这样的话,InnoDB在关闭之前执行完全pruge清除和更改缓冲区合并,以确保准备数据文件适应不同版本之间存在文件格式差异 mysql -u root -p --execute="SET GLOBAL innodb_fast_shutdown=0" #关闭旧版 mysqladmin -u root -p shutdown #启动mysql 5.7.44 新版本 mysqld_safe --user=mysql --datadir=/usr/local/existing-datadir & #导入数据 #更新系统表,默认下面会检查所有数据库中的所有表是否与当前版本的MySQL不兼容,并修复相关问题 mysql_upgrade -u root -p -s #其中-s表:--upgrade-system-tables
注:如果转储文件dump中包含系统表,则不建议在服务器上启用gtid(gtid_mode=on)时加载转储文件。mysqldump为使用非事务性MyISAM存储引擎的系统表发出DML指令,并且在启用GTID时不允许这种组合。还要注意,将转储文件从启用了GTID的服务器加载到另一个启用了GTIDs的服务器会导致生成不同的事务标识符。
2)导入数据后,进行系统表更新
该过程中,运行mysql_upgrade脚本,它会检查并解决旧版本数据和升级后新版本之间的任何可能的不兼容问题。mysql_upgrade会更新mysql schema下的系统表,更新 Performance Schema 、 sys schema,以让我们可以充分利用可能已添加的新权限或功能。另还执行其他功能,更多参见:mysql_upgrade说明;
mysql_upgrade默认会处理user schema下的所有表,除非执行时追加 --upgrade-system-tables选项,执行过程中相关表会被锁定,导致无法访问,请等待检查完成;
vim /etc/my.cnf [client] port=3306 socket=/tmp/mysql.sock [mysqld] log-bin=mysql-bin server-id=100 character_set_server=utf8 init_connect='SET NAMES utf8' socket=/tmp/mysql.sock log-error=/var/log/mysqld.log pid-file=/run/mysqld/mysqld.pid innodb_data_file_path=ibdata1:200M:autoextend innodb_log_files_in_group=2 innodb_log_file_size=1572864000 innodb_page_size=16384 innodb_undo_directory=./ innodb_undo_tablespaces=0 #不区分大小写 lower_case_table_names=1 #sql_mode要注意,8.0中有变化,不支持NO_AUTO_CREATE_USER,新增sql_mode中的NO_ENGINE_SUBSTITUTION sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION max_connections=5000 default-time_zone = '+8:00' max_allowed_packet = 32M collation-server = utf8_general_ci basedir=/usr/local/mysql8.0 datadir=/usr/local/mysql/data skip_ssl default_authentication_plugin=mysql_native_password
登录旧版本的数据库
mysql -uroot -p'123456' #查看mysql版本 mysql> select version(); mysql> show variables like 'innodb_fast_shutdown'; #确保数据都刷到硬盘上,更改成0 mysql> set global innodb_fast_shutdown=0; mysql> shutdown; mysql> exit;Bye
使用安全模式启动MySQL 8.0:
/usr/local/mysql8/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql & #登录新版本数据库 mysql -uroot -p'123456' mysql> select version(); mysql> exit; #配置环境变量 vim /etc/profile #增加下面的内写 export PATH=$PATH:/usr/local/mysql8/bin source /etc/profile #客户端验证 which mysql mysql -V #导入数据 待补充 #修改密码 mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'xxxxx'; #配置启动项 cp /usr/local/mysql8/support-files/mysql.server /etc/init.d/mysqld # 修改启动项目 vim /etc/init.d/mysqld # 修改目录位置 basedir=/usr/local/mysql8 datadir=/usr/local/mysql/data # 添加到启动列表 chkconfig --add mysqld # 刷新启动信息 systemctl daemon-reload # 查看启动项列表 chkconfig --list #启动找不到pid mkdir /var/tmp/mysql touch /var/tmp/mysqlmysqld.pid chown -R mysql.mysql /var/tmp/mysqlmysqld.pid
更多参见官网升级说明:跳转进入