服务器使用的是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. cout输出流的执行顺序

    一道题目: #include <iostream> using namespace std; ; template<typename T> int foo() { int va ...

  2. poj 2593 Max Sequence(线性dp)

    题目链接:http://poj.org/problem?id=2593 思路分析:该问题为求给定由N个整数组成的序列,要求确定序列A的2个不相交子段,使这m个子段的最大连续子段和的和最大. 该问题与p ...

  3. Struts2 学习笔记15 Struts标签 part1

    来说一下Struts标签,之前我们也很多地方用到了,还是来总结一下. 首先是property标签. <li>property:<s:property value="user ...

  4. iOS9 白名单问题 -canOpenURL: failed for URL: "xx" - error:"This app is not allowed to query for scheme xx"

    [iOS开发]-canOpenURL: failed for URL: "xx" - error:"This app is not allowed to query fo ...

  5. C# ikvm 运行htmlunit Provider com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl not found

    在使用 ikvm 去运行 htmlunit 中的 webclient Getpage的时候  报错说com.sun.org.apache.xerces.internal.jaxp.DocumentBu ...

  6. Asp.Net MVC4.0 官方教程 入门指南之四--添加一个模型

    Asp.Net MVC4.0 官方教程 入门指南之四--添加一个模型 在这一节中,你将添加用于管理数据库中电影的类.这些类是ASP.NET MVC应用程序的模型部分. 你将使用.NET Framewo ...

  7. java虚拟机内存溢出各种场景总结

    java堆溢出 java堆用于存储对象实例,只要不断地创建对象,并且保证gc roots到对象之间有可达路径来避免垃圾回收机制来清楚这些对象,那么在 对象到达最大堆的容量限制后就会产生内存溢出溢出. ...

  8. leetcode 15. 3Sum 双指针

    题目链接 给n个数, 找出三个数相加结果为0的所有的组, 不可重复. 用双指针的思想,O(n^2)暴力的找, 注意判重复. class Solution { public: vector<vec ...

  9. 13. Roman to Integer

    Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 t ...

  10. C++基础-位运算

    昨天笔试遇到一道题,让实现乘法的计算方法,设计方案并优化,后来总结位运算相关知识如下: 在计算机中,数据是以1010的二进制形式存储的,1bytes = 8 bits,bit就是位,所以位运算就是对每 ...