Files
openclaw-config/workspace-sql/memory/2026-08-14.md
T

465 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 2026-08-14 工作记录
## 准生产数据库连接配置
**时间:** 2026-08-14 11:21-11:35
### 数据库信息
| 项目 | 值 |
|------|-----|
| 转发地址 | `100.115.195.188:50036` |
| 实际数据库 | `47.99.209.185:50036` |
| MySQL 版本 | 8.0.36 |
| 用户 | `witsoftd` |
| 密码 | `o2byaCkBvF1Y8S2L` |
| 权限 | 只读(准生产环境) |
### 连接测试结果
- ✅ Ping 可达(14-21ms
- ✅ TCP 端口 50036 开放
- ✅ MySQL 连接成功,返回 `SELECT 1` 和版本号
### 配置文件更新
**Linux 工作区 `.env` 文件:**
```bash
# /home/yangxuan/.openclaw/workspace-sql/.env
MYSQL_PWD_SQL=5gynj20J
MYSQL_PWD_WIT=o2byaCkBvF1Y8S2L
```
**TOOLS.md 更新:** 添加准生产数据库连接记录
---
## Windows 端口转发持久化配置
**问题:** `netsh interface portproxy` 规则在 Windows 重启后会丢失
**解决方案:** 使用任务计划程序开机自动执行
### 配置步骤(在 Windows 100.115.195.188 上执行)
#### 1. 创建脚本目录和文件
```powershell
# 创建目录
New-Item -ItemType Directory -Force -Path C:\Scripts
# 创建批处理文件 C:\Scripts\portproxy_setup.bat
@'
@echo off
REM 确保 IP Helper 服务运行
sc start iphlpsvc
REM 清理旧规则
netsh interface portproxy delete v4tov4 listenaddress=100.115.195.188 listenport=50036
netsh interface portproxy delete v4tov4 listenaddress=100.115.195.188 listenport=38848
REM 添加转发规则
netsh interface portproxy add v4tov4 listenaddress=100.115.195.188 listenport=50036 connectaddress=47.99.209.185 connectport=50036
netsh interface portproxy add v4tov4 listenaddress=100.115.195.188 listenport=38848 connectaddress=120.26.89.170 connectport=38848
echo 端口转发配置完成
'@ | Out-File -FilePath C:\Scripts\portproxy_setup.bat -Encoding ASCII
# 创建 PowerShell 启动脚本 C:\Scripts\portproxy_startup.ps1
@'
# 等待网络就绪
Start-Sleep -Seconds 10
# 执行配置
& C:\Scripts\portproxy_setup.bat
'@ | Out-File -FilePath C:\Scripts\portproxy_startup.ps1 -Encoding UTF8
```
#### 2. 注册任务计划程序(管理员权限)
```powershell
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-ExecutionPolicy Bypass -File C:\Scripts\portproxy_startup.ps1"
$trigger = New-ScheduledTaskTrigger -AtStartup
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest
Register-ScheduledTask -TaskName "PortProxy Setup" -Action $action -Trigger $trigger -Principal $principal -Description "自动配置端口转发规则"
```
---
## 重启后验证步骤
**下次 Windows 重启后,执行以下命令验证:**
```powershell
# 1. 检查任务计划程序状态
Get-ScheduledTask -TaskName "PortProxy Setup" | Select-Object TaskName, State, LastRunTime, LastTaskResult
# 2. 检查端口转发规则
netsh interface portproxy show all
# 3. 检查端口监听状态
netstat -ano | findstr "50036"
# 4. 测试 MySQL 连接
mysql -h 100.115.195.188 -P 50036 -u witsoftd -p"o2byaCkBvF1Y8S2L" -e "SELECT 1 AS test, VERSION() AS version;"
```
**期望输出:**
- 任务状态:`State = Ready``LastTaskResult = 0`
- 端口转发:`100.115.195.188:50036 → 47.99.209.185:50036`
- 监听状态:`TCP 100.115.195.188:50036 LISTENING`
- MySQL 测试:返回 `test=1, version=8.0.36`
---
## 相关配置
### 环境变量设置(Windows 用户级别,永久生效)
```powershell
# PowerShell 执行(不需要管理员)
[System.Environment]::SetEnvironmentVariable('MYSQL_PWD_WIT', 'o2byaCkBvF1Y8S2L', 'User')
# 验证
echo $env:MYSQL_PWD_WIT
```
### 备用验证脚本 C:\Scripts\verify_portproxy.ps1
```powershell
Write-Host "=== 任务计划程序状态 ===" -ForegroundColor Cyan
Get-ScheduledTask -TaskName "PortProxy Setup" | Select-Object TaskName, State, LastRunTime, LastTaskResult
Write-Host "`n=== 端口转发规则 ===" -ForegroundColor Cyan
netsh interface portproxy show all
Write-Host "`n=== 端口监听状态 ===" -ForegroundColor Cyan
netstat -ano | findstr "50036"
Write-Host "`n=== MySQL 连接测试 ===" -ForegroundColor Cyan
mysql -h 100.115.195.188 -P 50036 -u witsoftd -p"o2byaCkBvF1Y8S2L" -e "SELECT 1 AS test, VERSION() AS version;"
```
---
## VPS 表结构同步 - 准生产 → VPS
**时间:** 2026-08-14 13:39-14:00
**源:** 准生产 `100.115.195.188:50036` (只读)
**目标:** VPS `101.34.227.188:3306` `dmp_serp`
### 同步的表(共 5 张)
1. `dmp_om_productinfo` - 主表(ALTER TABLE
2. `dmp_om_productinfo_cost` - 成本表(CREATE TABLE
3. `dmp_om_productinfo_other_costs` - 其他成本表(CREATE TABLE
4. `dmp_om_productinfo_work_costs` - 工序成本表(CREATE TABLE
5. `dmp_om_productinfo_test` - 测试表(CREATE TABLE
### 主表变更详情
| 字段 | 操作 | 说明 |
|------|------|------|
| `om_discountrate` | NULL → NOT NULL | 先更新 3 条 NULL 值为 1.0 |
| `om_stockout` | NULL → NOT NULL | 先更新 NULL 值为 0 |
| `invoice_status` | 已存在 | 跳过添加 |
| `cust_product_spec` | 已存在 | 跳过添加 |
| `creator_user_id` | 删除 | 准生产无此字段 |
### 脚本位置
```
/home/yangxuan/codes/xuan-sql/scripts/20260814/
├── README.md
├── dmp_serp__dmp_om_productinfo__struct.sql
├── dmp_serp__dmp_om_productinfo_cost__struct.sql
├── dmp_serp__dmp_om_productinfo_other_costs__struct.sql
├── dmp_serp__dmp_om_productinfo_work_costs__struct.sql
└── dmp_serp__dmp_om_productinfo_test__struct.sql
```
### 执行状态
✅ 全部执行完成
### 验证结果
```sql
-- 5 张表全部创建成功
SHOW TABLES LIKE 'dmp_om_productinfo%';
-- 主表关键字段验证
SELECT COLUMN_NAME, IS_NULLABLE, COLUMN_DEFAULT
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'dmp_serp'
AND TABLE_NAME = 'dmp_om_productinfo'
AND COLUMN_NAME IN ('om_discountrate', 'om_stockout', 'invoice_status', 'cust_product_spec');
-- om_discountrate: NO (NOT NULL)
-- om_stockout: NO (NOT NULL)
```
### 注意事项
- 不影响其他库(特别是 `ruoyi-vue-pro`
- 字符集统一为 `utf8mb4 / utf8mb4_general_ci`
- 测试数据已保留(7 条)
## 表结构同步 - 14:33
**源:** 准生产 `dmp_smdm`
**目标:** VPS `dmp_smdm`
**处理表数:** 127
**成功:** 93
**失败:** 34
### 处理的表
| 表名 | 操作 | 状态 | 说明 |
|------|------|------|------|
| debezium_heartbeat | CREATE | ✅ | 新建表 |
| dmp_i18n_messages | CREATE | ✅ | 新建表 |
| dmp_md_account_period | CREATE | ✅ | 新建表 |
| dmp_md_account_unit | CREATE | ✅ | 新建表 |
| dmp_md_arguments | CREATE | ✅ | 新建表 |
| dmp_md_arguments_device | CREATE | ✅ | 新建表 |
| dmp_md_base_config | CREATE | ✅ | 新建表 |
| dmp_md_batch_import_menu | CREATE | ✅ | 新建表 |
| dmp_md_batch_import_result | CREATE | ✅ | 新建表 |
| dmp_md_billrule | ALTER | ❌ | 执行失败 |
| dmp_md_billrule_template | ALTER | ❌ | 执行失败 |
| dmp_md_bom_closure | CREATE | ✅ | 新建表 |
| dmp_md_bom_master | CREATE | ✅ | 新建表 |
| dmp_md_company | ALTER | ❌ | 执行失败 |
| dmp_md_currency | CREATE | ✅ | 新建表 |
| dmp_md_custom_print_label_template | CREATE | ✅ | 新建表 |
| dmp_md_custom_print_template | CREATE | ✅ | 新建表 |
| dmp_md_customer_bom | CREATE | ✅ | 新建表 |
| dmp_md_customer_classfied | CREATE | ✅ | 新建表 |
| dmp_md_customer_contact | CREATE | ✅ | 新建表 |
| dmp_md_customer_info | ALTER | ❌ | 执行失败 |
| dmp_md_customer_login_user | CREATE | ✅ | 新建表 |
| dmp_md_customer_pinyin | CREATE | ✅ | 新建表 |
| dmp_md_customer_product_price | ALTER | ❌ | 执行失败 |
| dmp_md_customer_user | CREATE | ✅ | 新建表 |
| dmp_md_department | CREATE | ✅ | 新建表 |
| dmp_md_device | CREATE | ✅ | 新建表 |
| dmp_md_device_info | CREATE | ✅ | 新建表 |
| dmp_md_dictionary_data | ALTER | ❌ | 执行失败 |
| dmp_md_dictionary_type | ALTER | ❌ | 执行失败 |
| dmp_md_dynamic_field_config | CREATE | ✅ | 新建表 |
| dmp_md_factory | ALTER | ❌ | 执行失败 |
| dmp_md_invoicing_info | CREATE | ✅ | 新建表 |
| dmp_md_item_category | ALTER | ❌ | 执行失败 |
| dmp_md_item_group_relation | CREATE | ✅ | 新建表 |
| dmp_md_item_info | ALTER | ❌ | 执行失败 |
| dmp_md_item_info_log | CREATE | ✅ | 新建表 |
| dmp_md_item_info_replace | CREATE | ✅ | 新建表 |
| dmp_md_item_info_rule | CREATE | ✅ | 新建表 |
| dmp_md_item_info_unit | CREATE | ✅ | 新建表 |
| dmp_md_item_model | CREATE | ✅ | 新建表 |
| dmp_md_item_mold | CREATE | ✅ | 新建表 |
| dmp_md_item_pinyin | CREATE | ✅ | 新建表 |
| dmp_md_item_property | ALTER | ❌ | 执行失败 |
| dmp_md_item_route | ALTER | ❌ | 执行失败 |
| dmp_md_item_route_cxcl | CREATE | ✅ | 新建表 |
| dmp_md_item_route_op | ALTER | ❌ | 执行失败 |
| dmp_md_location | CREATE | ✅ | 新建表 |
| dmp_md_mc_order_bom_header | CREATE | ✅ | 新建表 |
| dmp_md_mc_order_bom_line | CREATE | ✅ | 新建表 |
| dmp_md_modules_scenes | CREATE | ✅ | 新建表 |
| dmp_md_mold_info | CREATE | ✅ | 新建表 |
| dmp_md_operate_log | CREATE | ✅ | 新建表 |
| dmp_md_operation_log | CREATE | ✅ | 新建表 |
| dmp_md_operation_procedure | ALTER | ❌ | 执行失败 |
| dmp_md_operation_qualities | CREATE | ✅ | 新建表 |
| dmp_md_order_bom_header | CREATE | ✅ | 新建表 |
| dmp_md_order_bom_line | CREATE | ✅ | 新建表 |
| dmp_md_paper_default | CREATE | ✅ | 新建表 |
| dmp_md_person | CREATE | ✅ | 新建表 |
| dmp_md_print_node | CREATE | ✅ | 新建表 |
| dmp_md_print_template | CREATE | ✅ | 新建表 |
| dmp_md_process_equip | CREATE | ✅ | 新建表 |
| dmp_md_process_warehouse | CREATE | ✅ | 新建表 |
| dmp_md_product_management_config | CREATE | ✅ | 新建表 |
| dmp_md_production_line | ALTER | ❌ | 执行失败 |
| dmp_md_productionline_director | ALTER | ❌ | 执行失败 |
| dmp_md_productive_rewources | CREATE | ✅ | 新建表 |
| dmp_md_property_group | CREATE | ✅ | 新建表 |
| dmp_md_property_item | ALTER | ❌ | 执行失败 |
| dmp_md_property_project | ALTER | ❌ | 执行失败 |
| dmp_md_property_project_detail | CREATE | ✅ | 新建表 |
| dmp_md_property_relation | ALTER | ❌ | 执行失败 |
| dmp_md_province | CREATE | ✅ | 新建表 |
| dmp_md_quality_type | CREATE | ✅ | 新建表 |
| dmp_md_route | ALTER | ❌ | 执行失败 |
| dmp_md_route_item_material | CREATE | ✅ | 新建表 |
| dmp_md_route_op | ALTER | ❌ | 执行失败 |
| dmp_md_route_op_cycle | ALTER | ❌ | 执行失败 |
| dmp_md_route_op_document | CREATE | ✅ | 新建表 |
| dmp_md_route_op_mat | ALTER | ❌ | 执行失败 |
| dmp_md_route_op_param | ALTER | ❌ | 执行失败 |
| dmp_md_route_op_template | CREATE | ✅ | 新建表 |
| dmp_md_rule_element | CREATE | ✅ | 新建表 |
| dmp_md_send_config | CREATE | ✅ | 新建表 |
| dmp_md_send_recipient | CREATE | ✅ | 新建表 |
| dmp_md_serial | ALTER | ❌ | 执行失败 |
| dmp_md_serial_format | ALTER | ❌ | 执行失败 |
| dmp_md_shift_config | CREATE | ✅ | 新建表 |
| dmp_md_sr_op | CREATE | ✅ | 新建表 |
| dmp_md_sr_user | CREATE | ✅ | 新建表 |
| dmp_md_standard_capacity | CREATE | ✅ | 新建表 |
| dmp_md_station | CREATE | ✅ | 新建表 |
| dmp_md_std_bom_header | ALTER | ❌ | 执行失败 |
| dmp_md_std_bom_header_log | CREATE | ✅ | 新建表 |
| dmp_md_std_bom_line | ALTER | ❌ | 执行失败 |
| dmp_md_std_bom_line_log | CREATE | ✅ | 新建表 |
| dmp_md_std_bom_line_logs | CREATE | ✅ | 新建表 |
| dmp_md_storage_category | ALTER | ❌ | 执行失败 |
| dmp_md_storage_pinyin | CREATE | ✅ | 新建表 |
| dmp_md_storage_user | CREATE | ✅ | 新建表 |
| dmp_md_sub_storage | CREATE | ✅ | 新建表 |
| dmp_md_switch_config | ALTER | ❌ | 执行失败 |
| dmp_md_third_server_config | CREATE | ✅ | 新建表 |
| dmp_md_unit | ALTER | ❌ | 执行失败 |
| dmp_md_unit_conversion | ALTER | ❌ | 执行失败 |
| dmp_md_vendor_classfied | CREATE | ✅ | 新建表 |
| dmp_md_vendor_info | ALTER | ❌ | 执行失败 |
| dmp_md_vendor_login_user | CREATE | ✅ | 新建表 |
| dmp_md_vendor_pinyin | CREATE | ✅ | 新建表 |
| dmp_md_vendor_user | CREATE | ✅ | 新建表 |
| dmp_md_work_calendar | CREATE | ✅ | 新建表 |
| dmp_md_workgroup | CREATE | ✅ | 新建表 |
| dmp_md_workgroup_person | CREATE | ✅ | 新建表 |
| dmp_md_workshop | ALTER | ❌ | 执行失败 |
| dmp_optlog_infos | CREATE | ✅ | 新建表 |
| dmp_rm_basic_config | CREATE | ✅ | 新建表 |
| dmp_rm_basic_dictionary | CREATE | ✅ | 新建表 |
| dmp_rm_formulation | CREATE | ✅ | 新建表 |
| dmp_rm_formulation_material | CREATE | ✅ | 新建表 |
| dmp_rm_formulation_product | CREATE | ✅ | 新建表 |
| dmp_rm_ingredient | CREATE | ✅ | 新建表 |
| dmp_rm_ingredient_material | CREATE | ✅ | 新建表 |
| dmp_rm_requisition | CREATE | ✅ | 新建表 |
| dmp_rm_requisition_material | CREATE | ✅ | 新建表 |
| dmp_rm_requisition_production | CREATE | ✅ | 新建表 |
| dmp_rm_requisition_production_record | CREATE | ✅ | 新建表 |
### 脚本位置
```
/home/yangxuan/codes/xuan-sql/scripts/20260814/
├── README.md
└── dmp_smdm__*_struct.sql
```
---
## table-alias 技能 - 表结构同步
**时间:** 2026-08-14 15:21-15:49
**技能版本:** v1.1.2(新建并迭代)
### 技能开发
**背景:** 需要将准生产数据库表结构同步到 VPS 开发库,确保开发环境与准生产环境表结构一致。
**创建过程:**
1. 15:21 - 创建技能目录和基础脚本
2. 15:28 - 首次执行 `dmp_serp` 全量同步(303 张表)
3. 15:34 - 发现并修复 `\n` 转义字符问题
4. 15:38 - 测试单表同步 `dmp_smes.8d_cause_action`
5. 15:40 - 修复脚本提取逻辑(`cut -f2` + `sed '1d;$d'`
6. 15:48 - 完成 `dmp_smes` 全量同步(290 张表)
### 技术修复记录
#### v1.1.1 - `\n` 转义字符处理
**问题:** MySQL `SHOW CREATE TABLE` 返回的建表语句中,字段定义之间使用字面量 `\n` 字符(两个字符:反斜杠 + n),而非真正的换行符。
**解决:**
```bash
SOURCE_CREATE=$(mysql ... -e "SHOW CREATE TABLE ..." | cut -f2 | sed 's/\\n/\n/g')
```
**批量修复已生成脚本:**
```bash
cd /home/yangxuan/codes/xuan-sql/scripts/20260814
for f in *.sql; do sed -i 's/\\n/\n/g' "$f"; done
# 处理 351 个文件
```
#### v1.1.2 - 表体提取逻辑修复
**问题 1** `SHOW CREATE TABLE` 输出是两列(表名 + CREATE 语句),用制表符分隔。
**解决:** 使用 `cut -f2` 提取第二列。
**问题 2** `sed` 正则无法跨行匹配提取表体。
**解决:** 使用 `sed '1d;$d'` 删除首尾行。
```bash
# 完整处理流程
SOURCE_CREATE=$(mysql ... -e "SHOW CREATE TABLE ..." | cut -f2 | sed 's/\\n/\n/g')
TABLE_BODY=$(echo "$SOURCE_CREATE" | sed '1d;$d')
```
### 同步任务汇总
| 时间 | 源库 | 目标库 | 表数 | 成功 | 失败 | 状态 |
|------|------|--------|------|------|------|------|
| 15:28 | 准生产 `dmp_serp` | VPS `dmp_serp` | 303 | 303 | 0 | ✅ 完成 |
| 15:38 | 准生产 `dmp_smes` (单表) | VPS `dmp_smes` | 1 | 1 | 0 | ✅ 完成 |
| 15:48 | 准生产 `dmp_smes` (全量) | VPS `dmp_smes` | 290 | 290 | 0 | ✅ 完成 |
**验证结果:**
```bash
# dmp_serp
准生产:303 张表
VPS: 303 张表 ✅
# dmp_smes
准生产:290 张表
VPS: 290 张表 ✅ (65 张,新增 225)
```
### 输出产物
**脚本目录:** `/home/yangxuan/codes/xuan-sql/scripts/20260814/`
- `dmp_serp__*__struct.sql` - 303 个文件
- `dmp_smes__*__struct.sql` - 237 个文件(新增)
- `dmp_smdm__*__struct.sql` - 127 个文件(之前生成)
**技能文件:**
- SKILL.md: `/home/yangxuan/.openclaw/workspace-sql/skills/table-alias/SKILL.md` (v1.1.2)
- 执行脚本:`/home/yangxuan/.openclaw/skills/table-alias/scripts/sync_table.sh`
### 使用示例
**自然语言命令:**
```
同步准生产 dmp_serp 的表结构到 VPS
同步准生产 dmp_smes 的 8d_cause_action 表到 VPS
```
**命令行:**
```bash
export MYSQL_PWD_WIT=o2byaCkBvF1Y8S2L
export MYSQL_PWD_SQL=5gynj20J
cd ~/.openclaw/skills/table-alias
./scripts/sync_table.sh dmp_serp # 全库同步
./scripts/sync_table.sh dmp_smes 8d_cause_action # 单表同步
```
### 注意事项
1. **网络环境:** 准生产数据库只能在 `100.115.195.x` 网段访问
2. **表数量阈值:** > 50 张表时需要用户确认
3. **错误处理:** 遇到错误时继续执行其他表
4. **表名格式:** `dmp_smes` 库的表名不带 `dmp_` 前缀(如 `8d_cause_action`