说一下用户的需求:
原先Windows 2012的Domino 12要迁移到Windows 2022上面
服务要保持运行,不能停机
ODS版本要维持52,因为有部分客户端还在使用Notes 9
解决方案:
- 通过AdminP创建副本,连接文档定时复制同步,
这种方法执行效率很低,一晚上过去才做了600个NSF。 - 通过集群的副本对齐功能,设置Symmetrical Cluster,配置文档设置如下:
[Basics]
Cluster: chn
Servers: A/SVR/ACME
B/SVR/ACME
[Symmetry]
Maintain symmetry: Specified folders
Folders: mail
Automatic repair: Fix missing files
Scan interval: 15 minutes
Damaged files: Fix damaged files
Remove damaged files after: 28 days
[Tuning]
Number of repair threads: 4
Check donor availability: 5 minutes
Retry failed repairs after: 5 minutes
Maximum number of retries: 3
Repair performance: 5 (1=slowest, 5=fastest)
Repair logging level: normal
执行时会看到输出,告知Domino 9的NSF不支持副本对齐:
REPAIR: 2026/04/26 23:50:30 Job-63482.1 Copying – mail\ac\test1.nsf from CN=C/OU=SVR/O=ACME
REPAIR: 2026/04/26 23:56:57 Job-64235.2 Repair Failed – File mail\ac\test1.nsf cannot be repaired [Invalid NSF version] - 通过隐藏命令CL COPY进行,具体步骤如下:
A. 先开启CL COPY开关,Domino控制台执行set config CLUSTER_ADMIN_ON=1
B. 编辑Step1_Scan.ps1生成A服务器上所有NSF的列表,代码如下:
(用记事本打开,修改第一行路径后保存)
# ==========================================================
# 【请直接在这里修改 CHQWEB 的 NSF 根目录】
# 末尾加不加反斜杠都没关系,脚本会自动处理
# ==========================================================
$ROOT_DIR = "E:\Program Files\IBM\Domino\data\mail"
# 规范化路径
$ROOT_DIR = $ROOT_DIR.TrimEnd('\') + "\"
$outFile = "$PSScriptRoot\A_NSF.TXT"
Write-Host "正在扫描目录: $ROOT_DIR" -ForegroundColor Cyan
# 扫描并导出
Get-ChildItem -Path $ROOT_DIR -Filter '*.nsf' -Recurse -File -ErrorAction SilentlyContinue | ForEach-Object {
$relPath = $_.FullName.Substring($ROOT_DIR.Length)
"$relPath|$($_.Length)"
} | Out-File -FilePath $outFile -Encoding UTF8
if (Test-Path $outFile) {
Write-Host "`n[成功] 已生成文件: $outFile" -ForegroundColor Green
} else {
Write-Host "`n[失败] 生成失败,请检查上方路径是否正确。" -ForegroundColor Red
}
C. 编辑并执行脚本Step1.bat,输出到A_NSF.TXT
@echo off
echo 正在启动扫描脚本...
powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0Step1_Scan.ps1"
echo.
pause
A_NSF.TXT内容示例:
ac\test1.nsf|348078080
D. 编写脚本,遍历A_NSF.TXT中的NSF,输出CL_Copy_NSF.bat
通过跑CL COPY命令进行大批量复制,参考的命令样例:(REPLICA保持副本ID一致)
CL COPY mail\ac\test1.nsf CHQ_LN5!!mail\ac\test1.nsf REPLICA
$inputFile = "$PSScriptRoot\A_NSF.TXT"
$outputBat = "$PSScriptRoot\CL_Copy_NSF.bat"
$targetServer = "B/SVR/ACME"
$prefix = "mail\"
# ==========================================================
# 【请修改 CHQWEB 服务器的 Domino 程序安装路径】
# 例如 IBM 默认是 C:\Program Files\IBM\Domino
# HCL 默认是 C:\Program Files\HCL\Domino
# ==========================================================
$DominoProgDir = "C:\Program Files\IBM\Domino"
if (!(Test-Path $inputFile)) {
Write-Host "[错误] 找不到 A_NSF.TXT!" -ForegroundColor Red
pause
exit
}
# BAT 文件头:自动切换到 Domino 目录,这是使用 nserver -c 的前提
$batContent = "@echo off`r`n"
$batContent += "cd /d `"$DominoProgDir`"`r`n"
$batContent += "echo =========================================================`r`n"
$batContent += "echo 准备向 A 发送 CL COPY 命令...`r`n"
$batContent += "echo =========================================================`r`n`r`n"
$count = 0
Get-Content $inputFile -Encoding UTF8 | ForEach-Object {
if ($_ -match '\|') {
$parts = $_ -split '\|'
$relPath = $parts[0].Trim().Replace('/', '\')
$sourcePath = $prefix + $relPath
$destPath = "$targetServer!!" + $prefix + $relPath
$cmd = "CL COPY $sourcePath $destPath REPLICA"
# 核心逻辑:使用 nserver -c 发送命令,并附带 1 秒延迟,防止瞬间压垮服务器
$batContent += "nserver -c `"$cmd`"`r`n"
$batContent += "timeout /t 1 /nobreak >nul`r`n"
$count++
}
}
$batContent += "`r`necho.`r`necho [完成] 已发送 $count 条命令,请在 Domino 控制台观察进度。`r`n"
$batContent += "pause`r`n"
# 输出 BAT 文件(必须用 Default/ANSI 编码,否则中文路径在 CMD 里会乱码)
[System.IO.File]::WriteAllText($outputBat, $batContent, [System.Text.Encoding]::GetEncoding("GB2312"))
Write-Host "`n[成功] 已生成可执行脚本: $outputBat" -ForegroundColor Green
Write-Host "[信息] 共包含 $count 个 CL COPY 任务。" -ForegroundColor Green
Write-Host "`n>>> 请将此 BAT 文件拷贝到 A 服务器上,【右键以管理员身份运行】!<<<" -ForegroundColor Yellow
PS E:\temp> .\GEN_COPY.ps1
[成功] 已生成可执行脚本: E:\temp\CL_Copy_NSF.bat[信息] 共包含 5878 个 CL COPY 任务。
请将此 BAT 文件拷贝到 A服务器上,【右键以管理员身份运行】!<<<
E. 执行CL_Copy_NSF.bat,按照暂停1秒的间隔,针对A_NSF.TXT里的NSF文件,依次执行CL COPY命令
PS E:\temp> .\CL_Copy_NSF.bat
准备向 A 发送 CL COPY 命令…
console.log输出样例:
2026/04/26 23:39:58 Replicator added 1,163 document(s) to B/SVR/ACME mail\ac\test1.nsf from mail\ac\test1.nsf