如何从不同IP的SQL Server实例向另一台SQL Server插入表字段数据
跨SQL Server实例定时同步字段解决方案
方案思路
采用和你熟悉的MySQL bash导出导入相似的逻辑,用SQL Server官方自带的bcp/sqlcmd工具配合awk做数据处理,不需要配置链接服务器,兼容性高,适合定时调度。核心逻辑是从22号实例导出TableA的A1字段到临时文件,清洗后批量插入到23号实例TableB的B2字段。
前置检查
先解决之前sqlcmd执行失败的问题,避免后续脚本报错:
- 确认两台服务器的1433端口(SQL Server默认端口)互通,无防火墙/安全组拦截
- 确认使用的SQL Server账号权限:22号实例账号要有TableA的查询权限,23号实例账号要有TableB的写入权限
- 如果是SQL Server命名实例,连接地址需要写成
IP\\实例名格式
具体实现步骤
1. 编写bash同步脚本
新建脚本文件sql_sync.sh,内容如下,替换尖括号内的实际参数即可:
#!/bin/bash # 配置参数 SQL22_IP="192.168.x.22" SQL22_USER="<22号实例SQL账号>" SQL22_PWD="<22号实例SQL密码>" SQL22_DB="<22号实例对应数据库名>" SQL23_IP="192.168.x.23" SQL23_USER="<23号实例SQL账号>" SQL23_PWD="<23号实例SQL密码>" SQL23_DB="<23号实例对应数据库名>" TMP_EXPORT="/tmp/table_a_a1.csv" TMP_SQL="/tmp/insert_b.sql" LOG_PATH="/var/log/sql_sync.log" # 清理旧临时文件 rm -f $TMP_EXPORT $TMP_SQL # 1. 从22号实例导出A1字段数据 echo "$(date +'%Y-%m-%d %H:%M:%S') 开始导出TableA.A1数据" >> $LOG_PATH bcp "SELECT A1 FROM $SQL22_DB.dbo.TableA" queryout $TMP_EXPORT -S $SQL22_IP -U $SQL22_USER -P $SQL22_PWD -c -t, -r "\n" >> $LOG_PATH 2>&1 if [ $? -ne 0 ]; then echo "$(date +'%Y-%m-%d %H:%M:%S') 导出失败,退出任务" >> $LOG_PATH exit 1 fi # 2. awk清洗数据:过滤空行、空值,构造INSERT语句 # 如A1是数值类型,可去掉VALUES两侧的单引号 awk -F, 'NF>0 && $1!="" {print "INSERT INTO '"$SQL23_DB"'.dbo.TableB(B2) VALUES('\''"$1"'\'');"}' $TMP_EXPORT > $TMP_SQL # 3. 导入到23号实例TableB的B2字段 echo "$(date +'%Y-%m-%d %H:%M:%S') 开始导入数据到TableB.B2" >> $LOG_PATH sqlcmd -S $SQL23_IP -U $SQL23_USER -P $SQL23_PWD -i $TMP_SQL >> $LOG_PATH 2>&1 if [ $? -ne 0 ]; then echo "$(date +'%Y-%m-%d %H:%M:%S') 导入失败" >> $LOG_PATH exit 1 fi echo "$(date +'%Y-%m-%d %H:%M:%S') 同步完成" >> $LOG_PATH rm -f $TMP_EXPORT $TMP_SQL
2. 测试脚本
给脚本加执行权限后手动运行一次,确认日志输出正常,23号实例TableB的B2字段数据正确:
chmod +x sql_sync.sh ./sql_sync.sh
3. 配置定时任务
- Linux环境用crontab:执行
crontab -e添加定时规则,例如每天凌晨2点执行一次:0 2 * * * /绝对路径/to/sql_sync.sh - Windows环境用任务计划程序:新建任务,触发器设置为指定运行时间,操作选择「启动程序」,程序路径选择bash.exe(WSL环境)或直接把脚本改写为bat脚本用cmd执行。
注意事项
- 如果TableB的B2字段有去重要求,可以在导出的SELECT语句里加DISTINCT,或者在awk环节做去重处理
- 数据量超过10万条时,建议改用bcp批量导入代替逐行INSERT,性能提升10倍以上
- 可以在脚本中加入告警逻辑,同步失败时发送邮件/企业微信通知
内容的提问来源于stack exchange,提问作者Preman Terminal
相关产品推荐
相关产品推荐

