註冊表殘留 PendingFileRenameOperations 導致安裝程式誤判需重啟。
-- 位置:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
-- 動作:刪除 PendingFileRenameOperations 值,然後重新執行安裝
SP3 安裝時若未啟用 Named Pipes 且順序不在第一,會報 Specified SQL Server not found。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\ConnectTo 確認 DSQUERY=DBNETLIB。
DBCC REINDEX ('TableName', 'PK_Index', 90); -- 重建指定索引,填充因子 90%
DBCC INDEXDEFRAG ('DBName', 'TableName', 'PK_Index'); -- 線上整理 (較輕量)
-- SQL 2005+ 建議使用 ALTER INDEX ... REBUILD / REORGANIZE
-- 收縮整個資料庫 (含資料與記錄)
DBCC SHRINKDATABASE (DBName);
-- 僅收縮記錄檔 (指定目標大小 MB)
DBCC SHRINKFILE (N'DBName_Log', 100);
警告:頻繁收縮會產生大量碎片,導致效能下降。建議僅在大量刪除資料或異常增長後單次執行,並配合索引重建。
ALTER DATABASE [DBName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- 允許資料遺失的修復 (最後手段)
DBCC CHECKDB ('DBName', REPAIR_ALLOW_DATA_LOSS) WITH TABLOCK;
GO
ALTER DATABASE [DBName] SET MULTI_USER;
GO
REPAIR_ALLOW_DATA_LOSS 可能刪除損壞頁面導致資料遺失,務必先備份。REPAIR_REBUILD 無資料遺失風險但修復能力較弱。
RESTORE VERIFYONLY FROM DISK = 'E:\Backup\DB.bak';
USE [TargetDB];
DECLARE @LogicalName SYSNAME = 'TargetDB_Log', @TargetSizeMB INT = 100, @MaxMin INT = 10;
DECLARE @OrigSize INT = (SELECT size FROM sys.database_files WHERE name = @LogicalName);
CREATE TABLE #Dummy (col CHAR(8000) NOT NULL);
DECLARE @sql NVARCHAR(MAX) = N'BACKUP LOG [' + DB_NAME() + '] WITH TRUNCATE_ONLY'; -- 簡單模式下有效
-- 完整模式下請改為:BACKUP LOG [DB] TO DISK='NUL:' (測試用) 或正常備份後 SHRINKFILE
DBCC SHRINKFILE (@LogicalName, @TargetSizeMB);
-- 迴圈填充記錄強制截斷 (舊版本技巧,新版本建議直接正規備份)
-- ... 略 ...
DROP TABLE #Dummy;
現代最佳實踐:完整模式下,執行 BACKUP LOG [DB] TO DISK='Path\Log.trn' 後緊接 DBCC SHRINKFILE (LogFile, TargetSize)。
SELECT DISTINCT * INTO #Tmp FROM SourceTable;
TRUNCATE TABLE SourceTable;
INSERT INTO SourceTable SELECT * FROM #Tmp;
DROP TABLE #Tmp;
-- 根治:加上 PRIMARY KEY 或 UNIQUE INDEX
SELECT IDENTITY(INT,1,1) AS RowID, * INTO #Tmp FROM SourceTable;
SELECT MIN(RowID) AS RowID INTO #Keep FROM #Tmp GROUP BY Name, Address;
SELECT * FROM #Tmp WHERE RowID IN (SELECT RowID FROM #Keep);
-- 單一資料表
EXEC sp_changeobjectowner 'OldUser.TableName', 'dbo';
-- 批次變更存儲過程
CREATE PROCEDURE dbo.BatchChangeOwner @OldOwner NVARCHAR(128), @NewOwner NVARCHAR(128)
AS
BEGIN
DECLARE @Name NVARCHAR(128), @Owner NVARCHAR(128), @FullName NVARCHAR(256);
DECLARE cur CURSOR FOR SELECT name, USER_NAME(uid) FROM sysobjects WHERE USER_NAME(uid) = @OldOwner;
OPEN cur; FETCH NEXT FROM cur INTO @Name, @Owner;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @FullName = @OldOwner + '.' + @Name;
EXEC sp_changeobjectowner @FullName, @NewOwner;
FETCH NEXT FROM cur INTO @Name, @Owner;
END
CLOSE cur; DEALLOCATE cur;
END
核心原理:利用 EMERGENCY MODE + DBCC CHECKDB (REPAIR_ALLOW_DATA_LOSS) 重建記錄檔,再匯出資料。
USE MASTER;
GO
EXEC sp_configure 'allow updates', 1; RECONFIGURE WITH OVERRIDE;
GO
UPDATE sysdatabases SET status = 32768 WHERE name = 'SuspectDB'; -- 設為 Emergency Mode
GO
EXEC sp_dboption 'SuspectDB', 'single user', 'true';
GO
DBCC CHECKDB ('SuspectDB', REPAIR_ALLOW_DATA_LOSS); -- 重建 Log
GO
EXEC sp_resetstatus 'SuspectDB'; -- 重置狀態
GO
EXEC sp_configure 'allow updates', 0; RECONFIGURE WITH OVERRIDE;
GO
EXEC sp_dboption 'SuspectDB', 'single user', 'false';
GO
修復成功後,資料庫可讀但不可寫 (Bypass Recovery)。需建立新資料庫,用 DTS/BCP 匯出資料、腳本建立物件,完成遷移。
SELECT @@VERSION;
-- 輸出範例: Microsoft SQL Server 2008 (SP3) - 10.0.5500 ...
-- 版本對照: 8.00.194 (RTM), 8.00.760 (SP3), 9.00.4035 (2005 SP3), 10.0.1600 (2008 RTM)
DB.dbo.Table,方便 sp_depends 追蹤。HOLDLOCK,縮短鎖持有時間。EXISTS。REBUILD + UPDATE STATISTICS。SELECT INTO;用畢 TRUNCATE -> DROP。