继上一篇文章后,安装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.》
发表评论