之前有写过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 5.7 升级到 mysql 8.0 毕竟小版本升级的注意事项小得多.
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
mysql 8.0 的默认密码加密插件参数disabled_storage_engines
是 caching_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
一些默认参数的值也有变化
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的时候需要注意下
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
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升级分为逻辑升级和物理升级两种, 选一种即可
逻辑升级即为: 数据从低版本导出, 并导入到高版本.
物理升级即为: 替换原有Mysqld相关文件,并启动数据库后,使用mysql_upgrade连接数据库.
升级前一定要做好备份.
mysql逻辑升级 就是使用mysqldump/mydumper之类的工具逻辑导出原数据库数据, 然后导入新环境
需要注意的是, 如果存储过程存在注释的时候, 导入数据需要加上-c 不然注释导入不进去
例子:
mysqldump --single-transaction --master-data=2 --all-tablespaces --triggers --routines --events > alldb_20240318.sql
注意-c
--comments Preserve comments. Send comments to the server
mysql -c < alldb_20240318.sql
如果觉得导入太慢的话, 可以使用并发导入
cp /data/mysql_3314 /data/mysql_3314.bak20230831
关闭应用连接
如果有xa事务, 请注意及时提交或者回滚
mysql -u root -p --execute="SET GLOBAL innodb_fast_shutdown=0"
mysqladmin -u root -p shutdown
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
mysqld_safe --user=mysql --datadir=/path/to/existing-datadir & #mysqld_safe是新的哈
#systemctl start mysqld
#mysql_upgrade --version
mysql_upgrade -u root -p #mysql_upgrade也新版本的哈, 如果是8.0.16及其之后的版本可以不用执行这一步
这一步可选, 如果时区没得问题可以跳过.
mysql -u root -p mysql < fill_help_tables.sql
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
升级完成之后, 一定要重启mysql
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 删除。