背景
Mysql数据库版本升级前的准备工作
写在前面
需要(考虑)检查和测试的层面很多,不限于以下内容。(此文会不断补充)
检查项
基于官方文档和一些其他文档进行的整理
仅在一般可用性(GA)版本之间支持升级。
驱动业务从MySQL 5.5升级到MySQL 5.7的很大一个因素是因为JSON这个特性。
0.通过创建备份来保护您的数据。备份应包括mysql系统数据库,该数据库包含MySQL系统表
1.sql_mode 需要改
2.建议使用物理备份,甚至如果条件允许,直接使用冷备模式
3.关闭数据库之前,首先是使用show processlist检查是否连接已经关闭
4.MySQL 8将默认身份验证插件更改为caching_sha2_password,而MySQL 5.7不支持该插件。
5.支持从MySQL 5.5升级到5.6。建议先升级到最新版本,再升级到下一版本。例如,在升级到MySQL 5.6之前,先升级到最新的MySQL 5.5版本。不支持跳过版本的升级。例如,不支持直接从MySQL 5.1升级到5.6。
6.检查项:
6.1.mysqlcheck --defaults-file=/usr/local/sandboxes/msb_5_7_26/master/my.sandbox.cnf --socket=/tmp/mysql_sandbox17261.sock -u msandbox -p --all-databases --check-upgrade
如果有错误,必须修正。
6.2.分区表
确保没有使用不支持native分区的存储引擎的分区表,可通过以下命令查询:
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE NOT IN ('innodb', 'ndbcluster') AND CREATE_OPTIONS LIKE '%partitioned%';
如果有返回结果,那么一定要将该分区表该为innodb存储引擎,或改为非分区表。
改表的存储引擎:ALTER TABLE table_name ENGINE = INNODB;
将分区表改为非分区表:ALTER TABLE table_name REMOVE PARTITIONING;
6.3.关键字在MySQL 8.0版本中新增了一些关键字,而我们都知道关键字我们是无法使用的,如果在之前版本中使用了,那么就会报错。
具体哪些关键字,请查看官方文档:https://dev.mysql.com/doc/refman/8.0/en/keywords.html
6.4.表名和数据字典名词,确保不要在MySQL 5.7版本的mysql系统数据库中有和8.0中数据字典相同名称的表。
可通过以下SQL查询:(需要去除行之间的回车键)SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE LOWER(TABLE_SCHEMA) = 'mysql'
and LOWER(TABLE_NAME) IN
( 'catalogs', 'character_sets', 'collations', 'column_statistics', 'column_type_elements', 'columns', 'dd_properties',
'events', 'foreign_key_column_usage', 'foreign_keys', 'index_column_usage', 'index_partitions', 'index_stats', 'indexes',
'parameter_type_elements', 'parameters', 'resource_groups', 'routines', 'schemata', 'st_spatial_reference_systems', 'table_partition_values',
'table_partitions', 'table_stats', 'tables', 'tablespace_files', 'tablespaces', 'triggers', 'view_routine_usage', 'view_table_usage' );
如果有这样的表,那么必须重命名。如:LOCK TABLE old_table1 WRITE; --如果有数据写入,可以暂时锁该表。
Alter TABLE old_table1 RENAME new_table1
注:那么应用也要做相应的修改,否则会造成不必要的麻烦。
注意:不推荐不同版本之间的复制架构。例如:高到低,8.0主站-> 5.7从站 会造成,大版本字符集到小版本不支持
已知问题
低版本升级<5.6,推荐逻辑升级。
可以通过执行INPLACE升级或LOGICAL升级来升级服务器:
方法一:INPLACE升级包括关闭MySQL 5.7服务器,用MySQL 8.0二进制文件替换旧的二进制文件,然后在旧的数据目录上启动MySQL 8.0服务器。(快)不要导入数据
方法二:LOGICAL升级涉及使用备份或导出实用程序(如mysqldump或mysqlpump)从MySQL 5.7版本导出SQL ,安装MySQL 8.0二进制文件,然后将SQL导入于新的MySQL版本。(兼容问题多)
参考文档
https://dev.mysql.com/doc/refman/5.6/en/upgrade-binary-package.html https://www.percona.com/blog/2018/08/07/replicating-mysql-8-0-mysql-5-7/
link
link
这是一项艰巨的工程
补充
以下原创 杨建荣 杨建荣的学习笔记
MySQL 5.7升级到MySQL 8.0的一些差异:
细节1:
比如我们在MySQL 5.7版本中全面推行GTID,所以之前的create table xxx as select * from xx的使用模式就不奏效了,(LT,原因就是GTID不允许)
进而我们建议使用:
create table xxx like xxxxx;
insert into xxx select * from xxxxx;
细节2:
在MySQL 5.7中字段名为rank是可以的,但是在8.0中因为有了窗口函数,字段名为rank就报错,顺着这个思路,其实我们一窥窗口函数。
JDBC驱动变更
需要调整为如下的格式:
String Url="jdbc:mysql://211.159.xxx:33071/maxwell_test?useUnicode=true&characterEncoding=utf-8&useSSL=false&&serverTimezone=GMT";
相应的加载驱动程序则需要
Class.forName("com.mysql.jdbc.Driver");
修改为:
Class.forName("com.mysql.cj.jdbc.Driver");
一个是整数类型的长度警告,另外一个是字符集警告,
展开来说,整数类型的长度警告信息为:Integer display width is deprecated and will be removed in a future,意思是int(11)这种写法已经过时了,应该直接写int,bigint
而字符集配置,在MySQL8.0里面默认是utf8mb4,如果我们手工写了utf8类型,会提示:'utf8' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous.
当然如果你设置的全局字符集是utf8,则无警告的情况字符集仍然为utf8
安装包空间大小:
395M mysql5.0.95
484M mysql5.1.73
752M mysql5.5.62
1.2G mysql5.6.51
2.5G mysql5.7.32
8.5G mysql8.0.22
新业务新代码使用Mysql8.0是可以的
本文说明,主要技术内容来自互联网技术大佬的分享,还有一些自我的加工(仅仅起到注释说明的作用)。如有相关疑问,请留言,将确认之后,执行侵权必删