16 KiB
16 KiB
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 = 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 执行(不需要管理员)
[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 张)
dmp_om_productinfo- 主表(ALTER TABLE)dmp_om_productinfo_cost- 成本表(CREATE TABLE)dmp_om_productinfo_other_costs- 其他成本表(CREATE TABLE)dmp_om_productinfo_work_costs- 工序成本表(CREATE TABLE)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 开发库,确保开发环境与准生产环境表结构一致。
创建过程:
- 15:21 - 创建技能目录和基础脚本
- 15:28 - 首次执行
dmp_serp全量同步(303 张表) - 15:34 - 发现并修复
\n转义字符问题 - 15:38 - 测试单表同步
dmp_smes.8d_cause_action - 15:40 - 修复脚本提取逻辑(
cut -f2+sed '1d;$d') - 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 # 单表同步
注意事项
- 网络环境: 准生产数据库只能在
100.115.195.x网段访问 - 表数量阈值: > 50 张表时需要用户确认
- 错误处理: 遇到错误时继续执行其他表
- 表名格式:
dmp_smes库的表名不带dmp_前缀(如8d_cause_action)