Redmine初始化阶段报Internal Error,提示缺少settings.frm且权限拒绝
错误根因澄清
你对报错的判断存在核心偏差:Can't find file: './redmine/settings.frm' (errno: 13 - Permission denied) 不是指你缺失这个文件需要手动放置,errno13代表权限拒绝,是MySQL运行进程没有权限读取/访问对应路径下的数据库文件。settings.frm是MySQL存储表结构的系统文件,由数据库在创建表时自动生成,完全不需要手动准备、手动拷贝,更不存在需要你手动编写文件内容的场景。
分步排查解决
1. 先修正MySQL数据目录的权限问题
报错里的./redmine/指MySQL存储根目录下名为redmine的数据库文件夹,默认根目录路径为/var/lib/mysql:
- 先确认目录当前的权限配置:执行
ls -ld /var/lib/mysql /var/lib/mysql/redmine,查看属主、属组信息 - MySQL进程的默认运行身份是
mysql系统用户,必须保证整个数据目录的所有权归属于mysql用户,否则进程会因为无权限读取文件,报出类似“文件丢失”的权限错误 - 修正目录所有权的命令:
chown -R mysql:mysql /var/lib/mysql/ - 如果你使用的是开启默认SELinux的发行版(匹配你环境里Apache 2.4.6版本的系统一般为CentOS 7系列),仅修正unix文件权限还不够,需要还原目录的SELinux安全上下文,否则系统依然会拦截MySQL的访问请求:
restorecon -R -v /var/lib/mysql/
2. 确认是否完成Redmine的数据库初始化
权限配置正常后依然报错找不到settings表,基本都是因为漏了数据库迁移步骤——settings表是Redmine自动创建的核心表,从未经过建表流程的话,对应的frm文件本来就不存在:
- 进入Redmine的项目根目录,确认已经完成所有初始化步骤:
- 正确配置
config/database.yml,填写对应当前redmine数据库的连接账号、密码、库名,指定数据库编码为utf8mb4 - 执行数据库迁移命令自动创建所有数据表:
bundle exec rake db:migrate RAILS_ENV=production - 执行插件迁移命令:
bundle exec rake redmine:plugins:migrate RAILS_ENV=production - 执行会话密钥生成命令:
bundle exec rake generate_secret_token RAILS_ENV=production
- 正确配置
- 整个建表流程由Rails迁移脚本自动完成,MySQL会在创建
settings表时自动生成对应的settings.frm、数据文件,全程不需要人工介入。
3. 验证修复结果
- 登录MySQL命令行,切换到redmine库下执行
SHOW TABLES;,如果列表中能看到settings表,再执行DESC settings;可以正常输出表结构,说明文件已经被MySQL正常识别 - 重新访问Redmine地址,即可正常加载初始化引导页面。
注意事项
- 绝对不要从其他渠道手动拷贝
settings.frm文件到数据库目录:frm文件和MySQL版本严格绑定,跨版本拷贝会直接造成数据库表损坏 - 不要给MySQL数据目录配置过度宽松的权限(比如777),正确配置下仅需保证mysql用户对目录有全权限即可,其他系统用户保持最小访问权限
- 如果你之前手动创建了redmine库但没有授权给Redmine使用的数据库账号,也需要提前在MySQL中执行授权命令,保证Redmine的连接账号有对应库的全部操作权限。
内容的提问来源于stack exchange,提问作者user1345414
相关产品推荐
相关产品推荐

