mysql5.7升级mysql8
说明:
1、本次升级是以mysql5.7.27的二进制安包为版本,从而可以避免较长时间的源码编译
2、从MySQL5.7可以直接升级到8.0,然而仅限与General Availability (GA) 版本之间,然后也只是5.7.9及以上版本支持。如果是非GA版本,那么不支持直接升级。
3、跨版本升级是不支持的,如:从5.6升级到8.0。
升级前:
版本为5.7.27
有数据库wg_qc_common;wg_qc_sm_9
数据库中有数据
数据库中有其他用户
升级操作步骤:
step1:下载mysql8.0.16的 二进制安装包,并上传指定目录
下载地址:https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz
step2:解压到指定目录并更改安装包的属性
cd /root/
tar -xf mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz -C /usr/local/ && cd /usr/local/
mv mysql-8.0.16-linux-glibc2.12-x86_64 mysql8 && chown -R mysql.mysql mysql8
step3:手动检查是否满足升级条件
1)下面问题必须不能出现
表中一定不能含有废弃的数据类型或函数
一定不能有.frm文件
确保触发器触发器必须没有缺少或空的定义或无效的定义(通过SHOW TRIGGERS或INFORMATION_SCHEMA TRIGGERS表上来你查看触发器中的character_set_client,collation_connection,Database Collation的值)
cd /usr/local/mysql57/bin
./mysqlcheck -u root -p –all-databases –check-upgrade
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;
3)表名和数据字典名词
确保不要在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_type_elements',
'columns',
'events',
'foreign_key_column_usage',
'foreign_keys',
'index_column_usage',
'index_partitions',
'index_stats',
'indexes',
'parameter_type_elements',
'parameters',
'routines',
'schemata',
'st_spatial_reference_systems',
'table_partition_values',
'table_partitions',
'table_stats',
'tables',
'tablespace_files',
'tablespaces',
'triggers',
'version',
'view_routine_usage',
'view_table_usage'
);
如果有这样的表,那么必须重命名。如:
LOCK TABLE old_table1 WRITE; –如果有数据写入,可以暂时锁该表。
Alter TABLE old_table1 RENAME new_table1
注:那么应用也要做相应的修改,否则会造成不必要的麻烦
4)外键约束名称
确保没有表的外键约束名称超过64个字符的,可通过以下SQL查看:
SELECT CONSTRAINT_SCHEMA, TABLE_NAME,CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
WHERE LENGTH(CONSTRAINT_NAME) > 64;
如果有,那么要修改。如:
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;
5)Mysql8不支持的表应迁移到InnoDB中
在更新到8.0.13或更高之前,要确保没有表分区存储在InnoDB表空间中,包括系统表空间和一般表空间。可通过以下SQL查询
SELECT DISTINCT NAME, SPACE, SPACE_TYPE
FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES
WHERE NAME LIKE '%#P#%' AND SPACE_TYPE NOT LIKE 'Single';
如果有,则将表从共享表空间移到自己的表空间中( innodb-file-per-table ),如:
ALTER TABLE table_name REORGANIZE PARTITION partition_name
INTO (partition_definition TABLESPACE=innodb_file_per_table);
step4:备份原来的数据库
1)快速关库
如果当前环境配置了冷关闭(innodb_fast_shutdown = 2),那么需要改为快速或慢关闭,如:
SET GLOBAL innodb_fast_shutdown = 1; –快关闭
SET GLOBAL innodb_fast_shutdown = 0; –慢关闭
通过快速或慢速关闭,InnoDB将其undo日志和数据文件保留在可以在发布版本之间存在文件格式差异的情况下处理的状态。
SET GLOBAL innodb_fast_shutdown=0; 这里选择慢关闭
2)停止数据库并备份
/etc/init.d/mysqld stop #关闭数据库
或者
cd /usr/local/mysql57/bin
./mysqladmin -u root -p shutdown #关闭数据库(涉及主从同步的话,建议先关闭主从同步进程,再停掉主数据库)
ps -ef | grep mysqld | grep -v grep #确认不存在mysql进程
cp -rf -p /u01/mysql/data /u01/mysql/data_5.7 #备份数据文件
cp -p /etc/my.cnf /etc/my.cnf_5.7 #备份配置文件
cp -p /etc/init.d/mysqld /etc/init.d/mysqld_5.7 #备份启停脚本
step5:修改配置文件(/etc/my.cnf)
“basedir = /usr/local/mysql #替换成“basedir = /usr/local/mysql8”
lower_case_table_names = 1 #(mysql5.7有,检查下)
skip-grant-tables #不添加,后期会用到
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER #不添加,后期会用到
query_cache_size = 64M #注释掉
query_cache_limit = 2M #注释掉
query_cache_type = 2 #注释掉
query_cache_min_res_unit = 2k #注释掉
default_table_type = InnoDB #注释掉
step6:升级数据库
1)MySQL 8.0.16 的新的升级方式,在 mysqld 额外添加了一个新的选项 –upgrade,可选值为 NONE,AUTO,MINIMAL,FORCE。
NONE:不尝试进行升级
AUTO:默认选项,MySQL 进行数据字典升级和服务升级
MINIMAL:仅升级数据字典
FORCE:强制升级,类似旧的 mysql_upgrade –force
2)MySQL 8.0.16 新的升级方式,总体来说分为2个步骤
1> 升级数据字典(DD)
2> 服务器升级:升级 MySQL 系统表、升级用户表、升级 sys 表、升级帮助更新表
cd /usr/local/mysql8/bin
./mysqld –upgrade=AUTO
3)关闭数据库
cd /usr/local/mysql8/bin
./mysqladmin -uroot -p -S /tmp/mysql.sock shutdown
4)拷贝启动脚本
cp -p support-files/mysql.server /etc/init.d/mysqld
step7:重启数据库
/etc/init.d/mysqld restart
step8:将mysql命令加入环境变量中(/etc/profile)及验证升级后的版本
export PATH=$PATH:/usr/local/mysql8/bin
source /etc/profile
step9:验证数据完整性