折雨的天空

新浪微薄腾讯微薄

最新碎语:最近霉到了住。哎。。。

您的位置:折雨的天空 >其他技术> 再记从MySQL5.5升级至8.0.19的问题,Failed to find valid data directory.

再记从MySQL5.5升级至8.0.19的问题,Failed to find valid data directory.

继上一篇文章后,安装MySQL8.0.19没有问题了,成功启动了,但是。。。

但是转移原来5.5的数据的时候出现了问题,网上找了个脚本PHP的,

原文地址:

https://blog.csdn.net/wtm_mac/article/details/84120804

把文件改了改,毕竟现在都PHP7.4了,上面地址的肯定跑不起了的,改成了mysqli扩展的,下面会发布。

把原来5.5的所有库和表转换成了innodb类型的了。


但是。。就在这转换过后,MySQL5.5启动不了了,我的数据啊,我就以为就这样掉了。。。


经过很久的折腾,找到命令:



mysqld --console

查看日志,



Trying to get some variables.
Some pointers may be invalid and cause the dump to abort.
Query (0): Connection ID (thread ID): 0
Status: NOT_KILLED

搜索后无果,期间手贱还删除了一个文件夹,很多个-relay-bin.0000**的文件。。


以为所有数据都要丢掉的时候,突然来了转机。

原文地址:


https://blog.csdn.net/xingnang2008/article/details/82503319


文章有提及重命名:ib_logfile0、ib_logfile1,于是死马当活马医,结果还是不行,失望至极。


突然灵光一现,这个灵光应该值5元吧。



[#zeyu#]

我原来的5.5跑不起了,我重新安一个总可以吧。于是,又重新下载了一个解压版本的5.5.62。

解压,本地跑起来,当然上文的命令:


mysqld -initialize
是少不了的,5.5初始化后,没有密码信息,默认root为空密码,登录成功。



于是尝试,把原来的数据文件(这里仅拷贝data目录下的文件夹,除去mysql、performance_schema之外的data目录下的文件夹以及ibdata1文件,就可以了,记得重命名目标地址的ibdata1、ib_logfile0和ib_logfile1文件)拷贝过来,第一次尝试失败。

后来才知道,失败的原因是我拷贝了,我原来的data目录下的mysql文件夹,而这个文件夹已经在上面转换innodb的过程中损坏了。

这个是根本原因。


于是,重新拷贝安装包里的data目录覆盖,再次启动成功,移除掉几个系统目录,就是默认的数据库名称。包括:mysql、performance_schema


再次覆盖,使用命令:



mysqld --console

启动失败。



第三次,根据刚才文章,在配置文件中,加入:



innodb_force_recovery = 6

再次使用



mysqld --console

于是,奇迹终于出现:



200404 19:29:53 [Note] --secure-file-priv is set to NULL. Operations related to importing and exporting data are disabled
200404 19:29:53 [Note] mysqld (mysqld 5.5.62-log) starting as process 149320 ...
200404 19:29:53 [Note] Plugin 'FEDERATED' is disabled.
200404 19:29:53 InnoDB: The InnoDB memory heap is disabled
200404 19:29:53 InnoDB: Mutexes and rw_locks use Windows interlocked functions
200404 19:29:53 InnoDB: Compressed tables use zlib 1.2.11
200404 19:29:53 InnoDB: Initializing buffer pool, size = 128.0M
200404 19:29:53 InnoDB: Completed initialization of buffer pool
200404 19:29:53 InnoDB: highest supported file format is Barracuda.
InnoDB: The user has set SRV_FORCE_NO_LOG_REDO on
InnoDB: Skipping log redo
200404 19:29:55  InnoDB: Waiting for the background threads to start
200404 19:29:56 InnoDB: 5.5.62 started; log sequence number 0
200404 19:29:56 InnoDB: !!! innodb_force_recovery is set to 6 !!!
200404 19:29:56 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3308
200404 19:29:56 [Note]   - '0.0.0.0' resolves to '0.0.0.0';
200404 19:29:56 [Note] Server socket created on IP: '0.0.0.0'.
200404 19:29:56 [Note] Event Scheduler: Loaded 0 events
200404 19:29:56 [Note] mysqld: ready for connections.
Version: '5.5.62-log'  socket: ''  port: 3308  MySQL Community Server (GPL)

没看到退出,没看到报错。尝试工具连接,成功。命令行登录,看了下数据库,都在,随便选了个库,也有数据,兴奋异常。



于是,以同样的套路,在MySQL8.0.19版本中,重复操作,无效,最后放弃,想着8的和5的可能还是有区别,不行也就算了。


反正5.5能够启动了,改个端口,跑两个库,用工具备份数据就好了。


但是。。。


又是但是,这个时候,MySQL8.0.19不如上一篇那么好使了,重新:


mysqld -initialize
的时候,一直报错:



Failed to find valid data directory.

我查看了,我的data目录有啊,手工创建的,删除了又重新创建,反复几次都不行。



最后发现文章:

https://segmentfault.com/q/1010000014804864


通过以下命令:



mysqld --initialize-insecure
成功初始化,然后再mysqld install安装服务,改root密码,上面的语句执行后,是空密码。一如上一篇文章。



[/#zeyu#]


好吧,支持,蜿蜒曲折的升级之路就完成了。最后,把改良的PHP批量修改表引擎的代码共享出来,谨慎使用,操作前,记得备份数据啊。别像我,还好我是本地。


备份数据文章地址:

https://blog.csdn.net/weixin_38570967/article/details/86505559

导出:


mysqldump --single-transaction -u root -p --all-databases> alldb.sql

导入:




mysql -u root -p < alldb.sql

当然,我不是这么导入的。我还是用nav一个一个的同步算了,虽然,被Nav坑了不止一次。



最后是PHP代码:



<?php
/**
 *
 * 文件说明: 转换MySQL表引擎
 *
 * Created by PhpStorm.
 * User: qs9515
 * Date: 2020/4/4
 * Time: 12:25
 *
 * $Id$
 * $LastChangedDate$
 * $LastChangedRevision$
 * $LastChangedBy$
 */
error_reporting(E_ALL);
set_time_limit(0);
// 数据库连接配置
$host = 'localhost';
$username = 'root';
$passwd = '****';

// 转换配置
$convert_rule = array(
    'from' => 'MyISAM',
    'to' => 'InnoDB'
);
ob_end_clean();
ob_implicit_flush(1);
mysql_engine_convert();

/**
 * 转换函数
 */
function mysql_engine_convert()
{
    global $host, $username, $passwd, $configs, $convert_rule;
    if (($conn = mysqli_connect($host, $username, $passwd)) !== false) {
        $configs=mysqli_query($conn,"show databases");
        while ($table=mysqli_fetch_row($configs))
        {
            $db_name=isset($table[0])?$table[0]:'';
            echo '开始处理数据库:【'.$db_name.'】<hr />';
            if ($db_name=='' || in_array($db_name,array('mysql','performance_schema','test')))
            {
                continue;
            }
            mysqli_select_db($conn,$db_name) or exit('Not found db: ' . $db_name);
            $tables = mysqli_query($conn,"SHOW FULL TABLES");
            while ($table = mysqli_fetch_row($tables)) {
                if ($table[1] === 'VIEW') continue;

                $sql = "SHOW TABLE STATUS from {$db_name} where Name='{$table[0]}' ";
                if ($result = mysqli_query($conn,$sql)) {
                    $table_status = mysqli_fetch_row($result);

                    if (strtolower($table_status[1]) == strtolower($convert_rule['from']))
                    {
                        echo '开始处理数据库:【'.$db_name.'】的数据表【'.$table[0].'】<hr />';
                        mysqli_query($conn,"ALTER TABLE {$table[0]} ENGINE = {$convert_rule['to']}");
                        echo '处理数据库:【'.$db_name.'】的数据表【'.$table[0].'】完成!!!<hr />';
                    }

                }
            }
            echo $db_name, ':All tables ENGINE is ', $convert_rule['to'], "\n";
        }

    } else {
        echo "db error\n";
    }

}





------------正 文 已 结 束, 感 谢 您 的 阅 读 (折雨的天空)--------------------

转载请注明本文标题和链接:《再记从MySQL5.5升级至8.0.19的问题,Failed to find valid data directory.

奖励一下

取消

您的认可,是我写博客的动力,谢谢您!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

发表评论

路人甲 表情
看不清楚?点图切换