前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >[MYSQL] mysql升级

[MYSQL] mysql升级

原创
作者头像
大大刺猬
发布2024-03-18 16:21:26
发布2024-03-18 16:21:26
34300
代码可运行
举报
文章被收录于专栏:大大刺猬大大刺猬
运行总次数:0
代码可运行

导读

之前有写过mysql升级的文章的, 比如: mysql5.5.x升级到8.0.x 在win环境 mysql5.7升级到8.0报错MY-013140 contains an invalid utf8mb3 character 甚至还有mariadb迁移到Mysql的. 尽是些花里胡哨的....

都是偏向于案例的那种, 不够标准.

所以这里来整理下 MYSQL升级注意事项MYSQL升级步骤

不涉及mysqlsh等使用

MYSQL升级注意事项

本文更多的是偏向于 mysql 5.7 升级到 mysql 8.0 毕竟小版本升级的注意事项小得多.

1. 存储引擎

mysql 8.0 系统表使用的是innodb存储引擎. 这对于平常使用来说, 似乎没啥影响. 也就是 5.7 数据导入的时候 需要注意 参数 disabled_storage_engines 别把myisam也加上就行.

MyISAM表转为InnoDB表: https://dev.mysql.com/doc/refman/8.0/en/converting-tables-to-innodb.html

2. 默认密码插件

mysql 8.0 的默认密码加密插件参数disabled_storage_enginescaching_sha2_password 可能存在部分应用不支持的情况. 比如 mysql-connector-java-5.1.34.jar 不支持mysql 8.0 (不只是密码插件问题), 但应用框架又不支持升级这个驱动, 这时候就比较麻烦了.

所以建议修改其值为 mysql_native_password

mysql_native_password 原理: https://cloud.tencent.com/developer/article/2242261

caching_sha2_password 原理: https://cloud.tencent.com/developer/article/2247829

3. 默认参数

一些默认参数的值也有变化

Server changes

Option/Parameter

5.7 默认值

8.0 默认值

character_set_server

latin1

utf8mb4

collation_server

latin1_swedish_ci

utf8mb4_0900_ai_ci

explicit_defaults_for_timestamp

OFF

ON

optimizer_trace_max_mem_size

16KB

1MB

validate_password_check_user_name

OFF

ON

back_log

-1 (autosize) changed from : back_log = 50 + (max_connections / 5)

-1 (autosize) changed to : back_log = max_connections

max_allowed_packet

4194304 (4MB)

67108864 (64MB)

max_error_count

64

1024

event_scheduler

OFF

ON

table_open_cache

2000

4000

log_error_verbosity

3 (Notes)

2 (Warning)

local_infile

ON (5.7)

OFF

8.0 为了安全 local_infile是关闭的, 使用load data的时候需要注意下

InnoDB changes

Option/Parameter

5.7 默认值

8.0 默认值

innodb_undo_tablespaces

0

2

innodb_undo_log_truncate

OFF

ON

innodb_flush_method

NULL

fsync (Unix), unbuffered (Windows)

innodb_autoinc_lock_mode

1 (consecutive)

2 (interleaved)

innodb_flush_neighbors

1 (enable)

0 (disable)

innodb_max_dirty_pages_pct_lwm

0 (%)

10 (%)

innodb_max_dirty_pages_pct

75 (%)

90 (%)

Performance Schema changes

performance-schema-instrument='wait/lock/metadata/sql/%=ON'

OFF

ON

performance-schema-instrument='memory/%=COUNTED'

OFF

COUNTED

performance-schema-consumer-events-transactions-current=ON

OFF

ON

performance-schema-consumer-events-transactions-history=ON

OFF

ON

performance-schema-instrument='transaction%=ON'

OFF

ON

8.0 很多PS监控都开启了, 但还是太少了. 建议 performance-schema-instrument="memory/%"=ON

Replication changes

Option/Parameter

5.7 默认值

8.0 默认值

log_bin

OFF

ON

server_id

0

1

log-slave-updates

OFF

ON

expire_logs_days

0

30

master-info-repository

FILE

TABLE

relay-log-info-repository

FILE

TABLE

transaction-write-set-extraction

OFF

XXHASH64

slave_rows_search_algorithms

INDEX_SCAN, TABLE_SCAN

INDEX_SCAN, HASH_SCAN

slave_pending_jobs_size_max

16M

128M

gtid_executed_compression_period

1000

0

Group Replication changes

group_replication_autorejoin_tries

0

3

group_replication_exit_state_action

ABORT_SERVER

READ_ONLY

group_replication_member_expel_timeout

0

5

8.0的binlog默认是开启的.

MYSQL升级步骤

mysql升级分为逻辑升级和物理升级两种, 选一种即可

逻辑升级即为: 数据从低版本导出, 并导入到高版本.

物理升级即为: 替换原有Mysqld相关文件,并启动数据库后,使用mysql_upgrade连接数据库.

升级前一定要做好备份.

逻辑迁移升级

mysql逻辑升级 就是使用mysqldump/mydumper之类的工具逻辑导出原数据库数据, 然后导入新环境

需要注意的是, 如果存储过程存在注释的时候, 导入数据需要加上-c 不然注释导入不进去

例子:

导出:

代码语言:shell
复制
mysqldump --single-transaction --master-data=2 --all-tablespaces --triggers --routines --events > alldb_20240318.sql

导入:

注意-c --comments Preserve comments. Send comments to the server

代码语言:shell
复制
mysql -c < alldb_20240318.sql

如果觉得导入太慢的话, 可以使用并发导入

物理原地升级

备份数据目录(可选,但建议执行)

代码语言:javascript
代码运行次数:0
复制
cp /data/mysql_3314 /data/mysql_3314.bak20230831

关闭应用连接

关闭应用连接

如果有xa事务, 请注意及时提交或者回滚

关闭数据库

代码语言:javascript
代码运行次数:0
复制
mysql -u root -p --execute="SET GLOBAL innodb_fast_shutdown=0"
mysqladmin -u root -p shutdown

替换Mysql软件目录

代码语言:javascript
代码运行次数:0
复制
tar -xvf mysql-5.7.43-linux-glibc2.12-x86_64.tar.gz
mv /soft/mysql_3314/mysqlbase/mysql /soft/mysql_3314/mysqlbase/mysql.old
mv  mysql-5.7.43 /soft/mysql_3314/mysqlbase/mysql

启动Mysql数据库

代码语言:javascript
代码运行次数:0
复制
mysqld_safe --user=mysql --datadir=/path/to/existing-datadir &  #mysqld_safe是新的哈
#systemctl start mysqld

更新数据字典

代码语言:javascript
代码运行次数:0
复制
#mysql_upgrade --version
mysql_upgrade -u root -p  #mysql_upgrade也新版本的哈, 如果是8.0.16及其之后的版本可以不用执行这一步

升级帮助文档和时区(可选)

这一步可选, 如果时区没得问题可以跳过.

代码语言:javascript
代码运行次数:0
复制
mysql -u root -p mysql < fill_help_tables.sql
代码语言:javascript
代码运行次数:0
复制
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

重启mysql

升级完成之后, 一定要重启mysql

代码语言:javascript
代码运行次数:0
复制
mysqladmin -u root -p shutdown
mysqld_safe --user=mysql --datadir=/path/to/existing-datadir &
#systemctl start mysqld

测试

重启完成后,日志无报错信息, 连接数据库测试没问题后, 即代表升级完成

总结

1. mysql升级前要 提前做好兼容性验证. 比如我这篇文章没有讲的 8.0.12 之后的版本,时间默认值要有括号, 之前的不能有括号. 解析ibd文件的时候发现的

2. 开始升级前一定要做好备份.

3. 低峰期再进行升级操作

4. 如果又从库的话, 建议滚动升级. 当然, 如果停机窗口时间充足的话, 就随便了.

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导读
  • MYSQL升级注意事项
    • 1. 存储引擎
    • 2. 默认密码插件
    • 3. 默认参数
      • Server changes
      • InnoDB changes
      • Replication changes
  • MYSQL升级步骤
    • 逻辑迁移升级
      • 导出:
      • 导入:
    • 物理原地升级
      • 备份数据目录(可选,但建议执行)
      • 关闭应用连接
      • 关闭数据库
      • 替换Mysql软件目录
      • 启动Mysql数据库
      • 更新数据字典
      • 升级帮助文档和时区(可选)
      • 重启mysql
      • 测试
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档