mysql无法创建存储过程问题 ERROR 1307 (HY000)

本文介绍了一种在MySQL中创建存储过程时遇到的问题及解决方法。作者在尝试批量生成游戏账号的过程中,遇到了无法创建存储过程的情况。经过排查,在不同版本的MySQL上测试并最终通过运行mysql_upgrade工具解决了问题。

引用:http://linuxguest.blog.51cto.com/195664/389169

今天由于需要批量生成一些游戏账号,所以打算用存储过程来实现,这样速度会快很多。结果却是用了大量时间,主要原因是mysql server不知道出了点什么问题,运行创建procedure的语句,一直报错。

语句如下:

USE test  
delimiter //  
create procedure createuser()  
BEGIN  
DECLARE a INT default 8000;  
while a < 10000 do  
insert into t (id,pw) values (a,md5('xxxxxx'));  
set aa = a + 1;  
END WHILE;  
END;// 

  

错误提示 ERROR 1307 (HY000): Failed to CREATE PROCEDURE createuser

搞了很久,我跑到mysql5.0的服务器执行,能够通过,难道是语法问题?我去查了5.1的手册,没有问题。有用了其他5.1的机器测试,可以通过。

最后再mysql官方找到了这样的解决方案,执行 /usr/local/mysql/bin/mysql_upgrade工具,对表进行检查,检查结果如下,并未发现什么错误,但是可以创建存储过程了。

 

[root@zj6 ~]# /usr/local/mysql/bin/mysql_upgrade   
Looking for 'mysql' as: /usr/local/mysql/bin/mysql  
Looking for 'mysqlcheck' as: /usr/local/mysql/bin/mysqlcheck  
Running 'mysqlcheck' with connection arguments: '--port=9188' '--socket=/var/lib/mysql/mysql.sock'   
Running 'mysqlcheck' with connection arguments: '--port=9188' '--socket=/var/lib/mysql/mysql.sock'   
ZION_GAME_DB.BADUser                               OK  
ZION_GAME_DB.MAPOwnerGuild                         OK  
ZION_GAME_DB.actionlimit                           OK  
ZION_GAME_DB.billinfo                              OK  
ZION_GAME_DB.completemission                       OK  
ZION_GAME_DB.currentmission                        OK  
ZION_GAME_DB.email                                 OK  
ZION_GAME_DB.emailitems                            OK  
ZION_GAME_DB.equipitems                            OK  
ZION_GAME_DB.familyinfo                            OK  
ZION_GAME_DB.familymember                          OK  
ZION_GAME_DB.familymission                         OK  
ZION_GAME_DB.groupdata                             OK  
ZION_GAME_DB.invenitems                            OK  
ZION_GAME_DB.loopmission                           OK  
ZION_GAME_DB.microcosm                             OK  
ZION_GAME_DB.pet                                   OK  
ZION_GAME_DB.safegarbage                           OK  
ZION_GAME_DB.sale                                  OK  
ZION_GAME_DB.saleprice                             OK  
ZION_GAME_DB.signpost                              OK  
ZION_GAME_DB.titledata                             OK  
ZION_GAME_DB.userfriend                            OK  
ZION_GAME_DB.usergarbage                           OK  
ZION_GAME_DB.userinfo                              OK  
ZION_GAME_DB.userskills                            OK  
ZION_GAME_DB.usersubinfo                           OK  
ZION_GAME_DB.usertable                             OK  
ZION_LOG_DB.BillItemLog                            OK  
ZION_LOG_DB.DeleteLog                              OK  
ZION_LOG_DB.GarbageLog                             OK  
ZION_LOG_DB.GarbageMoneyLog                        OK  
ZION_LOG_DB.ItemLog                                OK  
ZION_LOG_DB.LevelItemLog                           OK  
ZION_LOG_DB.LevelLog                               OK  
ZION_LOG_DB.LoginLog                               OK  
ZION_LOG_DB.MoneyLog                               OK  
ZION_LOG_DB.MyShopLog                              OK  
ZION_LOG_DB.StressLog                              OK  
ZION_LOG_DB.deluserinfo                            OK  
ZION_LOG_DB.delusertable                           OK  
mysql.columns_priv                                 OK  
mysql.db                                           OK  
mysql.event                                        OK  
mysql.func                                         OK  
mysql.general_log  
Error    : You can't use locks with log tables.  
status   : OK  
mysql.help_category                                OK  
mysql.help_keyword                                 OK  
mysql.help_relation                                OK  
mysql.help_topic                                   OK  
mysql.host                                         OK  
mysql.ndb_binlog_index                             OK  
mysql.plugin                                       OK  
mysql.proc                                         OK  
mysql.procs_priv                                   OK  
mysql.servers                                      OK  
mysql.slow_log  
Error    : You can't use locks with log tables.  
status   : OK  
mysql.tables_priv                                  OK  
mysql.time_zone                                    OK  
mysql.time_zone_leap_second                        OK  
mysql.time_zone_name                               OK  
mysql.time_zone_transition                         OK  
mysql.time_zone_transition_type                    OK  
mysql.user                                         OK  
test.t                                             OK  
Running 'mysql_fix_privilege_tables'...  
OK 

 

<think>我们正在处理一个MySQL错误:ERROR 1030 (HY000): Got error 28 from storage engine。根据引用[1]中的信息,虽然引用内容似乎与系统清理有关(如desktop-purge, mime-purge等),但这并不是直接相关的错误信息。实际上,错误28是一个系统错误,通常表示存储设备空间不足。在MySQL中,这个错误通常是由于数据库所在的磁盘分区或文件系统没有足够的空间来执行操作。 因此,我们需要关注的是磁盘空间问题。以下是详细的解释和解决方案: ### 错误解释 - **错误代码**: [HY000][1030] 是MySQL的错误代码,其中1030是存储引擎返回的错误号。 - **错误原因**: 错误28对应于系统错误`ENOSPC`,即"No space left on device"。这意味着MySQL存储引擎(如InnoDB或MyISAM)在尝试写入数据时,发现磁盘空间不足。 ### 解决方案 解决此问题的核心是释放磁盘空间。以下是逐步操作: #### 1. **确认磁盘空间使用情况** 使用系统命令检查磁盘空间: ```bash df -h ``` 查看哪个分区(特别是MySQL数据目录所在分区)空间不足。MySQL数据目录通常位于: - 默认位置:`/var/lib/mysql` - 可以通过MySQL配置文件(`my.cnf`或`my.ini`)中的`datadir`参数确认。 #### 2. **清理磁盘空间** 根据磁盘使用情况,选择以下方法释放空间: - **删除不必要的文件**:如临时文件、旧的日志文件等。 - **清理MySQL日志文件**: - 二进制日志(Binary Logs):如果开启,会占用大量空间。使用以下命令清理: ```sql -- 删除所有二进制日志(谨慎!确保不需要这些日志用于复制或恢复) RESET MASTER; -- 或删除指定日期之前的日志 PURGE BINARY LOGS BEFORE 'yyyy-mm-dd hh:mm:ss'; ``` - 错误日志、慢查询日志等:检查并调整日志设置,或定期归档/删除旧日志。 - **清理MySQL表数据**: - 删除不必要的数据:使用`DELETE`或`DROP TABLE`删除无用数据。 - 优化表:对于MyISAM表,使用`OPTIMIZE TABLE table_name;`可以释放空间(但需要额外空间)。InnoDB表可以考虑使用`ALTER TABLE table_name ENGINE=InnoDB;`重建表。 #### 3. **增加磁盘空间** 如果清理后空间仍然不足: - 扩展磁盘分区(如果使用虚拟化或云平台,通常支持在线扩展)。 - 将MySQL数据目录迁移到更大的磁盘分区。 #### 4. **预防措施** - 监控磁盘空间:设置监控告警,当磁盘使用率超过阈值时通知管理员。 - 定期维护:定期清理日志和临时文件。 - 使用自动扩展:在云环境中,配置磁盘自动扩展。 ### 示例:清理二进制日志 假设我们发现`/var/lib/mysql`分区空间不足,且二进制日志占用较大: ```sql -- 查看当前二进制日志 SHOW BINARY LOGS; -- 删除所有二进制日志(注意:这将清除所有二进制日志,确保不影响复制或备份) RESET MASTER; -- 或者,只删除特定时间之前的日志 PURGE BINARY LOGS BEFORE '2023-01-01 00:00:00'; ``` ### 注意事项 - **不要直接删除文件**:在MySQL运行时,不要直接删除MySQL数据文件(如`.ibd`, `.frm`, `.MYD`等),这可能导致数据损坏。应使用MySQL命令(如`DROP TABLE`)或内置清理机制。 - **事务日志**:InnoDB的redo日志(ib_logfile*)通常不会增长,但确保它们所在的分区也有足够空间。 ### 相关问题 1. 如何监控MySQL的磁盘使用情况? 2. 如何配置MySQL的日志轮转? 3. 在云环境中如何自动扩展MySQL存储空间? 4. MySQL中还有哪些其他常见存储引擎错误? 通过以上步骤,应该能解决ERROR 1030问题。如果问题持续,请检查是否有其他进程占满磁盘(如临时文件增长),或考虑文件系统inode耗尽(使用`df -i`检查)。</think>### MySQL错误 [HY000][1030] "Got error 28 from storage engine" 解释及解决方案 #### **错误解释** 该错误表示 **存储引擎遇到了磁盘空间不足的问题**(错误代码28对应系统错误`ENOSPC` - No space left on device)。具体原因包括: 1. **磁盘空间耗尽**:MySQL数据目录所在磁盘分区无可用空间 2. **InnoDB表空间不足**:即使磁盘有空闲,表空间文件达到上限 3. **文件系统inode耗尽**:文件系统元数据存储空间不足 4. **临时表空间不足**:查询操作需要临时空间时失败[^1] --- #### **逐步解决方案** ##### **1. 确认磁盘空间状态** ```bash # 检查整体磁盘使用率 df -h # 检查MySQL数据目录空间(默认路径) du -sh /var/lib/mysql # 检查inode使用情况 df -i ``` - **临界值**:当`Use%` > 90% 或 `IUse%` > 90% 时需要立即处理 ##### **2. 清理磁盘空间** ```bash # 删除MySQL错误日志(按日期清理) sudo rm /var/log/mysql/error.log.$(date -d "7 days ago" +%Y%m%d) # 清理二进制日志 mysql -e "PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);" # 清理旧备份文件 find /backups -name "mysql-backup-*" -mtime +30 -exec rm {} \; ``` ##### **3. 清理MySQL内部空间** ```sql -- 优化表释放碎片空间 OPTIMIZE TABLE your_large_table; -- 收缩InnoDB表空间 ALTER TABLE your_table ENGINE=InnoDB; -- 清理临时表 FLUSH TABLES; ``` ##### **4. 紧急扩容措施** ```sql -- 临时增加表空间(需重启) SET GLOBAL innodb_data_file_path = 'ibdata1:10G;ibdata2:10G:autoextend'; -- 创建新表空间文件 ALTER TABLESPACE innodb_file_per_table ADD DATAFILE '/new_disk/ibdata3.ibd' SIZE 20G; ``` ##### **5. 预防措施** ```ini # /etc/mysql/my.cnf 配置优化 [mysqld] innodb_data_file_path = ibdata1:1G;ibdata2:1G:autoextend:max:20G innodb_file_per_table = ON tmp_table_size = 64M max_heap_table_size = 64M expire_logs_days = 7 ``` --- #### **关键注意事项** 1. **不要直接删除ibdata文件**:会导致数据损坏 2. **优先清理二进制日志**:通常占用最大空间(`SHOW BINARY LOGS;`) 3. **云环境特殊处理**:AWS RDS/Aurora需通过控制台扩容,Azure MySQL启用自动增长 4. **监控工具推荐**: - Prometheus + mysqld_exporter - MySQL Enterprise Monitor - Percona Monitoring and Management > **验证修复**:执行需要磁盘空间的MySQL操作(如`CREATE TABLE test AS SELECT * FROM large_table`)测试是否解决[^1] --- ### 相关问题 1. 如何监控MySQL磁盘空间使用情况? 2. InnoDB表空间管理的优化策略有哪些? 3. MySQL二进制日志的合理清理策略是什么? 4. 云数据库(如RDS)如何处理磁盘空间不足问题? [^1]: MySQL官方文档:Disk Space Issues - https://dev.mysql.com/doc/refman/8.0/en/disk-space.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值