Files

16 KiB
Raw Permalink Blame History

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 文件:

# /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. 创建脚本目录和文件

# 创建目录
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. 注册任务计划程序(管理员权限)

$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 重启后,执行以下命令验证:

# 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 = ReadyLastTaskResult = 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 执行(不需要管理员)
[System.Environment]::SetEnvironmentVariable('MYSQL_PWD_WIT', 'o2byaCkBvF1Y8S2L', 'User')

# 验证
echo $env:MYSQL_PWD_WIT

备用验证脚本 C:\Scripts\verify_portproxy.ps1

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

执行状态

全部执行完成

验证结果

-- 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),而非真正的换行符。

解决:

SOURCE_CREATE=$(mysql ... -e "SHOW CREATE TABLE ..." | cut -f2 | sed 's/\\n/\n/g')

批量修复已生成脚本:

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' 删除首尾行。

# 完整处理流程
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 完成

验证结果:

# 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

命令行:

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