n8n默认是使用sqllite做存储,系统正好有mysql,于是换成mysql作为存储,资源能省则省。
报错信息如下:
Migration "AddMockedNodesColumnToTestDefinition1733133775640" failed, error: 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 '('[]') NOT NULL' at line 1
可怜我的云服务器,为了省内存还是跑的mysql5.7。于是检查问题。。。
貌似最新几个版本出的问题,看了一下之前的版本,并对比了AddMockedNodesColumnToTestDefinition脚本,发现几个问题:
1)mysql5.7是支持JSON的,所以应该能跑起来
2)('[]')这个写法是mysql8的,修改成'[]',发现还有问题
3)mysql5.7的JSON不能有默认值,因此要修改为NULL
所以最终解决是修改脚本:
先搜索一下
find / -name *AddMockedNodesColumnToTestDefinition*
不同安装方式的位置不同,有的是npx,有的npm,我这用的是pnpm,所以目录在:
/root/.local/share/pnpm/global/5/.pnpm/@n8n+db@0.14.1_@opentelemetry+api@1.9.0_@opentelemetry+sdk-trace-base@1.30.1_@opentelem_a0ec8c155971cffbfda789ef0b895eae/node_modules/@n8n/db/dist/migrations/common/1733133775640-AddMockedNodesColumnToTestDefinition.js
打开把 :
await runQuery(`ALTER TABLE ${tableName} ADD COLUMN ${mockedNodesColumnName} JSON DEFAULT ('[]') NOT NULL`);
修改成:
await runQuery(`ALTER TABLE ${tableName} ADD COLUMN ${mockedNodesColumnName} JSON DEFAULT NULL`);
然后保存,再运行n8n start就能成功生成表结构了。工作也正常
[2025/7/25更新]
最新的n8n对于MySQL作为存储库已经标记为Deprecated,如果不使用sqlite,更推荐用postgresql作为主存储。所以还是用回postgresql吧,主要是由于其存储插件对于mysql支持逐渐出现不兼容(被遗弃)