珂珂的个人博客 - 一个程序猿的个人网站

升级windows mysql版本

最近把以前留下来的带数据的mysql目录重新在windows server 2025上安装。在修复博客评论功能的时候发现EntityFramework  left join写法貌似不支持,但同样的表连接阿里云服务器上的mysql就正常,怀疑是版本问题。报错如下

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near

起初的版本是 mysql-8.0.0-dmr-winx64  通过zip方式安装的,可以直接 mysqld --install  然后net start mysql 就行了。

这个版本已经很老了,大概是2016年的,经过查看mysql官网,决定先升级8.0.42  再试试8.4.5 LTS 

按deepseek的步骤先备份原来的数据库

mysqldump -u root -p --all-databases > all_databases.sql

貌似不能用powershell 运行?可以用cmd 管理员权限执行

停止服务

net stop mysql

将旧版本的 my.ini 或 my.cnf 复制到新版本目录

将旧版本的 data 目录复制到新版本目录

复制后我将my.ini 中的目录改成新的

然后执行

mysqld --install

然后启动

net start mysql

发现启动不了。

deepseek 说

对于大版本升级(如 5.7 → 8.0),可能需要运行:

mysqld --upgrade=FORCE

我执行后没看到输出

然后mysqld --remove 后重新来一遍还是无法启动

尝试了8.0.42和8.4.5 LTS 都是如此,反正都无法升级那么索性后面直接想办法升级LTS了。


再stop服务remove后把data和删了,保留复制过来的my.ini文件

执行

mysqld --initiallize --console

然后指定了下路径

mysqld --initialize --datadir=d:\\mysql-8.4.5-winx64\\data  --defaults-file="d:/mysql-8.4.5-winx64/my.ini"  --console

倒是能生成data目录但还是报错

如果把my.ini删了  运行mysqld --initialize  --console  是正常的,但运行后mysql 目录中没有my.ini文件

重新找了个my.ini

[mysqld]
# skip_grant_tables
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=D:\\Software\\mysql-8.4.3-winx64
# 设置mysql数据库的数据的存放目录
datadir=D:\\Software\\mysql-8.4.3-winx64\\data
# 允许最大连接数
max_connections=100
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=5
# 服务端使用的字符集默认为UTF8
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
mysql-native-password=ON
[client]
#password = your_password
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8mb4
 
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4

结合之前的my.ini 我在mysqld节点下增加了

server_id = 3

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 

log_bin=mysql-bin

最终文件如下

[mysqld]
# skip_grant_tables
# 设置3306端口
port=3306
server_id = 3
basedir = D:\mysql-8.4.5-winx64
datadir = D:\mysql-8.4.5-winx64\data
# 允许最大连接数
max_connections=100
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=5
# 服务端使用的字符集默认为UTF8
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
mysql-native-password=ON
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 
log_bin=mysql-bin

[client]
#password = your_password
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8mb4
 
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4

然后再删除data目录

运行

mysqld --initialize  --console

注意记录下控制台输出的临时密码

然后执行

mysqld --install

再启动服务

net start mysql

进入

mysql -uroot -p

输入上面的临时密码

执行修改密码

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxxxxxxxxxxxxxxx';

允许远程登陆

use mysql;
update user set host = '%' where user = 'root';
FLUSH PRIVILEGES;
exit;

恢复备份

mysql -u root -p < all_databases.sql

输入密码

我这里会报错导致一部分表没恢复出来

ERROR 6125 (HY000) at line 27658: Failed to add the foreign key constraint. Missing unique key for constraint 'huodongjilu_ibfk_1' in the referenced table 'dkp'

我在原数据库中把这个外键删了,然后重新导入

报如下错误

ERROR 3554 (HY000) at line 31573: Access to system table 'mysql.innodb_index_stats' is rejected.

可以通过增加--force 参数让遇到错误继续,但感觉这种方法不太好

那么备份的时候排除系统表

mysqldump -u root -p --all-databases > all_databases.sql  --ignore-table=mysql.innodb_index_stats --ignore-table=mysql.innodb_table_stats

但其实我想排除系统库,需要注意的是如果排除了 mysql 数据库,恢复后可能需要重新设置用户权限

我采用另一种方法,只导出需要导出的数据库

mysqldump -u root -p --databases db1 db2 db3 > user_databases.sql

然后重新导入就没问题了 

注意导入完成后检查程序是否正常,我这里发现函数没有导入进来。

然后新建个用户恢复权限

插件那如果没有选项可以手动输入


备份阿里云

mysqldump -u root -p --databases db_fyj db_kecq > blogs.sql

由于root密码太长,ssh又不好粘贴,于是改用普通用户

发现报错

Access denied; you need (at least one of) the PROCESS privilege(s) for this operation' when trying to dump tablespaces
mysqldump: Got error: 1044: Access denied

增加这个权限后又报

****when using LOCK TABLES 

可以在命令中增加 --skip-lock-tables 

也可以给普通用户增加Process 、Lock Tables 的权限,但是UnLock Tables 权限没找到

然后还原时可以不先删除数据库

对于备份的文件可以先zip压缩下

zip -r xxx.zip xxx.sql

发现没安装zip

apt install zip

安装过程中竟然会弹出界面还要重启不少服务。


上一篇:个人代码全部开源

下一篇:升级windows mysql版本


0 评论

查看所有评论

给个评论吧