萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

SQL Server 2005 錯誤 2812「找不到存儲過程」:復制殘留系統表清理實戰

故障場景

  • 數據庫 DB1 從服務器 A 遷移至 B(直接複製 MDF/LDF 附加)
  • 遷移前未刪除發布/訂閱配置
  • 附加後業務正常,但重新配置發布報錯:Error 2812: Could not find stored procedure

根因分析

附加數據庫會攜帶**復制相關系統表**(12 表 + 1 視圖),但服務器級復制元數據(sysservers、分發庫等)不存在,導致系統存儲過程調用失敗。

殘留系統表清單

系統表/視圖有數據復制必需
MSpeer_lsns否否
MSpeer_request否否
MSpeer_response否否
Mspub_identity_range否否
Sysarticlecolumns是是
Sysarticles是是
Sysarticlesupdates否是
syspublications是是
Sysreplservers是是
Sysschemaarticles否是
Syssubscriptions是是
systranschemas否否
sysextendedarticlesview (視圖)否是

核心問題表:sysreplservers

SELECT * FROM sysreplservers;
-- 結果:
-- Srvname        Srvid
-- OLD_SERVER     0

此表記錄舊發布服務器名稱,導致新建發布時系統存儲過程邏輯混亂。

修復步驟(保留業務數據)

  1. 刪除 sysreplservers 記錄
    DELETE FROM sysreplservers;
    
  2. 隨意創建一個發布再刪除(觸發系統表重建清理)
    -- SSMS 或 T-SQL 創建任意發布
    -- 然後刪除該發布
    
  3. 驗證清理結果
    -- 再次查看系統表,應僅剩結構無數據
    SELECT * FROM sysarticles;  -- 空
    SELECT * FROM syspublications; -- 空
    

完整清理腳本(謹慎使用,備份後執行)

USE DB1;
GO

-- 1. 刪除復制相關系統表數據(保留表結構)
DELETE FROM syssubscriptions;
DELETE FROM sysarticles;
DELETE FROM sysarticlecolumns;
DELETE FROM syspublications;
DELETE FROM sysreplservers;
DELETE FROM Sysschemaarticles;
DELETE FROM Sysarticlesupdates;
DELETE FROM Mspub_identity_range;
DELETE FROM MSpeer_lsns;
DELETE FROM MSpeer_request;
DELETE FROM MSpeer_response;
DELETE FROM systranschemas;

-- 2. 刪除視圖(可選)
-- DROP VIEW sysextendedarticlesview;

-- 3. 刪除復制相關觸發器(如有)
SELECT 'DROP TRIGGER ' + name + ';' 
FROM sysobjects 
WHERE type = 'TR' AND name LIKE 'MSsync%' OR name LIKE 'sp_MS%';
-- 複製輸出的語句執行

預防最佳實踐

  1. 遷移前**必須**在源庫執行:sp_removedbreplication 'DB1' 徹底移除復制標記
  2. 或:先刪除訂閱 → 刪除發布 → 禁用發布/分發 → 再備份/附加
  3. 使用 BACKUP/RESTORE 替代附加,可通過 KEEP_REPLICATION 選項控制

驗證修復

-- 重新創建發布應無報錯
-- 檢查錯誤日誌無 2812 相關條目
copyright © 萬盛學電腦網 all rights reserved