折雨的天空
再记从MySQL5.5升级至8.0.19的问题,Failed to find valid data directory.
2020-4-4 我好笨


继上一篇文章后,安装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";
}

}
















发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容