继上一篇文章后,安装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
以为所有数据都要丢掉的时候,突然来了转机。
原文地址:
https://blog.csdn.net/xingnang2008/article/details/82503319
文章有提及重命名:ib_logfile0、ib_logfile1,于是死马当活马医,结果还是不行,失望至极。
突然灵光一现,这个灵光应该值5元吧。
[#zeyu#]
我原来的5.5跑不起了,我重新安一个总可以吧。于是,又重新下载了一个解压版本的5.5.62。
解压,本地跑起来,当然上文的命令:
mysqld -initialize
于是尝试,把原来的数据文件(这里仅拷贝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.
最后发现文章:
https://segmentfault.com/q/1010000014804864
通过以下命令:
mysqld --initialize-insecure
[/#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
最后是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";
}
}