mysql5.6-8.0升级

升级方式

理论上的两种升级方式

inplace就地升级

大致思路:在一台服务器上,进行原版本升级到新版本,风险较大。如果是主从环境可以先就地升级从库,然后再升级主库,滚动方式升级。

逻辑迁移升级

大致思路:准备新的服务器,然后将数据从源库中逻辑导出,然后再导入到新的数据库中,数据量大的时候,会很慢。例如:
如果是一主一从(主->从1),在有条件的情况下,可以新准备一台服务器,采用物理备份的方式将数据备份恢复到新的服务中,然后构建从库的从库(主->从1->从2),最后将从2进行inplace方式升级,然后进行业务验证,验证完成后构建主->从2。升级从1,将(主->从1)的从1断开,从1升级完成后,构建(主->从1,主->从2),此时可以升级主库,主库停止写业务,主从关系变更为(从1->从2)原从1承担写库,待主库完成升级后重新加入主从即可。

本次采用就地升级的方式,即直接使用原来的data目录

升级过程

进入5.6服务中

set global innodb_fast_shutdown=0 #启动慢关机,当前缓冲区处理完再关机,使所有的内容落入磁盘中

之后关闭服务

./mysql5.6/bin/mysqladmin -uroot -p shutdown

升级到5.7

1、在新版本5.7目录下直接启动,使用之前5.6配置就可以,启动这次的目的是执行升级,兼容问题暂时不考虑,升级之后调整参数后重新启动

./mysql5.7/bin/mysqld_safe --defaults-file=/etc/my_5.6.cnf &

1、或者先更改配置文件再启动

2、检查5.7版本升级检测

./mysql5.7/mysqlcheck -uroot -p --all-databases --check-upgrade

如果表都是ok,就表示没问题

3、开始升级

./mysql5.7/msyql_upgrade -uroot -p

4、升级完之后需要修改配置参数

[mysqld]
basedir=path/mysql5.7
datadir=path/mysql5.6
#mysql5.7版本默认启动sql严格模式,这可能导致之前没有问题的sql升级之后报错,修改为5.6版本的非严格模式
sql-mode= NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
#表名大小写自动匹配
lower_case_table_names=1

5、重新启动服务

./mysql5.6/support-file/mysql.service restart 这个可能不成功,默认是从/etc/my.cnf中读取位置的

./mysql5.6/bin/mysqladmin -uroot -p shutdown

./mysql5.7/bin/mysqld_safe --defaults-file=/etc/my_5.6.cnf &

至此升级到5.7结束

升级到8.0

mysql5.7升级到8.0的注意事项如下:

  • MySQL-8.0不支持跨版本升级,只能从5.7升级到8.0,不支持5.5,5.6直接升级到8.0。

  • 原mysql5.7 mysql库下不能存在dictinary table同名的表

  • 不支持老版本(5.6之前)的数据类型decimal,varchar, data/datetime/timestamp, 通过check table xxx for upgrade可以检测

  • non-native 分区表不支持

  • 不支持5.0之前的trigger,5.0之前的trigger没有definer

  • foreign key constraint name 不能超过64字节

  • view的column不能超过255 chars

  • enum 类型不能超过255 chars.

  • frm需与InnoDB系统表一致

  • 一些空间函数如PointFromText需修改为ST_POINTFROMTEXT

检查原mysql5.7 mysql库下是否存在dictinary table同名的表

SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE LOWER(TABLE_SCHEMA) = 'mysql'
and LOWER(TABLE_NAME) IN
(
'catalogs',
'character_sets',
'check_constraints',
'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'
);

约束名称不能超过64

SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME IN
  (SELECT LEFT(SUBSTR(ID,INSTR(ID,'/')+1),
               INSTR(SUBSTR(ID,INSTR(ID,'/')+1),'_ibfk_')-1)
   FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN
   WHERE CHAR_LENGTH(SUBSTR(ID,INSTR(ID,'/')+1))>64);

操作具体操作过程参考官网:MySQL :: MySQL 8.0 参考手册 :: 2.10.5 准备安装以进行升级

或者直接使用8.0的检索工具:wget https://downloads.mysql.com/archives/get/p/43/file/mysql-shell-8.0.25-linux-glibc2.12-x86-64bit.tar.gz

./bin/mysqlsh -uroot -p -S /path/mysql.sock -e “util.checkForServerUpgrade()”

Errors: 0 # 检查是否有错误,如果没有,则可以进行升级

Warnings: 1

Notices: 1

具体操作

1、在新版本8.0目录下直接启动,使用之前5.6配置就可以,启动这次的目的是执行升级,兼容问题暂时不考虑,升级之后调整参数后重新启动,8.0.16版本之后启动自动制动执行升级

./mysql8.0/bin/mysqld_safe --defaults-file=/etc/my_5.6.cnf &

1、或者先更改配置文件再启动

2、参数更改

#symbolic-links=0
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION #根据之前版本适当兼容变化
#expire_logs_days=15 #参数废弃
binlog_expire_logs_seconds=1296000
default_authentication_plugin=mysql_native_password

带上5.7更改的参数,总需要修改为

[mysqld]
# 或者将sql-mode设置为空,即 sql-mode=""
sql-mode= NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
lower_case_table_names=1
#expire_logs_days=15 #参数废弃
binlog_expire_logs_seconds=1296000
default_authentication_plugin=mysql_native_password

3、重启服务,更新完成

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值