zoukankan      html  css  js  c++  java
  • mysql 从5.1升级到5.5.33 后 innodb 表出错 及 innodb表修复

    服务器使用的是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]}
    ";
    	
    	run("DROP TABLE $a");
    	if ($r[1] > 2) {
    		$need = $r[1] - 2; echo "add $need tables
    ";
    		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 "
    ";
    }
    
    function run($sql)
    {
    	global $dbname, $rootPass; `mysql -uroot -p$rootPass $dbname -e "$sql;"`;
    }




  • 相关阅读:
    hasCode in Java
    如何区分同一Class的不同实例对象
    如何构建XML文件
    Spring <context:property-placeholder/>的作用
    关于List的几个方法
    Java 中那些不常用的关键字
    设计模式
    Java源代码阅读-Object.toString()
    修复启动项
    centos关闭防火前
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3322854.html
Copyright © 2011-2022 走看看