服务器使用的是mysql 5.1,了解到 5.5 系列的版本 innodb 的性能有很大提升,就想升级下。按照查到的步骤:

http://www.myhack58.com/Article/sort099/sort0102/2013/39006.htm

wget http://huiwei19.googlecode.com/files/upgrade_mysql.sh
sh upgrade_mysql.sh

提示 “Error install cmake...”,vi upgrade_mysql.sh,在 if [ -s /usr/bin/cmake ];then 前面添加 “ln -s /usr/local/bin/cmake /usr/bin/cmake”,再次执行

sh upgrade_mysql.sh

会提示 cmake安装成功,然后继续往下安装 mysql去了,到了最后,提示 Error Insatll Mysql....

查看 upgrade_mysql.sh 源码,发现 这个安装程序 把数据库文件放到 /usr/local/mysql/data 这个位置了,查看其下的 err 文件,提示 文件无法创建。我的 my.cnf 里面 innodb 表的路径是 /usr/local/mysql/var ,这个路径不存在,就出错了。修改 my.cnf 里的路径为 /usr/local/mysql/data,重启mysql,启动成功,但是发现全部数据库下面的 innodb  表均无法读取,myisam 表倒是正常。

err 文件里也是不断提示 innodb 表无法打开。

查了很多资料,了解到 innodb表 有个序号是存在 ibdata1,升级前 ibdata1 大小是 10M,升级后是18M,不知道是不是这个文件损坏了。然后就搜索 innodb表恢复方面的资料,在 http://s.yanghao.org/program/viewdetail.php?i=173457 有人提到 http://www.chriscalender.com/?p=28 这个连接,按照文章里的第一种方法,终于恢复出了各个表。

恢复一个表就有好多步骤,开始手工恢复了几个表,累死了。用php写了个程序,自动实现了各个步骤,恢复剩下的40多个表就快多了。

使用方法:

1、前提条件,数据库损坏前,你的 my.cnf 里面含有 innodb_file_per_table =1 这个配置。

本程序只能在一台全新的vps上执行,因为程序会删除 ibdata1 文件,切不可在运行的服务器上执行

2、准备工作,把数据库要修复的表的 create 语句放到 /home/dbjg/ 目录下,比如待修复的是  aaa, 那么 /home/dbjg/aaa.sql 就放着这个表的 create 语句。

在 my.cnf 添加 innodb_force_recovery=5

3、使用,把代码存为dbfix.php,填入 rootPass, bkPath,然后执行

php dbfix.php 数据库名字

程序会处理 bkPath 目录下所有的 .ibd 文件,把全部表导出到 /home/dump 文件夹下面。如果出现 mysqldump lost connection 错误的,就把 /home/dump 下面的那个文件删除,然后修改 my.cnf 里面的 innodb_force_recovery=6,然后重新执行一次

php dbfix.php 数据库名字

折腾了2天才在众多资料中找到了合适的方法,献给与我碰到同样问题的朋友。以后升级前千万要备份了。

<?php
// 数据库文件路径:/usr/local/mysql/var | /home/dbjg 目录存放各个表 Create 语句 $dbname = trim($argv[1]); $dbname == '' && exit('no db');
$rootPass = ''; // root 密码
$bkPath = ""; // .ibd 备份所在路径,不能是现在的数据库存放路径里面 !file_exists("/home/dump") && mkdir("/home/dump");
!file_exists("/home/temp") && mkdir("/home/temp");
$ffs = glob("$bkPath/*.ibd"); `unalias cp`; foreach ($ffs as $ff) {
$a = str_replace("$bkPath/", '', $ff);
$a = str_replace('.ibd', '', $a); if (file_exists("/home/dump/$a.sql")) continue; `service mysql stop`;
`rm -rf /usr/local/mysql/var/*.err /usr/local/mysql/var/ib_* /usr/local/mysql/var/ibdata1 /usr/local/mysql/var/$dbname`; /* */
`service mysql start`; `mysql -uroot -p$rootPass -e "CREATE DATABASE $dbname;"`;
`mysql -uroot -p$rootPass $dbname < /home/dbjg/$a.sql`;
run("ALTER TABLE $a DISCARD TABLESPACE");
`cp -f $bkPath/$a.ibd /usr/local/mysql/var/$dbname/`; `chown -cR mysql:mysql /usr/local/mysql/*`; /* */
run("ALTER TABLE $a IMPORT TABLESPACE");
`mv -f /usr/local/mysql/var/$dbname/$a.ibd /home/temp/`; $txt = `cat /usr/local/mysql/var/*.err`; /* */
!preg_match("{ are (\d+) and 0, but in the InnoDB}is", $txt, $r) && exit("$a id not found");
echo "$a id {$r[1]}\n"; run("DROP TABLE $a");
if ($r[1] > 2) {
$need = $r[1] - 2; echo "add $need tables\n";
system("for i in `seq 1 $need`; do mysql -uroot -p$rootPass $dbname -e \"CREATE TABLE t\$i (id int) ENGINE=InnoDB;\"; done");
}
run("DROP DATABASE $dbname"); `mysql -uroot -p$rootPass -e "CREATE DATABASE $dbname;"`;
`mysql -uroot -p$rootPass $dbname < /home/dbjg/$a.sql`;
run("ALTER TABLE $a DISCARD TABLESPACE");
`cp -f /home/temp/$a.ibd /usr/local/mysql/var/$dbname/`; `chown -cR mysql:mysql /usr/local/mysql/*`; /* */
run("ALTER TABLE $a IMPORT TABLESPACE");
`mysqldump -uroot -p$rootPass $dbname --table $a > /home/dump/$a.sql`; echo "\n";
} function run($sql)
{
global $dbname, $rootPass; `mysql -uroot -p$rootPass $dbname -e "$sql;"`;
}

mysql 从5.1升级到5.5.33 后 innodb 表出错 及 innodb表修复的更多相关文章

  1. MySQL 从 5.5 升级到 5.6,启动时报错 [ERROR] Plugin 'InnoDB' init function returned error

    MySQL 从 5.5 升级到 5.6,启动时报错: [ERROR] Plugin 'InnoDB' init function returned error. [ERROR] Plugin 'Inn ...

  2. MySQL 5.1.73升级为MySQL 5.5.35详解

    一.前言 二.概述 三.安装MySQL 5.1.73 四.升级为MySQL 5.5.35 五.总结 注,测试环境 CentOS 6.4 x86_64,MySQL 版本(5.1.73.5.5.35)目前 ...

  3. MySQL/MariaDB/Percona数据库升级脚本

    MySQL/MariaDB/Percona数据库升级脚本截取<OneinStack>中upgrade_db.sh, 一般情况下不建议升级数据库版本,该脚本专提供给各位版本控们.为防止大版本 ...

  4. CentOS6.5把MySQL从5.1升级到5.6后,MySQL不能启动

    解决了:进入mysql安装目录 cd /var/lib/mysql删除了如下三个文件:ibdata1  ib_logfile0  ib_logfile1 CentOS6.5把MySQL从5.1升级到5 ...

  5. 24.Mysql高级安装和升级

    24.Mysql高级安装和升级24.1 Linux/Unix平台下的安装 24.1.1 安装包比较Linux下的Mysql安装包分为RPM包.二进制包.源码包3种.RPM包优点是安装简单,适合初学者: ...

  6. Ubuntu 12.04.1 mysql从5.5升级到5.6

    Ubuntu 12.04.1 mysql从5.5升级到5.6 1 2 3 4 5 apt-cache search mysql-server sudo  apt-add-repository ppa: ...

  7. mysql 5.6.15升级到5.6.43

    今天闲来无事,观察测试环境的zabbix服务器,发现内存泄漏严重,于是重启了,想起了前几天写的帖子发生了严重的内存泄漏可以把mysql升级到最新的小版本 于是乎就试着升级 old version:5. ...

  8. mysql 5.1.71升级到5.6.30

    mysql 5.1.71升级到5.6.30 mysqldump -h主机名 -P端口 -u用户名 -p密码 (–database) 数据库名 > 文件名.sql 备份MySQL数据库的命令 my ...

  9. MySQL 5.6.30 升级到5.7.10

    MySQL 5.6.30 升级到5.7.10 注意,这种方式的前提是数据文件没有和软件目录在一起,如果在一起,需要停止数据库后先移动数据文件 1.解压5.7.10包到/usr/local2.停止当前的 ...

随机推荐

  1. QT实现拖放文件(有例子,并且图文并茂,非常清楚)

    转自:http://my.oschina.net/voler/blog/345722 目录[-] 0. 源代码下载地址 1. 简单文件拖放 2. 复杂文件拖放 3. 通过按钮来完成列表数据的转移 4. ...

  2. 用QComboBox实现tree状结构(QComboBox居然有setView和setModel函数)

    实现的效果图如下:  #include "mainwindow.h" #include <QApplication> #include <QTreeView> ...

  3. asp.net中 服务器控件中onselectedindexchanged 没有反应的解决方案

    最近发现项目中一个BUG就是 DropDownList 中的onselectedindexchanged 没有反应 AutoPostBack="true"和页面中的<%@ P ...

  4. OD调试篇3-小软件破解1

    OD调试篇3-小软件破解1 要求如下图该软件需要改5个地方,其中1.2是软件未注册而设定限定的添加个数,3.4.5是软件显示的一些未注册的信息. 一. 1.按1运行程序,添加用户添加第五个时出现提示, ...

  5. BZOJ 1692: [Usaco2007 Dec]队列变换( 贪心 )

    数据 n <= 30000 , 然后 O( n² ) 的贪心也过了..... USACO 数据是有多弱啊 = = ( ps : BZOJ 1640 和此题一模一样 , 双倍经验 ) ------ ...

  6. django开发简易博客(一)

    这几篇博客是根据GoodSpeed的博客该写的,看了他的博客收获很大,但是他的博客从第三篇开始,条理很不清晰,加之又是几年之前写的,编写环境发生很大改变,所以对他的博客进行了一个整理,加入了一些自己的 ...

  7. PLSQL developer登录身份证明检索失败的解决办法

    全都在一个下图中:

  8. JS日历控件

    <input type="text" id="st" name="st" onclick="return Calendar( ...

  9. Dapper 多数据库优化

    Dapper是近2年异军突起的新ORM工具,它有ado.net般的高性能又有反射映射实体的灵活性,非常适合喜欢原生sql的程序员使用,而且它源码很小,十分轻便.我写本博客的目的不是为了介绍Dapper ...

  10. js this [转]

    this是js的一个关键字,随着函数使用场合不同,this的值会发生变化.但是总有一个原则,那就是this指的是调用函数的那个对象. 1.纯粹函数调用. function test() { this. ...