升级方式
理论上的两种升级方式
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、重启服务,更新完成