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
数据库中有数据
数据库中有其他用户
升级操作步骤:
下载地址:https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz
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
表中一定不能含有废弃的数据类型或函数
一定不能有.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
确保没有使用不支持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;
确保不要在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
注:那么应用也要做相应的修改,否则会造成不必要的麻烦
确保没有表的外键约束名称超过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;
在更新到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);
如果当前环境配置了冷关闭(innodb_fast_shutdown = 2),那么需要改为快速或慢关闭,如:
SET GLOBAL innodb_fast_shutdown = 1; --快关闭
SET GLOBAL innodb_fast_shutdown = 0; --慢关闭
通过快速或慢速关闭,InnoDB将其undo日志和数据文件保留在可以在发布版本之间存在文件格式差异的情况下处理的状态。
SET GLOBAL innodb_fast_shutdown=0; 这里选择慢关闭
/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 #备份启停脚本
“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 #注释掉
NONE:不尝试进行升级
AUTO:默认选项,MySQL 进行数据字典升级和服务升级
MINIMAL:仅升级数据字典
FORCE:强制升级,类似旧的 mysql_upgrade –force
cd /usr/local/mysql8/bin
./mysqld --upgrade=AUTO
cd /usr/local/mysql8/bin
./mysqladmin -uroot -p -S /tmp/mysql.sock shutdown
cp -p support-files/mysql.server /etc/init.d/mysqld
/etc/init.d/mysqld restart
export PATH=$PATH:/usr/local/mysql8/bin
source /etc/profile