跳到主要内容

说一下用户的需求:

原先Windows 2012的Domino 12要迁移到Windows 2022上面

服务要保持运行,不能停机

ODS版本要维持52,因为有部分客户端还在使用Notes 9

解决方案:

  1. 通过AdminP创建副本,连接文档定时复制同步,
    这种方法执行效率很低,一晚上过去才做了600个NSF。
  2. 通过集群的副本对齐功能,设置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]
# ==========================================================
# 【请直接在这里修改 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
}
@echo off
echo 正在启动扫描脚本...
powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0Step1_Scan.ps1"
echo.
pause

A_NSF.TXT内容示例:

ac\test1.nsf|348078080

通过跑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服务器上,【右键以管理员身份运行】!<<<

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

留下回复