# 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`)