chore: 保存笔记本本地未提交改动(源码+新增文件,排除构建缓存/大文件)

This commit is contained in:
renjianbo
2026-07-11 08:58:10 +08:00
parent ad2b899c17
commit 541a08628c
832 changed files with 102878 additions and 1517 deletions

View File

@@ -0,0 +1,321 @@
# 数据库本地/云端切换方案
## 当前配置
| | 本地 MySQL | 腾讯云 CynosDB |
|---|---|---|
| 地址 | `127.0.0.1:3306` | `gz-cynosdbmysql-grp-d26pzce5.sql.tencentcdb.com:24936` |
| 用户 | `root` | `root` |
| 密码 | `123456` | `!Rjb12191` |
| 数据库 | `agent_db` | `agent_db` |
---
## 一、切换到云端(本地 → 云)
### 步骤 1:导出本地最新数据
```bash
mysqldump -h 127.0.0.1 -P 3306 -u root -p123456 \
--single-transaction \
--set-gtid-purged=OFF \
--databases agent_db \
> agent_db_local.sql
```
### 步骤 2:导入云端
```bash
mysql -h gz-cynosdbmysql-grp-d26pzce5.sql.tencentcdb.com \
-P 24936 -u root -p'!Rjb12191' \
--default-character-set=utf8mb4 \
agent_db < agent_db_local.sql
```
### 步骤 3:修改配置
编辑 `backend\.env`:
```
DATABASE_URL=mysql+pymysql://root:!Rjb12191@gz-cynosdbmysql-grp-d26pzce5.sql.tencentcdb.com:24936/agent_db?charset=utf8mb4
```
### 步骤 4:重启服务
```powershell
powershell -ExecutionPolicy Bypass -File .\scripts\restart_api_worker.ps1
```
---
## 二、切换到本地(云 → 本地)
### 步骤 1:导出云端数据
```bash
mysqldump -h gz-cynosdbmysql-grp-d26pzce5.sql.tencentcdb.com \
-P 24936 -u root -p'!Rjb12191' \
--single-transaction \
--set-gtid-purged=OFF \
--databases agent_db \
> agent_db_cloud.sql
```
### 步骤 2:导入本地
```bash
mysql -h 127.0.0.1 -P 3306 -u root -p123456 \
--default-character-set=utf8mb4 \
agent_db < agent_db_cloud.sql
```
> 如本地尚无 `agent_db`:先 `CREATE DATABASE agent_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;`
### 步骤 3:修改配置
编辑 `backend\.env`:
```
DATABASE_URL=mysql+pymysql://root:123456@127.0.0.1:3306/agent_db?charset=utf8mb4
```
### 步骤 4:重启服务
```powershell
powershell -ExecutionPolicy Bypass -File .\scripts\restart_api_worker.ps1
```
---
## 三、一键切换脚本
在 `backend\` 目录下创建 `switch_db.ps1`:
```powershell
param(
[ValidateSet("local","cloud")]
[string]$target = "local"
)
$env_path = "D:\aaa\aiagent\backend\.env"
if ($target -eq "local") {
$url = "mysql+pymysql://root:123456@127.0.0.1:3306/agent_db?charset=utf8mb4"
} else {
$url = "mysql+pymysql://root:!Rjb12191@gz-cynosdbmysql-grp-d26pzce5.sql.tencentcdb.com:24936/agent_db?charset=utf8mb4"
}
(Get-Content $env_path -Encoding UTF8) -replace '^DATABASE_URL=.*$', "DATABASE_URL=$url" |
Set-Content $env_path -Encoding UTF8
Write-Host "switched to: $target"
Write-Host "restarting..."
& "D:\aaa\aiagent\backend\scripts\restart_api_worker.ps1"
```
用法:
```powershell
# 切到本地
.\switch_db.ps1 local
# 切到云端
.\switch_db.ps1 cloud
```
---
## 四、数据同步方案
日常使用中,本地和云端两套库会各自产生增量数据,以下提供三种同步策略。
### 策略对比
| 方案 | 适用场景 | 复杂度 | 数据安全 |
|---|---|---|---|
| A. 定时全量同步 | 单主库为主,另一库为备份/测试 | 低 | 高(无删除风险) |
| B. 增量同步脚本 | 两库都有写入,需合并 | 中 | 中(依赖时间戳) |
| C. 主从复制 | 云端为主,本地只读 | 高 | 最高 |
---
### 方案 A:定时全量同步(推荐)
**思路**:以一方为主,定时导出全量覆盖另一方。适合"云端开发调试 → 同步到本地备份"或"本地开发 → 推到云端上线"的单一方向。
在 `backend\` 创建 `sync_db.ps1`:
```powershell
param(
[ValidateSet("local2cloud","cloud2local")]
[string]$direction = "local2cloud"
)
$dump_file = "D:\aaa\aiagent\agent_db_sync.sql"
if ($direction -eq "local2cloud") {
Write-Host "=== 本地 同步到 云端 ==="
# 1. 导出本地
Write-Host "[1/3] 导出本地..."
& "C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqldump.exe" `
-h 127.0.0.1 -P 3306 -u root -p123456 `
--single-transaction --set-gtid-purged=OFF `
--databases agent_db > $dump_file
if ($LASTEXITCODE -ne 0) { Write-Host "ERROR: 导出失败"; exit 1 }
# 2. 导入云端(先删后建,保证完全一致)
Write-Host "[2/3] 导入云端..."
& "C:\Program Files\MySQL\MySQL Server 5.7\bin\mysql.exe" `
-h gz-cynosdbmysql-grp-d26pzce5.sql.tencentcdb.com -P 24936 `
-u root -p'!Rjb12191' `
--default-character-set=utf8mb4 < $dump_file
if ($LASTEXITCODE -ne 0) { Write-Host "ERROR: 导入失败"; exit 1 }
# 3. 清理
Write-Host "[3/3] 完成"
Remove-Item $dump_file -ErrorAction SilentlyContinue
} else {
Write-Host "=== 云端 同步到 本地 ==="
# 1. 导出云端
Write-Host "[1/3] 导出云端..."
& "C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqldump.exe" `
-h gz-cynosdbmysql-grp-d26pzce5.sql.tencentcdb.com -P 24936 `
-u root -p'!Rjb12191' `
--single-transaction --set-gtid-purged=OFF `
--databases agent_db > $dump_file
if ($LASTEXITCODE -ne 0) { Write-Host "ERROR: 导出失败"; exit 1 }
# 2. 丢弃本地并重建
Write-Host "[2/3] 导入本地..."
& "C:\Program Files\MySQL\MySQL Server 5.7\bin\mysql.exe" `
-h 127.0.0.1 -P 3306 -u root -p123456 `
-e "DROP DATABASE IF EXISTS agent_db; CREATE DATABASE agent_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" 2>NUL
& "C:\Program Files\MySQL\MySQL Server 5.7\bin\mysql.exe" `
-h 127.0.0.1 -P 3306 -u root -p123456 `
--default-character-set=utf8mb4 agent_db < $dump_file
if ($LASTEXITCODE -ne 0) { Write-Host "ERROR: 导入失败"; exit 1 }
# 3. 清理
Write-Host "[3/3] 完成"
Remove-Item $dump_file -ErrorAction SilentlyContinue
}
Write-Host "同步完成: $direction"
```
用法:
```powershell
# 本地开发完,推到云端
.\sync_db.ps1 local2cloud
# 云端有最新数据,拉到本地
.\sync_db.ps1 cloud2local
```
> 可配合 Windows 任务计划程序(`taskschd.msc`)每天凌晨自动执行。
---
### 方案 B:增量同步(按更新时间合并)
**思路**:只同步有变化的行,避免全量传输。要求表有 `updated_at` 字段。
`sync_incremental.ps1`:
```powershell
param(
[string]$since = (Get-Date).AddHours(-1).ToString("yyyy-MM-dd HH:mm:ss")
)
$local = @{ Host="127.0.0.1"; Port="3306"; User="root"; Pass="123456" }
$cloud = @{ Host="gz-cynosdbmysql-grp-d26pzce5.sql.tencentcdb.com"; Port="24936"; User="root"; Pass="!Rjb12191" }
# 需要同步的业务表(排除日志/缓存/向量)
$tables = @(
"agents", "workflows", "workflow_versions", "teams", "team_members",
"goals", "model_configs", "data_sources", "node_templates",
"agent_schedules", "alert_rules", "users", "workspaces",
"agent_permissions", "tool_registry", "tools"
)
foreach ($table in $tables) {
Write-Host "Syncing: $table"
$dump_file = "D:\aaa\aiagent\temp_${table}.sql"
# 导出本地增量(按 updated_at 过滤)
& "C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqldump.exe" `
-h $local.Host -P $local.Port -u $local.User -p$local.Pass `
--single-transaction --set-gtid-purged=OFF --no-create-info `
--where="updated_at >= '$since'" `
agent_db $table > $dump_file 2>NUL
# 导入云端(先删后插,防止主键冲突)
$pk_col = @{ agents="id"; workflows="id"; workflow_versions="id"; teams="id"; team_members="id"; goals="id"; users="id" }
$pk = $pk_col[$table]
if ($pk) {
$ids = Select-String -Path $dump_file -Pattern "VALUES\s*\((.*?)\)" -AllMatches |
ForEach-Object { $_.Matches } |
ForEach-Object { "'" + $_.Groups[1].Value.Split(",")[0].Trim("'") + "'" }
$id_list = $ids -join ","
if ($id_list) {
& "C:\Program Files\MySQL\MySQL Server 5.7\bin\mysql.exe" `
-h $cloud.Host -P $cloud.Port -u $cloud.User -p$cloud.Pass `
-e "DELETE FROM agent_db.$table WHERE $pk IN ($id_list)" 2>NUL
}
}
& "C:\Program Files\MySQL\MySQL Server 5.7\bin\mysql.exe" `
-h $cloud.Host -P $cloud.Port -u $cloud.User -p$cloud.Pass `
--default-character-set=utf8mb4 agent_db < $dump_file 2>NUL
Remove-Item $dump_file -ErrorAction SilentlyContinue
}
Write-Host "增量同步完成 (since: $since)"
```
用法:
```powershell
# 同步最近1小时的变更
.\sync_incremental.ps1
# 同步2026-06-21之后的所有变更
.\sync_incremental.ps1 -since "2026-06-21 00:00:00"
```
> **注意**:增量同步无法检测 `DELETE` 操作。如需完整一致性,定期用方案A做一次全量覆盖。
---
### 方案 C:云端为主、本地只读(主从复制思路)
如果开发流程是"线上跑业务、本地做数据分析/调试",可用此方案:
1. 本地定期从云端全量拉取(方案A的 `cloud2local` 方向)
2. 本地不做写入操作,避免冲突
3. 如需在本地改配置/Agent,改完后用方案A推回云端
此方案最简单且无数据不一致风险,推荐日常开发使用。
---
### 同步策略选择建议
| 场景 | 推荐方案 |
|---|---|
| 日常开发:本地改完上线 | `cloud2local`(拉最新)→ 本地改 → `local2cloud`(推上线) |
| 每日自动备份到本地 | 方案A `cloud2local` + Windows定时任务 |
| 本地和云端都在改(双活) | 方案B 增量同步 + 定期方案A全量校验 |
| 只把云端当主库,本地纯备份 | 方案C(最省心) |
---
## 五、重要提示
| 事项 | 说明 |
|---|---|
| 数据同步 | 导出导入是**全量覆盖**,不会合并两边增量数据 |
| 切换时机 | 建议在无活跃用户时操作,避免数据丢失 |
| 备份 | 每次切换前建议保留导出文件作为备份 |
| GTID | 导出必须加 `--set-gtid-purged=OFF`,否则导入本地会报错 |
| 本地 MySQL | 需确保 MySQL 5.7 服务已启动(`services.msc` → MySQL57) |
| 飞书服务 | 云端恢复后飞书机器人会自动重连,无需额外操作 |