一、問(wèn)題本質(zhì)
“列名 'id' 不明確”出現(xiàn)在 sp_droppublication 內(nèi)部,
是 SQL Server 2016-2022 的 產(chǎn)品缺陷(Bug 編號(hào) 50031436)。
觸發(fā)條件:
發(fā)布庫(kù)里曾啟用/切換過(guò) Peer-to-Peer 復(fù)制;
系統(tǒng)表 MSpeer_lsns / MSpeer_request / MSpeer_response
里存在行;
清理存儲(chǔ)過(guò)程 sp_MScleanup_peer_metadata
寫出二義性 JOIN … id
,導(dǎo)致 209 號(hào)錯(cuò)誤。
→ 因此 標(biāo)準(zhǔn)刪除命令被中斷,發(fā)布刪不掉。
二、通用“安全強(qiáng)拆”步驟(適用于所有場(chǎng)景)
步驟 | 目的 | 命令或操作 |
---|
① | 可回滾備份 | BACKUP DATABASE [pubDB] TO DISK='…\pubDB_preDrop.bak' |
② | 關(guān)閉 P2P 開(kāi)關(guān)(若曾打開(kāi)) | EXEC sp_changepublication @publication=N'PubName',@property=N'peer_to_peer',@value=N'false'; |
③ | 手工清空對(duì)等元數(shù)據(jù) | DELETE FROM dbo.MSpeer_lsns; DELETE FROM dbo.MSpeer_request; DELETE FROM dbo.MSpeer_response; |
④ | 再次標(biāo)準(zhǔn)刪除 | EXEC sp_droppublication @publication=N'PubName'; |
⑤ | 仍失敗 → 元數(shù)據(jù)級(jí)強(qiáng)拆 | EXEC sp_removedbreplication @dbname=N'pubDB',@type=N'tran'; |
⑥ | 驗(yàn)證 | SELECT name FROM syspublications WHERE name=N'PubName'; 應(yīng) 0 行 |
三、各場(chǎng)景速查表
事務(wù) / 快照復(fù)制
直接走 ①→③→④;失敗再走 ⑤。
合并復(fù)制
把第 ⑤ 步 @type
換成 'merge'
即可。
兩種發(fā)布共存
一次 @type='both'
全部清掉。
發(fā)布庫(kù)和分發(fā)庫(kù)分離
在 發(fā)布庫(kù) 上執(zhí)行 ③④⑤;
在 分發(fā)庫(kù) 上如已無(wú)其他發(fā)布,可 sp_dropdistributor @no_checks=1
整庫(kù)拆掉。
該文章在 2025/9/9 16:45:17 編輯過(guò)