SQL Server数据库同步方案,结合bcp ,sqlcmd工具实现【亲测,绝对无坑,拿来即用】
SQL Server数据库同步方案摘要 本方案实现了在非实时情况下,通过中间服务器Server B将Server A的数据同步到Server C。Server B可以同时访问Server A和Server C,而Server A和Server C之间不能直接通信。 方案采用bcp和sqlcmd工具,在Server B上部署批处理脚本Sync_db.bat,主要流程包括: 从Server A导出数据
·
SQL Server数据库同步方案
serverA — server B ---- serverC
其中serverB可以同时访问server A 和server C ,但是server A 和 server C之间不能相互访问,现需要把server A 的数据同步到server C ,非实时。

此方案结合了bcp , sqlcmd工具在server B 部署脚本,从server A导出数据,导入到server C.
说明:此方案只针对部分表的非实时同步,另外还可以考虑使用sp_addlinkedserver,sp_addlinkedsrvlogin方式实现,但是在测试中发现一个十几万的表在写入到server C 的时候特别慢。故此测试此方案,十几万的数据1分钟左右完成。
Sync_db.bat
@echo off
echo --------------------------------------------------------------------
echo ----------正在同步生产数据库数据到镜像库,请勿关闭窗口----------------------
echo --------------------------------------------------------------------
set bcp="D:\Program Files\Microsoft SQL Server\Client SDK\ODBC\130\Tools\Binn\bcp.exe"
set sqlcmd="D:\Program Files\Microsoft SQL Server\Client SDK\ODBC\130\Tools\Binn\SQLCMD.EXE"
REM 格式化时间
set datevar=%date:~0,4%%date:~5,2%%date:~8,2%
set timevar=%time:~0,2%
set timevar=%timevar%%time:~3,2%%time:~6,2%
set fileA="D:\DMP\sqlserver\ZHOUDB\Bus_tab.txt"
REM 记录操作日志
set logfile_path="D:\scripts\sqlserver\logs"
set logfile="D:\scripts\sqlserver\logs\SyncZHOUDB_%datevar%%timevar%.log"
call :LOG > %logfile%
exit /B
:LOG
echo --------------------------------------------------------------
echo ---------------- 记录操作日志--------- -----------------------
echo --------------------------------------------------------------
set /a startS=%time:~6,2%
set /a startM=%time:~3,2%
echo Start_Time %time%
echo 1.从生产10.128.23.6导出数据
bcp ZHOUDB.dbo.Bus_tab out D:\DMP\sqlserver\ZHOUDB\Bus_tab.txt -c -t "," -r "\n" -S"192.168.1.1,1433" -U"chakan" -P"chakan@123"
echo 2.清空镜像库10.128.103.78表数据否则出现唯一键冲突,并退出sqlcmd
sqlcmd -S tcp:10.128.103.78,1433 -d ZHOUDB_SS -U sa -P "Sjzt$db_2023" -i D:\scripts\sqlserver\ZHOUDB.sql
echo 3.导入数据
bcp ZHOUDB_SS.dbo.Bus_tab in D:\DMP\sqlserver\ZHOUDB\Bus_tab.txt -c -t "," -r "\n" -S"192.168.1.2,1433" -U"sa" -P"chakan@123"
echo 4.删除备份文件
del "%fileA%"
if %ERRORLEVEL% neq 0 (
echo 删除操作执行失败,错误代码: %ERRORLEVEL%
goto :end
)
if exist "%fileA%" (
echo 文件删除失败: %fileA%
) else (
echo 文件已成功删除: %fileA%
)
echo.
set /a endS=%time:~6,2%
set /a endM=%time:~3,2%
echo End_Time %time%
set /a diffS_=%endS%-%startS%
set /a diffM_=%endM%-%startM%
echo.
echo.
echo Cost_Time %diffM_% Min %diffS_% Second
echo.
echo.
:end
echo -------------------END----------------------
更多推荐

所有评论(0)