#本次升级原因一是没有妥善处理好mysql8.0.34升级8.0.38过程中报错线程不足问题,强行升级为8.1.0版本,并且参考网上修复教程删除了idb文件、等问题导致问题越来越严重,本次数据库数据为5000W左右,修复后最终缺失两个表,但是主数据没有影响,在此总结。
#如果docker版本的数据库升级不报错句柄数不足,线程不足等,在确认数据组ulimit数量正确和docker添加参数后启动依旧报错的情况下,可以添加特殊权限参数,查看是否能够正常启动和升级。
一、mysql8.0.34升级msqyl8.0.37过程中出现的报错
1.提示线程不足
解决过程: 尝试通过修改宿主机limit设置,增加线程;通过指定docker启动参数,指定docker数据库启动时的limit进程数,但是没有解决问题,通过后续排查,因是宿主机相关权限不足或限制导致的无法正常启动,
但是由于无法启动,已将8.0.34直接升级为8.1.0,虽然正常启动,但是后续无法降级和升级成8.4.1的数据库版本,并在过程中可能导致了数据库的.idb文件损坏或者相关文件确实的问题。
下面是后续数据库使用特殊权限启动的命令和参数:
docker run -p 6306:3306 --name mysql8038 --restart always --privileged=true -v ./mysql/conf:/etc/mysql/conf.d -v ./mysql/logs:/logs -v ./mysql/data:/var/lib/mysql -v /etc/localtime:/etc/localtime:ro -e MYSQL_ROOT_PASSWORD=密码 -d mysql:8.0.38 --lower_case_table_names=1
2.初始化字典验证不通过
解决过程: 处理完成后,后续报错为数据库初始化词典验证不通过,尝试通过innodb_force_recovery = 参数修复数据库,但是没有成功,后续通过重新启动相同版本数据库,并且拷贝mysql.idb文件后通过字典初始化。
3.恢复数据
解决过程:数据库正常启动,但是在持久化目录中,不显示数据和表,并且创建表时报错,表已存在。 后续通过在其他目录的相同版本中创建数据库和表、表结构。并重新将mysql.idb替换,重启。
通过重新关联表
ALTER TABLE
<database_name>.
<table_name> IMPORT TABLESPACE;
完成数据的恢复
4.过程中的报错
一、InnoDB 初始化失败
'/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock'
2024-07-17T09:32:44.065574Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
2024-07-17T09:32:44.067921Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.38) starting as process 1
2024-07-17T09:32:44.075436Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-07-17T09:32:44.118663Z 1 [ERROR] [MY-012592] [InnoDB] Operating system error number 2 in a file operation.
2024-07-17T09:32:44.118723Z 1 [ERROR] [MY-012593] [InnoDB] The error means the system cannot find the path specified.
2024-07-17T09:32:44.118739Z 1 [ERROR] [MY-012594] [InnoDB] If you are installing InnoDB, remember that you must create directories yourself, InnoDB does not create them.
2024-07-17T09:32:44.118759Z 1 [ERROR] [MY-012646] [InnoDB] File ./ibdata1: 'open' returned OS error 71. Cannot continue operation
处理:删除ibdata1文件,将其他持久化路径下的mysql.idb文件复制过去
二、关联和修复失败
ERROR 1815 (HY000): Internal error: Cannot reset LSNs in table net_log.inspection_record : Data structure corruption
处理:REPAIR TABLE net_log
.inspection_record
; 尝试修复表,运气好会成功
处理: docker启动命令添加参数 --innodb_force_recovery = 3 ,损坏程度的不同,可以尝试使用不同的值(1 到 6),存在数据损坏更加严重的危险,启动后尝试修复表REPAIR TABLE net_log
.inspection_record
;
处理: 验证是否修复SHOW TABLE STATUS LIKE ‘inspection_record’;,如果修复则去除 --innodb_force_recovery = 3 参数重启启动数据库
三、报错线程不足
'/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock'
2024-07-17T02:50:26.978606Z 0 [System] [MY-015015] [Server] MySQL Server - start.
2024-07-17T02:50:27.304599Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.4.1) starting as process 1
2024-07-17T02:50:27.313159Z 0 [Warning] [MY-010001] [Server] Can't create thread to handle bootstrap (errno: 1)
2024-07-17T02:50:27.313219Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2024-07-17T02:50:27.313232Z 0 [ERROR] [MY-010119] [Server] Aborting
2024-07-17T02:50:27.314894Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.4.1) MySQL Community Server - GPL.
2024-07-17T02:50:27.314907Z 0 [System] [MY-015016] [Server] MySQL Server - end.
处理: docker启动添加参数 --privileged=true 以特殊权限启动数据库。
原因可能是权限不足导致。