最近把以前留下来的带数据的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
安装过程中竟然会弹出界面还要重启不少服务。