偶遇MySQL/Writing file error (Errcode 28)

本文详细记录了解决在安装verboice过程中遇到的MySQL/Writingfileerror(Errcode28)的问题,主要是由于磁盘空间不足引起的。通过分析日志和采取增容措施成功解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意:本文出自 “阿飞”的博客 ,如果要转载本文章,请与作者联系!


今天安装verboice时偶遇MySQL/Writing file error (Errcode 28),详细异常信息如下:

[root@bogon verboice]# rake db:schema:load RAILS_ENV=production
-- create_table("accounts", {:force=>true})
rake aborted!
Mysql2::Error: Error writing file './verboice/accounts.frm' (Errcode: 28): CREATE TABLE `accounts` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `email` varchar(255) DEFAULT '' NOT NULL, `encrypted_password` varchar(128) DEFAULT '' NOT NULL, `reset_password_token` varchar(255), `remember_token` varchar(255), `remember_created_at` datetime, `sign_in_count` int(11) DEFAULT 0, `current_sign_in_at` datetime, `last_sign_in_at` datetime, `current_sign_in_ip` varchar(255), `last_sign_in_ip` varchar(255), `password_salt` varchar(255), `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, `confirmation_token` varchar(255), `confirmed_at` datetime, `confirmation_sent_at` datetime) ENGINE=InnoDB

Tasks: TOP => db:schema:load
(See full trace by running task with --trace)

异常: Mysql2::Error: Error writing file './verboice/accounts.frm' (Errcode: 28)

看到Errcode: 28,我查了一下:

# perror 28
OS error code  28:  No space left on device


看日志就很清楚了,磁盘空间不足。ok,接下来就是增容什么的了,问题解决。


在此记下过程,以便于其他遇到同样问题的人有所帮助。




<think>我们遇到了两个问题:第一个是原始错误“Original data directory /home/Program/mysql/data/mysql/ is not empty”,即目标目录非空;第二个是新问题“Can't create directory '=/home/Program/mysql/data/mysql/'”,即无法创建目录。 首先,第一个问题我们已经知道原因:目标目录非空。解决方法就是清空目标目录(在确保安全的前提下)。但是第二个问题看起来像是权限问题或者路径问题。 注意错误信息中的路径:'=/home/Program/mysql/data/mysql/',这里有一个等号(=)在路径开头,这很奇怪。可能是命令中的某个参数被错误地传递了,导致路径前面多了一个等号。 回顾用户执行的命令: xtrabackup --copy-back --target-dir=/home/backup/FULL 这个命令中并没有指定数据目录(datadir),所以XtraBackup会尝试从MySQL的配置文件中读取数据目录的位置。如果配置文件中指定的数据目录是以等号开头,那就会导致这个错误。 另一种可能是,在配置文件中,数据目录的配置项被写成了类似`datadir =/home/Program/mysql/data/mysql/`(注意等号后面没有空格),但在解析时可能被错误地处理。 还有一种可能是,在命令执行时,环境变量或者脚本传递参数时出现了问题。 因此,我们需要分步骤解决: 1. 确保目标目录为空(解决第一个问题) 2. 检查MySQL配置文件(通常是/etc/my.cnf或/etc/mysql/my.cnf)中datadir的设置,确保路径正确且没有多余的字符。 3. 如果配置文件中的路径正确,那么可能是XtraBackup在解析配置文件时出现了问题。我们可以尝试在命令中显式指定数据目录(--datadir),避免读取配置文件。 具体步骤: 步骤1:停止MySQL服务 sudo systemctl stop mysql 步骤2:备份并清空数据目录(注意:确保备份,以防误操作) sudo mv /home/Program/mysql/data/mysql/* /tmp/backup_mysql_data/ 步骤3:检查MySQL配置文件中的datadir设置 使用命令: cat /etc/my.cnf | grep datadir 或者查看其他可能的配置文件(如/etc/mysql/my.cnf,/etc/mysql/mysql.conf.d/mysqld.cnf,~/.my.cnf等)。 如果发现配置文件中datadir的设置类似: datadir=/home/Program/mysql/data/mysql 或者 datadir = /home/Program/mysql/data/mysql 都是正常的,但如果写成: datadir= /home/Program/mysql/data/mysql (等号后面有空格) 或者 datadir=/home/Program/mysql/data/mysql/ (最后有斜杠,一般也是允许的) 应该都没有问题。 但是,如果发现配置文件中没有设置datadir,那么XtraBackup可能会使用编译时的默认值,这可能不是我们想要的。 步骤4:显式指定数据目录 在命令中加入`--datadir`参数,明确指定数据目录的路径(注意路径不要带等号): xtrabackup --copy-back --target-dir=/home/backup/FULL --datadir=/home/Program/mysql/data/mysql 步骤5:确保数据目录的权限正确 在恢复后,将数据目录的所有权设置为mysql用户: sudo chown -R mysql:mysql /home/Program/mysql/data/mysql 步骤6:启动MySQL服务 sudo systemctl start mysql 如果步骤4中显式指定了数据目录仍然报错,那么需要检查路径是否存在,以及是否有创建目录的权限。 另外,错误信息中路径前面的等号可能是由于配置文件中其他地方的设置导致的,比如在[xtrabackup]段中设置了datadir,并且写成了`= /path`的形式。因此,检查配置文件时要注意所有段落的设置。 如果以上步骤不能解决问题,我们可以尝试使用绝对路径,并确保路径没有拼写错误。 总结解决方案: 1. 停止MySQL服务。 2. 清空数据目录(先备份)。 3. 检查配置文件中的datadir设置,确保正确无误。 4. 在恢复命令中显式指定数据目录(--datadir)。 5. 修改数据目录的权限。 6. 启动MySQL服务。 注意:如果数据目录的父目录不存在,也会导致无法创建目录。因此,确保路径`/home/Program/mysql/data/mysql`的每一级目录都存在,并且mysql用户有写入权限。 例如,如果`/home/Program/mysql/data`目录不存在,需要先创建: sudo mkdir -p /home/Program/mysql/data sudo chown -R mysql:mysql /home/Program/mysql/data 然后再次执行恢复命令。 如果问题仍然存在,请提供详细的错误日志,以便进一步分析。 现在,我们按照上述步骤给出具体的命令。</think>### 解决 XtraBackup --copy-back 报错 "Can't create directory" 问题 该错误通常由**目录权限不足**或**路径配置错误**引起。以下是系统性的解决方案,结合引用内容[^1][^2]和最佳实践: --- ### 问题原因分析 1. **目录权限问题**(最常见): - MySQL 用户(通常为 `mysql`)对目标目录 `/home/Program/mysql/data/mysql/` 无写权限 - 父目录(如 `/home/Program/mysql/data`)权限不足 2. **路径配置错误**: - 配置文件中的 `datadir` 路径与实际路径不一致 - 路径中包含特殊字符或空格(如错误提示中的 `=` 符号) 3. **目录未创建**: - 目标目录的父目录不存在(需递归创建) --- ### 解决方案步骤 #### 1. 停止 MySQL 服务 ```bash sudo systemctl stop mysql ``` #### 2. 检查并修复目录权限 ```bash # 递归创建目录(如果不存在) sudo mkdir -p /home/Program/mysql/data/mysql # 修改目录所有者(关键步骤,参考引用[^2]) sudo chown -R mysql:mysql /home/Program/mysql/data/mysql # 设置权限(确保 mysql 用户有写权限) sudo chmod -R 750 /home/Program/mysql/data/mysql ``` #### 3. 验证配置文件路径 ```bash # 检查 MySQL 配置文件中的 datadir 设置 grep "datadir" /etc/my.cnf # 如果输出为空,检查其他配置文件 grep "datadir" /etc/mysql/my.cnf /etc/mysql/mysql.conf.d/mysqld.cnf ``` - 确保配置的 `datadir` 与目标路径完全一致(注意尾部斜杠) #### 4. 显式指定数据目录执行恢复 ```bash # 添加 --datadir 参数显式指定路径(避免路径解析错误) xtrabackup --copy-back \ --target-dir=/home/backup/FULL \ --datadir=/home/Program/mysql/data/mysql ``` #### 5. 验证恢复结果 - 成功标志:输出末尾出现 `completed OK!`(参考引用[^2]) - 检查文件所有权: ```bash ls -ld /home/Program/mysql/data/mysql # 应显示所有者 mysql:mysql ``` #### 6. 启动 MySQL 服务 ```bash sudo systemctl start mysql sudo systemctl status mysql # 验证状态 ``` --- ### 高级故障排查 如果问题仍然存在: 1. **检查 SELinux/AppArmor**: ```bash # 临时禁用 SELinux sudo setenforce 0 # 或添加目录安全上下文 sudo semanage fcontext -a -t mysqld_db_t "/home/Program/mysql/data/mysql(/.*)?" sudo restorecon -Rv /home/Program/mysql/data/mysql ``` 2. **使用绝对路径避免解析错误**: ```bash # 删除配置文件中 datadir 的尾部等号(如 "datadir= /path" 改为 "datadir=/path") sudo sed -i 's/^datadir\s*=.*/datadir=\/home\/Program\/mysql\/data\/mysql/' /etc/my.cnf ``` 3. **检查磁盘空间**: ```bash df -h /home # 确保有足够空间 ``` 4. **查看详细日志**: ```bash xtrabackup --copy-back --target-dir=/home/backup/FULL --datadir=/home/Program/mysql/data/mysql 2> /tmp/xtrabackup.log cat /tmp/xtrabackup.log | grep -i "error" ``` --- ### 关键注意事项 - **权限一致性**:从备份到恢复全程保持 `mysql` 用户所有权(参考引用[^2]) - **路径规范**:避免在路径中使用空格、等号等特殊字符 - **配置文件优先级**:XtraBackup 按顺序读取配置: 1. 命令行参数 `--datadir` 2. `/etc/my.cnf` 3. `~/.my.cnf` > 通过以上步骤,99% 的目录创建失败问题可解决。若仍报错,请提供 `xtrabackup` 完整日志。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值