Chinaunix首页 | 论坛 | 博客
  • 博客访问: 304588
  • 博文数量: 33
  • 博客积分: 586
  • 博客等级: 中士
  • 技术积分: 494
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-27 14:05
个人简介

衡铁刚 1)2011-2013:Alibaba MySQL DBA 2)2014-至今: Alibaba 数据库PD

文章分类

全部博文(33)

文章存档

2016年(1)

2015年(10)

2013年(5)

2012年(17)

我的朋友

分类: Mysql/postgreSQL

2012-11-14 12:38:37

Cannot load from mysql.proc. The table is probably corrupted经常出现,网上解决方案多数为mysql_upgrade,但无法适用于所有场景,本质上错误出现的原因
  • 实例创建了不同版本的mysql.proc表
针对不同场景有不同的解决方案

(1)5.5实例上create procedure(事后)
  • 5.5实例上创建了5.1 mysql.proc表结构
  • 需要执行mysql_upgrade -uuser  -ppassword $socket  --force,将proc表升级到5.5版本
  • 重新执行create procedure语句
(2)5.1升级到5.5,升级过程报错(事中)
  • 对于实例级别备份再恢复,mysqldump会备份proc表数据,如果添加 -R 参数,会在备份集中添加DROP PROCEDURE IF EXISTS `test` 、CREATE PROCEDURE `test`等语句
  • 恢复过程中报错,报错都是在mysql.proc表重建之后,恢复其他DB时候发生,由于mysqldump是按照实例上数据库和表的字母排序后的顺序备份
  • 在恢复过程中mysql.proc表重建前的create procedure都执行成功(5.5实例和5.5proc表),恢复过程中mysql.proc表重建后的create procedure都执行失败(5.5实例和5.1proc表
  • 失败现象是DROP PROCEDURE IF EXISTS `test`执行error而不是正常情况下的warning

Level

Code

Message

Error

1548

Cannot load from mysql.proc. The table is probably corrupted

Error

1306

Failed to DROP PROCEDURE test.test


实例版本

Mysql.proc表版本

Create procedure语句版本

Source结果

5.5

5.1

5.1

failure

5.5

5.5

5.1

success

5.1

5.1

5.1

success

5.1

5.5

5.1

failure

(3)5.1 mysqldump参数选择(事前)
  • 实例级别备份,取消-R参数,在恢复完毕后执行mysql_upgrade
  • 库和表级别备份,添加-R参数,无需执行mysql_upgrade

总结:这个问题出现了很久,每次都能通过分析得出一些结论,找到解决方法,同时也留下一些疑问,只要不轻易放弃,一定有真相大白的一天(未完待续





阅读(7936) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~