98 lines
2.4 KiB
Markdown
98 lines
2.4 KiB
Markdown
|
|
# 数据库写操作失败修复指南
|
|||
|
|
|
|||
|
|
## 问题现象
|
|||
|
|
|
|||
|
|
所有写操作(INSERT/UPDATE)返回 500 错误:
|
|||
|
|
- 课程创建 API 失败
|
|||
|
|
- 课程更新 API 失败
|
|||
|
|
- 租户创建 API 失败
|
|||
|
|
|
|||
|
|
读操作 API 正常工作。
|
|||
|
|
|
|||
|
|
## 可能原因
|
|||
|
|
|
|||
|
|
1. **Flyway 迁移失败或锁定** - V10 迁移可能失败,导致数据库锁表
|
|||
|
|
2. **数据库连接为只读模式**
|
|||
|
|
3. **数据库用户权限不足**
|
|||
|
|
|
|||
|
|
## 解决方案
|
|||
|
|
|
|||
|
|
### 方案一:清理 Flyway 迁移记录(推荐)
|
|||
|
|
|
|||
|
|
在 MySQL 客户端中执行以下命令:
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
-- 1. 查看当前 Flyway 迁移历史
|
|||
|
|
SELECT * FROM flyway_schema_history ORDER BY installed_rank DESC LIMIT 10;
|
|||
|
|
|
|||
|
|
-- 2. 检查是否有 V10 失败记录
|
|||
|
|
SELECT * FROM flyway_schema_history WHERE version = '10';
|
|||
|
|
|
|||
|
|
-- 3. 如果 V10 状态为 'FAILED',删除该记录
|
|||
|
|
DELETE FROM flyway_schema_history WHERE version = '10' AND success = 0;
|
|||
|
|
|
|||
|
|
-- 4. 验证清理结果
|
|||
|
|
SELECT * FROM flyway_schema_history ORDER BY installed_rank DESC LIMIT 5;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
然后**重启后端服务**,Flyway 会自动重新执行迁移。
|
|||
|
|
|
|||
|
|
### 方案二:检查数据库连接
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
-- 1. 检查当前数据库是否为只读模式
|
|||
|
|
SELECT @@global.read_only;
|
|||
|
|
-- 应该返回 0(可读可写),如果返回 1 则是只读模式
|
|||
|
|
|
|||
|
|
-- 2. 检查当前用户权限
|
|||
|
|
SHOW GRANTS FOR CURRENT_USER();
|
|||
|
|
-- 确保有 INSERT, UPDATE, DELETE 权限
|
|||
|
|
|
|||
|
|
-- 3. 检查表是否被锁定
|
|||
|
|
SHOW OPEN TABLES WHERE In_use > 0;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 方案三:检查后端日志
|
|||
|
|
|
|||
|
|
查看后端服务日志,寻找 500 错误的详细堆栈信息:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 如果后端使用日志文件
|
|||
|
|
tail -100 /path/to/application.log
|
|||
|
|
|
|||
|
|
# 或查看控制台输出
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 验证修复
|
|||
|
|
|
|||
|
|
修复后,执行以下测试:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 1. 获取 Token
|
|||
|
|
TOKEN=$(curl -s -X POST http://localhost:8080/api/v1/auth/login \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{"username":"admin","password":"123456","role":"admin"}' | \
|
|||
|
|
grep -o '"token":"[^"]*"' | cut -d'"' -f4)
|
|||
|
|
|
|||
|
|
# 2. 测试课程创建
|
|||
|
|
curl -s -X POST http://localhost:8080/api/v1/admin/courses \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-H "Authorization: Bearer $TOKEN" \
|
|||
|
|
-d '{
|
|||
|
|
"name":"测试课程",
|
|||
|
|
"themeId":4,
|
|||
|
|
"gradeTags":"[\"小班\"]",
|
|||
|
|
"coreContent":"测试内容",
|
|||
|
|
"durationMinutes":25
|
|||
|
|
}'
|
|||
|
|
|
|||
|
|
# 期望返回:{"code":200,"message":"操作成功",...}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 前端修复
|
|||
|
|
|
|||
|
|
已修复前端字段名称不匹配问题:
|
|||
|
|
- `duration` → `durationMinutes`
|
|||
|
|
|
|||
|
|
修改文件:`reading-platform-frontend/src/views/admin/courses/CourseEditView.vue:320`
|