mysql - 启动错误InnoDB: mmap(137363456 bytes) failed; errno 12

调整InnoDB内存设置
本文介绍了如何通过修改my.cnf文件中的InnoDB缓存池大小来解决因物理内存不足导致的问题,并建议将innodb_buffer_pool_size数值调小。

这是由于物理内存不够导制的,所以vim /etc/my.cnf

[inonodb]
innodb_buffer_pool_size=64MB  把这个数值改小 高版本的默认是128mb 

 

最后欢迎大家访问我的个人网站:1024s​​​​​​​

iot-database | 2025-07-04T08:35:21.579433Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority(). iot-database | 2025-07-04T08:35:21.591130Z 0 [ERROR] [FATAL] InnoDB: Table flags are 0 in the data dictionary but the flags in file ./ibdata1 are 0x4800! iot-database | 2025-07-04 08:35:21 0x7fb876c66880 InnoDB: Assertion failure in thread 140430243424384 in file ut0ut.cc line 921 iot-database | InnoDB: We intentionally generate a memory trap. iot-database | InnoDB: Submit a detailed bug report to http://bugs.mysql.com. iot-database | InnoDB: If you get repeated assertion failures or crashes, even iot-database | InnoDB: immediately after the mysqld startup, there may be iot-database | InnoDB: corruption in the InnoDB tablespace. Please refer to iot-database | InnoDB: http://dev.mysql.com/doc/refman/5.7/en/forcing-innodb-recovery.html iot-database | InnoDB: about forcing recovery. iot-database | 08:35:21 UTC - mysqld got signal 6 ; iot-database | This could be because you hit a bug. It is also possible that this binary iot-database | or one of the libraries it was linked against is corrupt, improperly built, iot-database | or misconfigured. This error can also be caused by malfunctioning hardware. iot-database | Attempting to collect some information that could help diagnose the problem. iot-database | As this is a crash and something is definitely wrong, the information iot-database | collection process might fail.
最新发布
07-05
<think>我们面对的是一个MySQL容器启动失败的问题,错误日志显示InnoDB存储引擎在启动过程中遇到了严重错误。 关键错误信息: [ERROR] [FATAL] InnoDB: Table flags are 0 in the data dictionary but the flags in file ./ibdata1 are 0x4800! 随后触发了断言失败,导致mysqld进程崩溃(signal 6)。 问题分析: 1. 错误原因:InnoDB数据字典(存储在系统表空间文件ibdata1中)的表标志(table flags)与内存中的数据字典不匹配。 2. 可能场景: - 数据文件损坏(可能是由于不正常的关机、磁盘故障等) - MySQL版本升级或降级后,数据文件格式不兼容 - 在复制或移动数据文件时出现了问题 解决方案: 根据MySQL官方文档(参考链接:https://dev.mysql.com/doc/refman/5.7/en/forcing-innodb-recovery.html), 我们可以尝试通过强制恢复模式启动MySQL来修复。 具体步骤: 步骤1:在my.cnf配置文件中设置强制恢复模式 - 在[mysqld]部分添加配置:innodb_force_recovery = N (N的取值从1到6,逐级提高) - 建议从1开始尝试,如果无法启动则逐步增加,直到能启动为止 步骤2:启动MySQL并导出数据 - 在恢复模式下启动后,MySQL处于只读状态,需要立即备份数据库 - 使用mysqldump导出所有数据 步骤3:重建数据目录 - 删除原有数据目录(包括ibdata1, ib_logfile*等文件) - 重新初始化MySQL,然后导入备份的数据 步骤4:移除恢复模式配置并正常启动 在Docker环境中的操作示例: 1. 修改docker-compose.yml,在环境变量或配置文件中设置恢复模式: ```yaml environment: - MYSQL_ROOT_PASSWORD=Qinyu456 # 添加恢复模式环境变量(对应my.cnf中的配置) - MYSQL_INNODB_FORCE_RECOVERY=1 ``` 或者通过挂载自定义配置文件: ```yaml volumes: - ./custom-my.cnf:/etc/mysql/conf.d/custom-my.cnf ``` 在custom-my.cnf中写入: ```ini [mysqld] innodb_force_recovery=1 ``` 2. 启动容器并尝试导出数据: ```bash docker exec -it iot-database mysqldump -u root -p --all-databases > full_backup.sql ``` 3. 停止容器,删除数据卷(或清空数据目录): ```bash docker-compose down sudo rm -rf ./db-data/* ``` 4. 移除恢复模式配置(删除环境变量或配置文件中的设置),重新启动容器。 5. 导入备份数据: ```bash docker exec -i iot-database mysql -u root -p < full_backup.sql ``` 注意事项: - 强制恢复模式级别说明: 1 (SRV_FORCE_IGNORE_CORRUPT): 忽略损坏的页 2 (SRV_FORCE_NO_BACKGROUND): 阻止主线程运行 3 (SRV_FORCE_NO_TRX_UNDO): 不运行事务回滚 4 (SRV_FORCE_NO_IBUF_MERGE): 不进行插入缓冲合并 5 (SRV_FORCE_NO_UNDO_LOG_SCAN): 启动时不查看撤销日志 6 (SRV_FORCE_NO_LOG_REDO): 不进行前滚恢复 - 在恢复模式下,只能进行SELECT(级别1-3)或只读操作(级别4以上),不能进行DDL操作。 如果以上方法无法恢复,可能需要从备份中恢复数据,或者使用专业的数据恢复工具。 §§相关问题§§ 1. 如何判断InnoDB数据文件损坏的具体原因? 2. 在Docker环境中,如何安全地删除MySQL数据卷并重新初始化? 3. 除了强制恢复模式,还有哪些方法可以修复损坏的InnoDB表? 4. 如何配置MySQL的定期备份策略以防止数据丢失? 5. 在Kubernetes环境中如何实现MySQL数据卷的自动备份和恢复?</think>### MySQL容器因InnoDB文件损坏崩溃的解决方案 #### 错误分析: 日志显示核心错误: ```log [ERROR] [FATAL] InnoDB: Table flags are 0 in the data dictionary but the flags in file ./ibdata1 are 0x4800! ``` 这表明 **InnoDB系统表空间文件(ibdata1)损坏**,常见原因包括: 1. **异常关机**:容器被强制终止导致数据未刷盘 2. **磁盘空间不足**:写操作中断导致文件损坏 3. **版本升级问题**:MySQL版本变更后数据文件不兼容 4. **硬件故障**:底层存储设备问题 --- ### 修复步骤: #### 1. 强制恢复模式启动 修改配置文件 `my.cnf`: ```ini [mysqld] innodb_force_recovery = 4 # 恢复级别1-6,从低到高尝试 ``` - 级别1:忽略损坏页 - 级别4:禁止回滚日志 - 级别6:禁用redo日志 #### 2. 数据备份(只读模式) 启动容器后立即备份: ```bash docker exec iot-database mysqldump -u root -p --all-databases > full_backup.sql ``` #### 3. 重建数据目录 ```bash # 停止容器 docker-compose down # 重命名损坏目录(保留原始文件) mv ./db-data ./db-data-corrupted # 创建新目录 mkdir ./db-data && chown 999:999 ./db-data ``` #### 4. 恢复数据 ```bash # 启动新容器 docker-compose up -d # 导入备份 docker exec -i iot-database mysql -u root -p < full_backup.sql ``` --- ### 预防措施: 1. **启用双写缓冲**(MySQL 8.0默认开启): ```ini innodb_doublewrite = ON ``` 2. **定期验证数据文件**: ```bash docker exec iot-database mysqlcheck -u root -p --all-databases --check ``` 3. **配置崩溃安全写入**: ```yaml # docker-compose.yml environment: - INNODB_FLUSH_METHOD=O_DIRECT - INNODB_FLUSH_LOG_AT_TRX_COMMIT=1 ``` 4. **使用数据卷备份**: ```bash # 每日快照备份 tar -czvf mysql-backup-$(date +%F).tar.gz ./db-data ``` --- ### 损坏文件分析工具: ```mermaid graph LR A[损坏文件] --> B[innochecksum] A --> C[ibd2sdi] A --> D[MySQL Utilities] B --> E[验证页校验和] C --> F[提取元数据] D --> G[可视化分析] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值