此文是Sql Server實用操作小技巧集合,包括Sql資料庫MDF資料檔案資料庫恢複,安裝時提示有擱置動作、收縮資料庫、壓縮資料庫、轉移資料庫給新使用者以已存在使用者權限、檢查備份組、修複資料庫等。
Sql資料庫MDF資料檔案資料庫恢複
mdf檔案是資料庫中的一個主要資料檔案,它是資料庫的起點,指向資料庫中檔案的其它部分。當電腦出現故障無法備份資料庫時,只能通過SQL命令的方式將.mdf資料檔案附加到當前伺服器,還原原有的資料。開啟查詢分析器,點擊【確定】串連到伺服器(若SA有密碼請輸入密碼),如下:
進入到查詢分析器:
在右面的視窗中輸入檔案恢複命令,格式為:
sp_attach_single_file_db @dbname = 'dbname'
, @physname = 'physical_name'
dbname:即要還原的資料庫名字。
Physname:即物理檔案名稱。
Physical_name:即.mdf檔案路徑。
例如:IT2000.mdf檔案還原至當前伺服器。
點擊如上所示的執行按鈕,則恢複了原來IT2000資料庫,命令列提示:命令已被執行。
SQL資料庫恢複方法
在SQL Server 中由於MS重新設計了資料庫檔案的儲存方式,取消了建立裝置再建資料庫這一繁瑣的過程。新的儲存格式,一個資料庫包括兩個檔案,mdf資料庫檔案和ldf記錄檔。所以我們在重裝機器備份時可以把你要備份的資料庫的這兩個檔案拷貝出來,重新安裝之後再恢複。
在SQL Server中提供了這種恢複方式的預存程序。
1.sp_attach_db [@dbname =] 'dbname',[@filename1 =] 'filename_n'
給系統添加一個資料庫,在dbname指定資料庫名稱,filename_n指定資料庫的檔案和記錄檔。比如我有一個voogiya的庫,停止SQL Server服務備份voogiya_data.mdf,voogiya_log.ldf,啟動SQL server,刪除掉這個庫,然後再把這兩上檔案拷到sql server DATA目錄中,在Query Analyzer中執行如下語句:
EXEC sp_attach_db @dbname = N'voogiya',
@filename1 = N'd:/mssql7/data/voogiya_data.mdf',
@filename2 = N'd:/mssql7/data/voogiya_log.ldf'
就會把這個庫加入到SQL Server Group中.
2.sp_attach_single_file_db [@dbname =] 'dbname',
[@physname =] 'physical_name'
這個命令和上面的功能一樣,在physical_name中只要寫上據庫的物理檔案名稱就可以了,記錄檔SQL server會重建立立。這個預存程序的運行要先執行下面的預存程序:
sp_detach_db @dbname = 'dbname'
同樣以上面的為例:
EXEC sp_detach_db @dbname = 'voogiya'
EXEC sp_attach_single_file_db @dbname = 'voogiya',
@physname = 'd:/mssql7/data/voogiya_data.mdf'
要注意執行以上預存程序的使用者要在sysadmin中.
(一)掛起操作
在安裝Sql或sp補丁的時候系統提示之前有掛起的安裝操作,要求重啟,這裡往往重啟無用,解決辦法:
到HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager
刪除PendingFileRenameOperations
(二)收縮資料庫
|
--重建索引 DBCC REINDEX DBCC INDEXDEFRAG --收縮資料和日誌 DBCC SHRINKDB DBCC SHRINKFILE |
(三)壓縮資料庫
|
dbcc shrinkdatabase(dbname) |
(四)轉移資料庫給新使用者以已存在使用者權限
|
exec sp_change_users_login 'update_one','newname','oldname' go |
(五)檢查備份組
|
RESTORE VERIFYONLY from disk='E:/dvbbs.bak' |
(六)修複資料庫
|
ALTER DATABASE [dvbbs] SET SINGLE_USER GO DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK GO ALTER DATABASE [dvbbs] SET MULTI_USER GO --CHECKDB 有3個參數: --REPAIR_ALLOW_DATA_LOSS |
-- 執行由 REPAIR_REBUILD 完成的所有修複,包括對行和頁進行分配和取消分配以改正分配錯誤、結構行或頁的錯誤,以及刪除已損壞的文字物件。這些修複可能會導致一些資料丟失。修複操作可以在使用者事務下完成以允許使用者復原所做的更改。如果復原修複,則資料庫仍會含有錯誤,應該從備份進行恢複。如果由於所提供修複等級的緣故遺漏某個錯誤的修複,則將遺漏任何取決於該修複的修複。修複完成後,備份資料庫。
--REPAIR_FAST 進行小的、不耗時的修複操作,如修複非叢集索引中的附加鍵。這些修複可以很快完成,並且不會有遺失資料的危險。
--REPAIR_REBUILD 執行由 REPAIR_FAST 完成的所有修複,包括需要較長時間的修複(如重建索引)。執行這些修複時不會有遺失資料的危險。
|
--DBCC CHECKDB('dvbbs') with NO_INFOMSGS,PHYSICAL_ONLY |
SQL SERVER日誌清除的兩種方法
在使用過程中大家經常碰到資料庫日誌非常大的情況,在這裡介紹了兩種處理方法……
方法一
一般情況下,SQL資料庫的收縮並不能很大程度上減小資料庫大小,其主要作用是收縮日誌大小,應當定期進行此操作以免資料庫日誌過大
1、設定資料庫模式為簡單模式:開啟SQL企業管理器,在控制台根目錄中依次點開Microsoft SQL Server-->SQL Server組-->雙擊開啟你的伺服器-->雙擊開啟資料庫目錄-->選擇你的資料庫名稱(如論壇資料庫Forum)-->然後點擊右鍵選擇屬性-->選擇選項-->在故障還原的模式中選擇“簡單”,然後按確定儲存。
2、在當前資料庫上點右鍵,看所有任務中的收縮資料庫,一般裡面的預設設定不用調整,直接點確定。
3、收縮資料庫完成後,建議將您的資料庫屬性重新設定為標準模式,操作方法同第一點,因為日誌在一些異常情況下往往是恢複資料庫的重要依據。
方法二
|
SET NOCOUNT ON DECLARE @LogicalFileName sysname, @MaxMinutes INT, @NewSize INT USE tablename -- 要操作的資料庫名 SELECT @LogicalFileName = 'tablename_log', -- 記錄檔名 @MaxMinutes = 10, -- Limit on time allowed to wrap log. @NewSize = 1 -- 你想設定的記錄檔的大小(M) |
|
-- Setup / initialize DECLARE @OriginalSize int SELECT @OriginalSize = size FROM sysfiles WHERE name = @LogicalFileName SELECT 'Original Size of ' + db_name() + ' LOG is ' + CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' FROM sysfiles WHERE name = @LogicalFileName CREATE TABLE DummyTrans (DummyColumn char (8000) not null) |
|
DECLARE @Counter INT, @StartTime DATETIME, @TruncLog VARCHAR(255) SELECT @StartTime = GETDATE(), @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' DBCC SHRINKFILE (@LogicalFileName, @NewSize) EXEC (@TruncLog) -- Wrap the log if necessary. WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) AND (@OriginalSize * 8 /1024) > @NewSize BEGIN -- Outer loop. SELECT @Counter = 0 WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) BEGIN -- update INSERT DummyTrans VALUES ('Fill Log') DELETE DummyTrans SELECT @Counter = @Counter + 1 END EXEC (@TruncLog) END SELECT 'Final Size of ' + db_name() + ' LOG is ' + CONVERT(VARCHAR(30),size) + ' 8K pages or ' + CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' FROM sysfiles WHERE name = @LogicalFileName DROP TABLE DummyTrans SET NOCOUNT OFF |
刪除資料庫中重複資料的幾個方法資料庫的使用過程中由於程式方面的問題有時候會碰到重複資料,重複資料導致了資料庫部分設定不能正確設定……
方法一
|
declare @max integer,@id integer declare cur_rows cursor local for select 主欄位,count(*) from 表名 group by 主欄位 having count(*) > 1 open cur_rows fetch cur_rows into @id,@max while @@fetch_status=0 begin select @max = @max -1 set rowcount @max delete from 表名 where 主欄位 = @id fetch cur_rows into @id,@max end close cur_rows set rowcount 0 |
方法二
有兩個意義上的重複記錄,一是完全重複的記錄,也即所有欄位均重複的記錄,二是部分關鍵字段重複的記錄,比如Name欄位重複,而其他欄位不一定重複或都重複可以忽略。
1、對於第一種重複,比較容易解決,使用
|
select distinct * from tableName |
就可以得到無重複記錄的結果集。
如果該表需要重複資料刪除的記錄(重複記錄保留1條),可以按以下方法刪除
|
select distinct * into #Tmp from tableName drop table tableName select * into tableName from #Tmp drop table #Tmp |
發生這種重複的原因是表設計不周產生的,增加唯一索引列即可解決。
2、這類重複問題通常要求保留重複記錄中的第一條記錄,操作方法如下。
假設有重複的欄位為Name,Address,要求得到這兩個欄位唯一的結果集
|
select identity(int,1,1) as autoID, * into #Tmp from tableName select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID select * from #Tmp where autoID in(select autoID from #tmp2) |
最後一個select即得到了Name,Address不重複的結果集(但多了一個autoID欄位,實際寫時可以寫在select子句中省去此列)
更改資料庫中表的所屬使用者的兩個方法
大家可能會經常碰到一個Database Backup還原到另外一台機器結果導致所有的表都不能開啟了,原因是建表的時候採用了當時的資料庫使用者……
維護Sql Server中表的索引
在使用和建立資料庫索引中經常會碰到一些問題,在這裡可以採用一些另類的方法解決…
--第一步:查看是否需要維護,查看掃描密度/Scan Density是否為100%
declare @table_id int
set @table_id=object_id('表名')
dbcc showcontig(@table_id)
--第二步:重構表索引
dbcc dbreindex('表名',pk_索引名,100)
--重做第一步,如發現掃描密度/Scan Density還是小於100%則重構表的所有索引
--楊錚:並不一定能達100%。
dbcc dbreindex('表名','',100)
SQL Server補丁安裝常見問題
誰碰到問題就看看咯:)
一、補丁安裝過程中常見問題
如果在安裝補丁的時候遇到如下類似錯誤:
1、安裝過程中出現“以前進行的程式建立了掛起的檔案操作,運行安裝程式前,必須重新啟動”,請按照下面步驟解決:
a、重啟機器,再進行安裝,如果發現還有該錯誤,請按下面步驟
b、在開始->運行中輸入regedit
c、到HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager 位置
d、選擇檔案->倒出,儲存
e、在右邊視窗右擊PendingFileRenameOperations,選擇刪除,然後確認
f、重啟安裝,問題解決
如果還有同樣問題,請檢查其它註冊表中是否有該值存在,如有請刪掉。
2、在安裝SQL Server SP3,有時候會出現:無論用windows認證還是混和認證,都出現密碼錯誤的情況,這時查看臨時目錄下的sqlsp.out,會發現以下描述:
[TCP/IP Sockets]Specified SQL server not found.
[TCP/IP Sockets]ConnectionOpen (Connect()).
其實這是SQL Server SP3的一個小bug,在安裝sp3的時候,沒有監聽tcp/ip連接埠,可以按照以下步驟進行:
1、開啟SQL server客戶器網路工具 + 生產力和伺服器網路工具,確保啟用的協議中包含name pipe,並且位置在第一位。
2、確保[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MSSQLServer/Client/ConnectTo]
"DSQUERY"="DBNETLIB".
如果沒有,請自己建立
3、停止mssql.
4、進行安裝.
這樣就可以進行正確安裝了。
一、備份資料庫 1、開啟SQL企業管理器,在控制台根目錄中依次點開Microsoft SQL Server。2、SQL Server組-->雙擊開啟你的伺服器-->雙擊開啟資料庫目錄。3、選擇你的資料庫名稱(如論壇資料庫Forum)-->然後點上面菜單中的工具-->選擇備份資料庫。4、備份選項選擇完全備份,目的中的備份到如果原來有路徑和名稱則選中名稱點刪除,然後點添加,如果原來沒有路徑和名稱則直接選擇添加,接著指定路徑和檔案名稱,指定後點確定返回備份視窗,接著點確定進行備份。 二、還原資料庫 1、開啟SQL企業管理器,在控制台根目錄中依次點開Microsoft SQL Server。 2、SQL Server組-->雙擊開啟你的伺服器-->點表徵圖欄的建立資料庫表徵圖,建立資料庫的名字自行取。 3、點擊建立好的資料庫名稱(如論壇資料庫Forum)-->然後點上面菜單中的工具-->選擇恢複資料庫。 4、在彈出來的視窗中的還原選項中選擇從裝置-->點選擇裝置-->點添加-->然後選擇你的備份檔案名-->添加後點確定返回,這時候裝置欄應該出現您剛才選擇的Database Backup檔案名稱,備份號預設為1(如果您對同一個檔案做過多次備份,可以點擊備份號旁邊的查看內容,在複選框中選擇最新的一次備份後點確定)-->然後點擊上方常規旁邊的選項按鈕。 5、在出現的視窗中選擇在現有資料庫上強制還原,以及在恢複完成狀態中選擇使資料庫可以繼續運行但無法還原其它交易記錄的選項。在視窗的中間部位的將資料庫檔案還原為這裡要按照你SQL的安裝進行設定(也可以指定自己的目錄),邏輯檔案名稱不需要改動,移至物理檔案名稱要根據你所恢複的機器情況做改動,如您的SQL資料庫裝在D:/Program Files/Microsoft SQL Server/MSSQL/Data,那麼就按照您恢複機器的目錄進行相關改動改動,並且最後的檔案名稱最好改成您當前的資料庫名(如原來是bbs_data.mdf,現在的資料庫是forum,就改成forum_data.mdf),日誌和資料檔案都要按照這樣的方式做相關的改動(日誌的檔案名稱是*_log.ldf結尾的),這裡的恢複目錄您可以自由設定,前提是該目錄必須存在(如您可以指定d:/sqldata/bbs_data.mdf或者d:/sqldata/bbs_log.ldf),否則恢複將報錯 6、修改完成後,點擊下面的確定進行恢複,這時會出現一個進度條,提示恢複的進度,恢複完成後系統會自動提示成功,如中間提示報錯,請記錄下相關的錯誤內容並詢問對SQL操作比較熟悉的人員,一般的錯誤無非是目錄錯誤或者檔案名稱重複或者檔案名稱錯誤或者空間不夠或者資料庫正在使用中的錯誤,資料庫正在使用的錯誤您可以嘗試關閉所有關於SQL視窗然後重新開啟進行恢複操作,如果還提示正在使用的錯誤可以將SQL服務停止然後重起看看,至於上述其它的錯誤一般都能按照錯誤內容做相應改動後即可恢複。三、收縮資料庫 一般情況下,SQL資料庫的收縮並不能很大程度上減小資料庫大小,其主要作用是收縮日誌大小,應當定期進行此操作以免資料庫日誌過大。 1、設定資料庫模式為簡單模式:開啟SQL企業管理器,在控制台根目錄中依次點開Microsoft SQL Server-->SQL Server組-->雙擊開啟你的伺服器-->雙擊開啟資料庫目錄-->選擇你的資料庫名稱(如論壇資料庫Forum)-->然後點擊右鍵選擇屬性-->選擇選項-->在故障還原的模式中選擇“簡單”,然後按確定儲存。 2、在當前資料庫上點右鍵,看所有任務中的收縮資料庫,一般裡面的預設設定不用調整,直接點確定。 3、收縮資料庫完成後,建議將您的資料庫屬性重新設定為標準模式,操作方法同第一點,因為日誌在一些異常情況下往往是恢複資料庫的重要依據。 四、設定每日自動備份資料庫 強烈建議有條件的使用者進行此操作! 1、開啟企業管理器,在控制台根目錄中依次點開Microsoft SQL Server-->SQL Server組-->雙擊開啟你的伺服器。 2、然後點上面菜單中的工具-->選擇資料庫維護計劃器。 3、下一步選擇要進行自動備份的資料-->下一步更新資料最佳化資訊,這裡一般不用做選擇-->下一步檢查資料完整性,也一般不選擇。 4、下一步指定資料庫維護計劃,預設的是1周備份一次,點擊更改選擇每天備份後點確定。 5、下一步指定備份的磁碟目錄,選擇指定目錄,如您可以在D盤建立一個目錄如:d:/databak,然後在這裡選擇使用此目錄,如果您的資料庫比較多最好選擇為每個資料庫建立子目錄,然後選擇刪除早於多少天前的備份,一般設定4-7天,這看您的具體備份要求,備份檔案副檔名一般都是bak就用預設的。 6、下一步指定交易記錄備份計劃,看您的需要做選擇-->下一步要產生的報表,一般不做選擇-->下一步維護計劃記錄,最好用預設的選項-->下一步完成。 7、完成後系統很可能會提示Sql Server Agent服務未啟動,先點確定完成計劃設定,然後找到案頭最右邊狀態列中的SQL綠色表徵圖,雙擊點開,在服務中選擇Sql Server Agent,然後點擊運行箭頭,選上下方的當啟動OS時自動啟動服務。 8、這個時候資料庫計劃已經成功的運行了,他將按照您上面的設定進行自動備份 。 修改計劃: 1、開啟企業管理器,在控制台根目錄中依次點開Microsoft SQL Server-->SQL Server組-->雙擊開啟你的伺服器-->管理-->資料庫維護計劃-->開啟後可看到你設定的計劃,可以進行修改或者刪除操作。 五、資料的轉移(建立資料庫或轉移伺服器) 一般情況下,最好使用備份與還原操作來進行轉移資料,在特殊情況下,可以用匯入匯出的方式進行轉移,這裡介紹的就是匯入匯出方式,匯入匯出方式轉移資料一個作用就是可以在收縮資料庫無效的情況下用來減小(收縮)資料庫的大小,本操作預設為您對SQL的操作有一定的瞭解,如果對其中的部分操作不理解,可以諮詢動網相關人員或者查詢網上資料。 1、將原資料庫的所有表、預存程序匯出成一個SQL檔案,匯出的時候注意在選項中選擇編寫索引指令碼和編寫主鍵、外鍵、預設值和檢查約束指令碼選項。 2、建立資料庫,對建立資料庫執行第一步中所建立的SQL檔案。 3、用SQL的匯入匯出方式,對新資料庫匯入原資料庫中的所有表內容。