Sql Server實用操作小技巧集合

19樓互動空間|4LS` F5s
 
Ld4X7u4nFK r6u0  包括安裝時提示有掛起的操作、收縮數據庫、壓縮數據庫、轉移數據庫給新用戶以已存在用戶權限、檢查備份集、修復數據庫等

  (一)掛起操作

  在安裝Sql或sp補丁的時候系統提示之前有掛起的安裝操作,要求重啟,這里往往重啟無用,解決辦法:19樓互動空間 Q]];_H8l
到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager19樓互動空間+J1W @{:F?A} h
刪除PendingFileRenameOperations

  二)收縮數據庫

--重建索引
&?)PIL-L4S'KF9Cl0DBCC REINDEX19樓互動空間-VQP,sxL mdOe
DBCC INDEXDEFRAG19樓互動空間5eR4Ni&K
--收縮數據和日志
u}l+y&V'{ G%Ed0DBCC SHRINKDB19樓互動空間 x&StK+K8{7q
DBCC SHRINKFILE

  (三)壓縮數據庫

  dbcc shrinkdatabase(dbname)

  四)轉移數據庫給新用戶以已存在用戶權限

exec sp_change_users_login 'update_one','newname','oldname'19樓互動空間3G%V jji0S WdO7M^
go

  (五)檢查備份集

RESTORE VERIFYONLY from disk='E:\dvbbs.bak'

  (六)修復數據庫

ALTER DATABASE [dvbbs] SET SINGLE_USER19樓互動空間%m ~+[D KjFB
GO
0Ma7Q)z6B:q0DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
'l}.v@7QDu"a8A0GO
!l*a)V0J| RH/d0ALTER DATABASE [dvbbs] SET MULTI_USER
Z&^#rZ#gXt|]0GO


p;}qp#Y'l0--CHECKDB 有3個參數:

--REPAIR_ALLOW_DATA_LOSS

-- 執行由 REPAIR_REBUILD 完成的所有修復,包括對行和頁進行分配和取消分配以改正分配錯誤、結構行或頁的錯誤,以及刪除已損壞的文本對象。這些修復可能會導致一些數據丟失。修復操作可以在用戶事務下完成以允許用戶回滾所做的更改。如果回滾修復,則數據庫仍會含有錯誤,應該從備份進行恢復。如果由于所提供修復等級的緣故遺漏某個錯誤的修復,則將遺漏任何取決于該修復的修復。修復完成后,備份數據庫。19樓互動空間Zor:GjZ
--REPAIR_FAST 進行小的、不耗時的修復操作,如修復非聚集索引中的附加鍵。這些修復可以很快完成,并且不會有丟失數據的危險。

--REPAIR_REBUILD 執行由 REPAIR_FAST 完成的所有修復,包括需要較長時間的修復(如重建索引)。執行這些修復時不會有丟失數據的危險。

--DBCC CHECKDB('dvbbs') with NO_INFOMSGS,PHYSICAL_ONLY

SQL SERVER日志清除的兩種方法
L jR;DcN |0在使用過程中大家經常碰到數據庫日志非常大的情況,在這里介紹了兩種處理方法……

方法一

一般情況下,SQL數據庫的收縮并不能很大程度上減小數據庫大小,其主要作用是收縮日志大小,應當定期進行此操作以免數據庫日志過大

1、設置數據庫模式為簡單模式:打開SQL企業管理器,在控制臺根目錄中依次點開Microsoft SQL Server-->SQL Server組-->雙擊打開你的服務器-->雙擊打開數據庫目錄-->選擇你的數據庫名稱(如論壇數據庫Forum)-->然后點擊右鍵選擇屬性-->選擇選項-->在故障還原的模式中選擇“簡單”,然后按確定保存

2、在當前數據庫上點右鍵,看所有任務中的收縮數據庫,一般里面的默認設置不用調整,直接點確定

3、收縮數據庫完成后,建議將您的數據庫屬性重新設置為標準模式,操作方法同第一點,因為日志在一些異常情況下往往是恢復數據庫的重要依據

方法二

SET NOCOUNT ON
J,P4[3Me{.n:D j0DECLARE @LogicalFileName sysname,19樓互動空間+i8tjMO*s7\g
@MaxMinutes INT,
L@2l4DP bch;`0@NewSize INT

19樓互動空間#~Wx/@M tb%H;A"[\
USE tablename -- 要操作的數據庫名
N4jX ^ z,t^/o;v5^0SELECT @LogicalFileName = 'tablename_log', -- 日志文件名19樓互動空間3|Oae~~ a2C
@MaxMinutes = 10, -- Limit on time allowed to wrap log.19樓互動空間8o5IB u#pd:x G
@NewSize = 1 -- 你想設定的日志文件的大小(M)

-- Setup / initialize
4f5dPR(o)Ph'x-JJ0DECLARE @OriginalSize int19樓互動空間G%BUU8^0~5Y`-Ye
SELECT @OriginalSize = size
O,wq+f2WbC0FROM sysfiles
(GX9?Z ^%W$g0WHERE name = @LogicalFileName
/{k};\ _b%q0SELECT 'Original Size of ' + db_name() + ' LOG is ' +19樓互動空間S&u y2qw#l
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +
8}Q @.K1L(w0CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
*K8hXUM"Qy%b0FROM sysfiles19樓互動空間7N%w.wV9q
WHERE name = @LogicalFileName
~9i:d4mX0d0CREATE TABLE DummyTrans19樓互動空間\%b$[ D7v7H{
(DummyColumn char (8000) not null)


]sU-x[ y'@k3\}0DECLARE @Counter INT,
B0[4T;\6cd9Je0@StartTime DATETIME,19樓互動空間$W.a'F^ ETK[l
@TruncLog VARCHAR(255)19樓互動空間+F5\3h!`c
SELECT @StartTime = GETDATE(),
j5[*Z T dWO&[$\0@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'

DBCC SHRINKFILE (@LogicalFileName, @NewSize)19樓互動空間+@s'|'y |+t,d&U
EXEC (@TruncLog)19樓互動空間%C7{R,iP+s NK
-- Wrap the log if necessary.
4s#m @2]W v7c0WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
!}&v_Zp+k)R#G-dV F0AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)19樓互動空間 J1KneZ/hy
AND (@OriginalSize * 8 /1024) > @NewSize
:r {Bc`#V0BEGIN -- Outer loop.
h\ YFU4Bh/D5Xv5y6O2S0SELECT @Counter = 019樓互動空間T*NRf8@
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))19樓互動空間Bj Y1iDTP,P
BEGIN -- update
V B@%K9R/a0INSERT DummyTrans VALUES ('Fill Log')
p)]&` ~C0DELETE DummyTrans
W\-Ns R4LT8h0SELECT @Counter = @Counter + 1
6Msy xWF cf@XC8^_m0END19樓互動空間Yd_ EP,X aW e
EXEC (@TruncLog)
f,ec7[A0{)^0END
#Z5|/|5X9b WY0SELECT 'Final Size of ' + db_name() + ' LOG is ' +19樓互動空間L lQ`%y_
CONVERT(VARCHAR(30),size) + ' 8K pages or ' +
6e"Q\;[!i%xE8bQ0CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
J e%~Kwvr0FROM sysfiles
,Iu&N S @0WHERE name = @LogicalFileName
#C&@#sHB_0DROP TABLE DummyTrans19樓互動空間_,K5yG,S KU
SET NOCOUNT OFF

 

刪除數據庫中重復數據的幾個方法19樓互動空間[e-C7n^b _
數據庫的使用過程中由于程序方面的問題有時候會碰到重復數據,重復數據導致了數據庫部分設置不能正確設置……

方法一

declare @max integer,@id integer19樓互動空間 Y&`*_9G9M H#t
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 119樓互動空間.y6h^6} RM
open cur_rows
i m)q i2L:Z0fetch cur_rows into @id,@max19樓互動空間C!Ik)w GI;~X
while @@fetch_status=019樓互動空間!\J[!x.T!]
begin19樓互動空間f eC G;f N$S-u
select @max = @max -1
1~$zT$Di7ZFTai:\0set rowcount @max
c8k4f Axh8@ zx0delete from 表名 where 主字段 = @id
K)c0k7P gbP!E@0fetch cur_rows into @id,@max
9[Ri4F Q+|~(?I0end
,d3Tk$Cba0close cur_rows
Y:N*B,Rp&zY0set rowcount 0

方法二

有兩個意義上的重復記錄,一是完全重復的記錄,也即所有字段均重復的記錄,二是部分關鍵字段重復的記錄,比如Name字段重復,而其他字段不一定重復或都重復可以忽略。19樓互動空間&Ae J7?M4]spd
1、對于第一種重復,比較容易解決,使用
w qzC jW+w$w0select distinct * from tableName19樓互動空間 zg8G'jb;k]!u
就可以得到無重復記錄的結果集。19樓互動空間O&F*]B*at8X#]]
如果該表需要刪除重復的記錄(重復記錄保留1條),可以按以下方法刪除19樓互動空間#BK9@4T#B
select distinct * into #Tmp from tableName19樓互動空間/q0AEITHy{[p B
drop table tableName
'}6[5jMUi-b*a0select * into tableName from #Tmp
,y~ ]X#f;R0drop table #Tmp19樓互動空間6}@%r?rn"j`~$C
發生這種重復的原因是表設計不周產生的,增加唯一索引列即可解決。

2、這類重復問題通常要求保留重復記錄中的第一條記錄,操作方法如下
h6p%Y9mN2Xr0Ei~0假設有重復的字段為Name,Address,要求得到這兩個字段唯一的結果集
!p{VE4N'd0select identity(int,1,1) as autoID, * into #Tmp from tableName
o9MI*x+w b GI"F-c0select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID19樓互動空間 m(}R] I ~
select * from #Tmp where autoID in(select autoID from #tmp2)
}J\.Alh!q8~J;r0最后一個select即得到了Name,Address不重復的結果集(但多了一個autoID字段,實際寫時可以寫在select子句中省去此列)


$I&k o#l(WRk l0更改數據庫中表的所屬用戶的兩個方法19樓互動空間_H\Q+DH\
大家可能會經常碰到一個數據庫備份還原到另外一臺機器結果導致所有的表都不能打開了,原因是建表的時候采用了當時的數據庫用戶……


5eN;o U { L2EIvD3@0--更改某個表19樓互動空間6O1C_6F+F2S_
exec sp_changeobjectowner 'tablename','dbo'

19樓互動空間 mX p9qq6sZT0F
--存儲更改全部表19樓互動空間5@u|`2X}
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
E1Q5O JK0@OldOwner as NVARCHAR(128),19樓互動空間T-zuq:x;s"Z9q_
@NewOwner as NVARCHAR(128)
'zC9p*e;HB'|0AS

DECLARE @Name as NVARCHAR(128)19樓互動空間#j"j)},Nu-x
DECLARE @Owner as NVARCHAR(128)
D(f` k9S B"`0DECLARE @OwnerName as NVARCHAR(128)

DECLARE curObject CURSOR FOR19樓互動空間$W!qeIB]%L4n"n
select 'Name' = name,19樓互動空間1X EKG&Q7~'K1LP/D
'Owner' = user_name(uid)
#pG+c{ k!ll0from sysobjects19樓互動空間#vS[@+t:Q u#V
where user_name(uid)=@OldOwner
5z Lyc2}E!a2B$XXz!O0order by name

OPEN curObject19樓互動空間|x5a;}6o-Ip
FETCH NEXT FROM curObject INTO @Name, @Owner
3F6Kz^@m0WHILE(@@FETCH_STATUS=0)19樓互動空間4TZG$?_a7c\b8f7z6b
BEGIN19樓互動空間?;n9Dn)b_Ln{xo
if @Owner=@OldOwner19樓互動空間%~Qa*E^ W|
begin19樓互動空間#iK0nMuDwn
set @OwnerName = @OldOwner + '.' + rtrim(@Name)19樓互動空間u\W"|J:eX+M
exec sp_changeobjectowner @OwnerName, @NewOwner19樓互動空間D~ r&d$X x ^ }4`.r
end19樓互動空間 kg X?*TJ|0|8C
-- select @name,@NewOwner,@OldOwner

FETCH NEXT FROM curObject INTO @Name, @Owner19樓互動空間X)J3m9q!^
END

close curObject
d P9H~ H,`4g!J0deallocate curObject


e je.H z"q0GO


jy(mu ]9[+G K0SQL SERVER中直接循環寫入數據19樓互動空間I.s}/}|7P4O
沒什么好說的了,大家自己看,有時候有點用處

declare @i int
Zu/J0h g3Z;_ k0set @i=1
bmb#d2e| _kk0while @i<30
L\ ~td^[cr0begin19樓互動空間d-w2sx&q:Q"[
insert into test (userid) values(@i)19樓互動空間$AfOv~9rc#i.t
set @i=@i+1
^(G Ggfv?.F0end

 

無數據庫日志文件恢復數據庫方法兩則
4`/E \%T/P*l0數據庫日志文件的誤刪或別的原因引起數據庫日志的損壞

方法一

1.新建一個同名的數據庫

2.再停掉sql server(注意不要分離數據庫)

3.用原數據庫的數據文件覆蓋掉這個新建的數據庫

4.再重啟sql server

5.此時打開企業管理器時會出現置疑,先不管,執行下面的語句(注意修改其中的數據庫名)

6.完成后一般就可以訪問數據庫中的數據了,這時,數據庫本身一般還要問題,解決辦法是,利用
7`6C rZc};\"i$M0數據庫的腳本創建一個新的數據庫,并將數據導進去就行了.

USE MASTER19樓互動空間6\@mUmJ+u7K
GO

SP_CONFIGURE 'ALLOW UPDATES',1 RECONFIGURE WITH OVERRIDE
Bm,^mR-z)s~0GO

UPDATE SYSDATABASES SET STATUS =32768 WHERE NAME='置疑的數據庫名'19樓互動空間r4uR Q I{
Go

sp_dboption '置疑的數據庫名', 'single user', 'true'
v3A3\Q6i ]0Go

DBCC CHECKDB('置疑的數據庫名')
b Q%H}I1r6os0Go

update sysdatabases set status =28 where name='置疑的數據庫名'
*v[$LqXck X0Go

sp_configure 'allow updates', 0 reconfigure with override
9@eyZ l3r;Z0Go

sp_dboption '置疑的數據庫名', 'single user', 'false'
q'~(N)o%X4Lx0Go

方法二

事情的起因
E4ta6O(hE0昨天,系統管理員告訴我,我們一個內部應用數據庫所在的磁盤空間不足了。我注意到數據庫事件日志文件XXX_Data.ldf文件已經增長到了3GB,于是我決意縮小這個日志文件。經過收縮數據庫等操作未果后,我犯了一個自進入行業以來的最大最愚蠢的錯誤:竟然誤刪除了這個日志文件!后來我看到所有論及數據庫恢復的文章上都說道:“無論如何都要保證數據庫日志文件存在,它至關重要”,甚至微軟甚至有一篇KB文章講如何只靠日志文件恢復數據庫的。我真是不知道我那時候是怎么想的?!

這下子壞了!這個數據庫連不上了,企業管理器在它的旁邊寫著“(置疑)”。而且最要命的,這個數據庫從來沒有備份了。我唯一找得到的是遷移半年前的另外一個數據庫服務器,應用倒是能用了,但是少了許多記錄、表和存儲過程。真希望這只是一場噩夢!

沒有效果的恢復步驟19樓互動空間yp s*Y} j1t.B?,euV
附加數據庫
{"plv3x%}3h_0_Rambo講過被刪除日志文件中不存在活動日志時,可以這么做來恢復:

1,分離被置疑的數據庫,可以使用sp_detach_db19樓互動空間w9]#xER,M
2,附加數據庫,可以使用sp_attach_single_file_db

但是,很遺憾,執行之后,SQL Server質疑數據文件和日志文件不符,所以無法附加數據庫數據文件。

DTS數據導出
0\&]q^8|c~*z0不行,無法讀取XXX數據庫,DTS Wizard報告說“初始化上下文發生錯誤”。

緊急模式
V;c^1w e `0怡紅公子講過沒有日志用于恢復時,可以這么做:

1,把數據庫設置為emergency mode

2,重新建立一個log文件

3,把SQL Server 重新啟動一下

4,把應用數據庫設置成單用戶模式

5,做DBCC CHECKDB

6,如果沒有什么大問題就可以把數據庫狀態改回去了,記得別忘了把系統表的修改選項關掉

我實踐了一下,把應用數據庫的數據文件移走,重新建立一個同名的數據庫XXX,然后停掉SQL服務,把原來的數據文件再覆蓋回來。之后,按照怡紅公子的步驟走。

但是,也很遺憾,除了第2步之外,其他步驟執行非常成功。可惜,重啟SQL Server之后,這個應用數據庫仍然是置疑!

不過,讓我欣慰的是,這么做之后,倒是能夠Select數據了,讓我大出一口氣。只不過,組件使用數據庫時,報告說:“發生錯誤:-2147467259,未能在數據庫 'XXX' 中運行 BEGIN TRANSACTION,因為該數據庫處于回避恢復模式。”

 

最終成功恢復的全部步驟19樓互動空間m%jL_ s ls`L
設置數據庫為緊急模式19樓互動空間v%x}]6Tr6eT
停掉SQL Server服務;

把應用數據庫的數據文件XXX_Data.mdf移走;

重新建立一個同名的數據庫XXX;

停掉SQL服務;

把原來的數據文件再覆蓋回來;

運行以下語句,把該數據庫設置為緊急模式;

運行“Use Master

Go

sp_configure 'allow updates', 1

reconfigure with override

Go”

執行結果:

DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯系。

已將配置選項 'allow updates' 從 0 改為 1。請運行 RECONFIGURE 語句以安裝。

 

接著運行“update sysdatabases set status = 32768 where name = 'XXX'”

執行結果:

(所影響的行數為 1 行)

 

重啟SQL Server服務;

運行以下語句,把應用數據庫設置為Single User模式;

運行“sp_dboption 'XXX', 'single user', 'true'”

執行結果:

命令已成功完成。

 

ü 做DBCC CHECKDB;

運行“DBCC CHECKDB('XXX')”

執行結果:

'XXX' 的 DBCC 結果。

'sysobjects' 的 DBCC 結果。

對象 'sysobjects' 有 273 行,這些行位于 5 頁中。

'sysindexes' 的 DBCC 結果。

對象 'sysindexes' 有 202 行,這些行位于 7 頁中。

'syscolumns' 的 DBCC 結果。

………

 

ü 運行以下語句把系統表的修改選項關掉;

運行“sp_resetstatus "XXX"

go

sp_configure 'allow updates', 0

reconfigure with override

Go”

執行結果:

在 sysdatabases 中更新數據庫 'XXX' 的條目之前,模式 = 0,狀態 = 28(狀態 suspect_bit = 0),

沒有更新 sysdatabases 中的任何行,因為已正確地重置了模式和狀態。沒有錯誤,未進行任何更改。

DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯系。

已將配置選項 'allow updates' 從 1 改為 0。請運行 RECONFIGURE 語句以安裝。

重新建立另外一個數據庫XXX.Lost;

DTS導出向導
N.l2]7[/v` R'w0運行DTS導出向導;

復制源選擇EmergencyMode的數據庫XXX,導入到XXX.Lost;

選擇“在SQL Server數據庫之間復制對象和數據”,試了多次,好像不行,只是復制過來了所有表結構,但是沒有數據,也沒有視圖和存儲過程,而且DTS向導最后報告復制失敗;

所以最后選擇“從源數據庫復制表和視圖”,但是后來發現,這樣總是只能復制一部分表記錄;

于是選擇“用一條查詢指定要傳輸的數據”,缺哪個表記錄,就導哪個;

視圖和存儲過程是執行SQL語句添加的。

 

維護Sql Server中表的索引19樓互動空間u1g)q5pp!Oo-m;]
在使用和創建數據庫索引中經常會碰到一些問題,在這里可以采用一些另類的方法解決…

--第一步:查看是否需要維護,查看掃描密度/Scan Density是否為100%19樓互動空間(C*c(v5]b|&[O&W9n
declare @table_id int
9?P7v3qC1R w0set @table_id=object_id('表名')19樓互動空間&i ^,p8Xr&J9g/d7HY;_
dbcc showcontig(@table_id)

--第二步:重構表索引
}8k*\lK*V0dbcc dbreindex('表名',pk_索引名,100)

--重做第一步,如發現掃描密度/Scan Density還是小于100%則重構表的所有索引19樓互動空間9D;q0J6C?'a
--楊錚:并不一定能達100%。19樓互動空間vYv&pX
dbcc dbreindex('表名','',100)


B"r)F![j0SQL Server補丁安裝常見問題19樓互動空間#?%xm9KvH8l
誰碰到問題就看看咯:)

一、補丁安裝過程中常見問題


|9_Wp:xF-]*V0如果在安裝補丁的時候遇到如下類似錯誤:

1、安裝過程中出現“以前進行的程序創建了掛起的文件操作,運行安裝程序前,必須重新啟動”,請按照下面步驟解決:

a、重啟機器,再進行安裝,如果發現還有該錯誤,請按下面步驟19樓互動空間#H*Qy-R OB,O)yP
b、在開始->運行中輸入regedit
Py1Jl#i+na0c、到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager 位置19樓互動空間 e BjCK.zN'Zt
d、選擇文件->倒出,保存
0k*Y&yDv-AX0iuo0e、在右邊窗口右擊PendingFileRenameOperations,選擇刪除,然后確認
'u ]f o!z0f、重啟安裝,問題解決

如果還有同樣問題,請檢查其它注冊表中是否有該值存在,如有請刪掉。

19樓互動空間[)Y]4F)^7mC8k
2、在安裝SQL Server SP3,有時候會出現:無論用windows認證還是混和認證,都出現密碼錯誤的情況,這時查看臨時目錄下的sqlsp.out,會發現以下描述:
;eu8XB$d!e)e0[TCP/IP Sockets]Specified SQL server not found.19樓互動空間8h-S\_'RO
[TCP/IP Sockets]ConnectionOpen (Connect()).
z+E*l\ ?7|Ho0其實這是SQL Server SP3的一個小bug,在安裝sp3的時候,沒有監聽tcp/ip端口,可以按照以下步驟進行:

1、打開SQL server客戶器網絡實用工具和服務器網絡工具,確保啟用的協議中包含name pipe,并且位置在第一位.19樓互動空間+fEN)Gp
2、確保[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\ConnectTo]
I&n)ZL?N.Lp X0"DSQUERY"="DBNETLIB".19樓互動空間 x a}c:\
如果沒有,請自己建立
tC4@3e7Z+zR03、停止mssql.19樓互動空間6e"\s} lx%v+Z8N
4、進行安裝.

這樣就可以進行正確安裝了。

二、SQL Server補丁版本的檢查

SQL Server的補丁版本檢查不如Windows 補丁版本檢查直接,一個系統管理員,如果不了解SQL Server版本對應的補丁號,可能也會遇到一點麻煩,因此在這說明一下,通過這樣的辦法判別機器是安全的辦法,不會對系統產生任何影響。19樓互動空間5od&L4|H"|k
1、用Isql或者SQL查詢分析器登錄到SQL Server,如果是用Isql,請在cmd窗口輸入isql -U sa,然后輸入密碼,進入;如果是用SQL查詢分析器,請從程序中啟動,輸入sa和密碼(也可以用windows驗證)。19樓互動空間)Z*Ja5a#~b0{d
2、在ISQL中輸入:
7fKBt*Fl$hN+Bz0Select @@Version;
Yh:VY!j9I-|u7G0go

或者SQL查詢分析器中輸入(其實如果不想輸入,只要打開幫助的關于就可以了:))19樓互動空間)| [A`9t$XEb@
Select @@Version;19樓互動空間6F&A"e$yMT
然后按執行;19樓互動空間!wfSi+a_6T
這時會返回SQL的版本信息,如下:
r7A0U1l&i1@,Sh?0Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 3)
\_L*V c'p0其中的8.00.760就是SQL Server的版本和補丁號。對應關系如下:

8.00.194 -——————SQL Server 2000 RTM19樓互動空間-z/DK-un P4T
8.00.384 -——————(SP1)
NP oWt+\6d)X08.00.534 -——————(SP2)19樓互動空間7Y$A8f qsb5`y
8.00.760 -——————(SP3)

這樣我們就能看到SQL Server的正確版本和補丁號了。

我們也可以用xp_msver看到更詳細的信息

Sql Server數據庫的備份和恢復措施19樓互動空間F"N1p(_o Tt7K
最常用的操作,新手們看看……

一、備份數據庫

1、打開SQL企業管理器,在控制臺根目錄中依次點開Microsoft SQL Server
2FNN&f/M.m+b02、SQL Server組-->雙擊打開你的服務器-->雙擊打開數據庫目錄19樓互動空間(P?)js6v }}*vjs[
3、選擇你的數據庫名稱(如論壇數據庫Forum)-->然后點上面菜單中的工具-->選擇備份數據庫19樓互動空間6_x+us8C$\ s7@![+s:M
4、備份選項選擇完全備份,目的中的備份到如果原來有路徑和名稱則選中名稱點刪除,然后點添加,如果原來沒有路徑和名稱則直接選擇添加,接著指定路徑和文件名,指定后點確定返回備份窗口,接著點確定進行備份

二、還原數據庫

1、打開SQL企業管理器,在控制臺根目錄中依次點開Microsoft SQL Server19樓互動空間xq A Bj)r3u |
2、SQL Server組-->雙擊打開你的服務器-->點圖標欄的新建數據庫圖標,新建數據庫的名字自行取19樓互動空間cwC{"o
3、點擊新建好的數據庫名稱(如論壇數據庫Forum)-->然后點上面菜單中的工具-->選擇恢復數據庫19樓互動空間i9nqA0s r`
4、在彈出來的窗口中的還原選項中選擇從設備-->點選擇設備-->點添加-->然后選擇你的備份文件名-->添加后點確定返回,這時候設備欄應該出現您剛才選擇的數據庫備份文件名,備份號默認為1(如果您對同一個文件做過多次備份,可以點擊備份號旁邊的查看內容,在復選框中選擇最新的一次備份后點確定)-->然后點擊上方常規旁邊的選項按鈕19樓互動空間@%u5B!L#Z d2A$W
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),否則恢復將報錯19樓互動空間2c!?%S4oP7u
6、修改完成后,點擊下面的確定進行恢復,這時會出現一個進度條,提示恢復的進度,恢復完成后系統會自動提示成功,如中間提示報錯,請記錄下相關的錯誤內容并詢問對SQL操作比較熟悉的人員,一般的錯誤無非是目錄錯誤或者文件名重復或者文件名錯誤或者空間不夠或者數據庫正在使用中的錯誤,數據庫正在使用的錯誤您可以嘗試關閉所有關于SQL窗口然后重新打開進行恢復操作,如果還提示正在使用的錯誤可以將SQL服務停止然后重起看看,至于上述其它的錯誤一般都能按照錯誤內容做相應改動后即可恢復

三、收縮數據庫

一般情況下,SQL數據庫的收縮并不能很大程度上減小數據庫大小,其主要作用是收縮日志大小,應當定期進行此操作以免數據庫日志過大
i YZJf$@8J1ez4M01、設置數據庫模式為簡單模式:打開SQL企業管理器,在控制臺根目錄中依次點開Microsoft SQL Server-->SQL Server組-->雙擊打開你的服務器-->雙擊打開數據庫目錄-->選擇你的數據庫名稱(如論壇數據庫Forum)-->然后點擊右鍵選擇屬性-->選擇選項-->在故障還原的模式中選擇“簡單”,然后按確定保存19樓互動空間&p _7e6feV5V
2、在當前數據庫上點右鍵,看所有任務中的收縮數據庫,一般里面的默認設置不用調整,直接點確定
P%IELCD`03、收縮數據庫完成后,建議將您的數據庫屬性重新設置為標準模式,操作方法同第一點,因為日志在一些異常情況下往往是恢復數據庫的重要依據

四、設定每日自動備份數據庫

強烈建議有條件的用戶進行此操作!19樓互動空間S@Q"b"P {3@;n#P
1、打開企業管理器,在控制臺根目錄中依次點開Microsoft SQL Server-->SQL Server組-->雙擊打開你的服務器
.bY?,{ llm0t02、然后點上面菜單中的工具-->選擇數據庫維護計劃器19樓互動空間1Y e:\r`;g/L1F
3、下一步選擇要進行自動備份的數據-->下一步更新數據優化信息,這里一般不用做選擇-->下一步檢查數據完整性,也一般不選擇19樓互動空間dx f'asp0C N]
4、下一步指定數據庫維護計劃,默認的是1周備份一次,點擊更改選擇每天備份后點確定
({"}/Gf${:HA05、下一步指定備份的磁盤目錄,選擇指定目錄,如您可以在D盤新建一個目錄如:d:\databak,然后在這里選擇使用此目錄,如果您的數據庫比較多最好選擇為每個數據庫建立子目錄,然后選擇刪除早于多少天前的備份,一般設定4-7天,這看您的具體備份要求,備份文件擴展名一般都是bak就用默認的19樓互動空間 z J/DN!G'^ @ A
6、下一步指定事務日志備份計劃,看您的需要做選擇-->下一步要生成的報表,一般不做選擇-->下一步維護計劃歷史記錄,最好用默認的選項-->下一步完成
\Cf8e*ZU%o07、完成后系統很可能會提示Sql Server Agent服務未啟動,先點確定完成計劃設定,然后找到桌面最右邊狀態欄中的SQL綠色圖標,雙擊點開,在服務中選擇Sql Server Agent,然后點擊運行箭頭,選上下方的當啟動OS時自動啟動服務
5? a)[TP B08、這個時候數據庫計劃已經成功的運行了,他將按照您上面的設置進行自動備份

修改計劃:
4p#AuE-r|$|01、打開企業管理器,在控制臺根目錄中依次點開Microsoft SQL Server-->SQL Server組-->雙擊打開你的服務器-->管理-->數據庫維護計劃-->打開后可看到你設定的計劃,可以進行修改或者刪除操作

五、數據的轉移(新建數據庫或轉移服務器)

一般情況下,最好使用備份和還原操作來進行轉移數據,在特殊情況下,可以用導入導出的方式進行轉移,這里介紹的就是導入導出方式,導入導出方式轉移數據一個作用就是可以在收縮數據庫無效的情況下用來減小(收縮)數據庫的大小,本操作默認為您對SQL的操作有一定的了解,如果對其中的部分操作不理解,可以咨詢動網相關人員或者查詢網上資料
R'j:rSP4D01、將原數據庫的所有表、存儲過程導出成一個SQL文件,導出的時候注意在選項中選擇編寫索引腳本和編寫主鍵、外鍵、默認值和檢查約束腳本選項
4R6yi:t?02、新建數據庫,對新建數據庫執行第一步中所建立的SQL文件
(c3yyhR#N;t03、用SQL的導入導出方式,對新數據庫導入原數據庫中的所有表內容

利用數據庫日志恢復數據到時間點的操作19樓互動空間#c%c'_Q.~ [4|jz)G
由于不正常的數據丟失,而又不想使用備份數據還原,只要原來有備份且當前日志保存完好,可以采用這個方法試試,說不定可挽回損失……

1,如果誤操作之前存在一個全庫備份(或已有多個差異備份或增量備份),首先要做的事就是進19樓互動空間2[P1dV)U!p'Bs&}X
進行一次日志備份(如果為了不讓日志文件變大而置trunc. log on chkpt.選項為1那你就死翹了)19樓互動空間t5R$Y B.i#EaH
backup log dbName to disk='fileName'
#p.[cA%tK:YS"|!K02,恢復一個全庫備份,注意需要使用with norecovery,如果還有其他差異或增量備份,則逐個恢
;t\\ujA KM0復19樓互動空間C.n.w4@ Y-S2H"?^
restore database dbName from disk='fileName' with norecovery19樓互動空間1vBH2t {1d@f
3,恢復最后一個日志備份即剛做的日志備份,指定恢復時間點到誤操作之前的時刻19樓互動空間y Y'`GS;Vv
restore log dbName from disk='fileName'19樓互動空間%s(YGzdc)f
with stopat='date_time'

以上這些操作都可以在SQL SERVER企業管理器里完成,難度不大。。。

當然,如果誤操作是一些不記日志的操作比如truncate table,select into等操作,那么是無法利19樓互動空間1K-HgUEQ
用上述方法來恢復數據的...

SQL Server2000數據庫文件損壞時如何恢復
G @-^ N*R\0S\/_$i0出現這樣的問題是比較嚴重的了,能否修復只能看你的運氣……

SQL Server2000中,如果數據庫文件(非系統數據庫文件)遇到錯誤的時候,僅適用于非master,msdb的數據庫。

說明如下:

1 建一個測試數據庫test(數據庫類型為完全)19樓互動空間Ay K?y$KJ4q6C
2 建一個表,插入點記錄
} TS? A7Jm4X\C0create table a(c1 varchar(2))19樓互動空間5\&`0TQ2qvg
go19樓互動空間*xC4i U S-v[@Dg
insert into a values('aa')
r*B ~(mr4T~6O0go
E,J#C H4h0insert into a values('bb')19樓互動空間1z&t1_Ue cz
go
-{S!F Z8R2p}(i8j2h03 作完全備份,到文件test_1.bak19樓互動空間} xI3qx$L.W!i9G-c$yE
4 在作一點修改
9M1C2j`MEWU _6u/I0insert into a values('cc')
9O bL8l2?8u7u/Z0go19樓互動空間%tbCO"D4bN1v"r$B4_
create table b(c1 int)
Hz"Zr+_1AT(g.}0go19樓互動空間Z0}B0`}"f
insert into b values(1)
&L!a X6^t~+`z0go
M$ex,k P AL%G4b0insert into b values(2)19樓互動空間8uH0[ Mq'{m_7T0r1U
go
x_8l `"x05 shutdown 數據庫服務器
,y#T\0x,^ yrU.I Ct06 用ultraedit編輯數據庫文件test_data.mdf,隨便修改點字節內容,相當于數據庫遭到致命的損壞。19樓互動空間6c#fMSEy0u0G
7 啟動數據庫,并且運行企業管理器,點開數據庫,看到test變成灰色,而且顯示置疑。
h |0U SBW_08 運行isql -SLocalhost -Usa -P
ws B8m]'nAP01> backup log test TO DISK='D:Program FilesMicrosoft SQL ServerMSSQLBACKUP
+Ax ]L z#X"t%J0est_2.bak' WITH NO_TRUNCATE19樓互動空間V!je*M5co8yTMWSa
2>go19樓互動空間D ~"c3z z'm2T
已處理 2 頁,這些頁屬于數據庫 'test' 的文件 'TEST_Log'(位于文件 1 上)。19樓互動空間 V a8[A6vY
BACKUP LOG 操作成功地處理了 2 頁,花費了 0.111 秒(0.087 MB/秒)。

9 進行恢復最老的完全備份
1e CaD$gX&w01> RESTORE DATABASE test FROM DISK='D:Program FilesMicrosoft SQL ServerMSSQL19樓互動空間HX Z.ow.o
BACKUP est_1.bak' WITH NORECOVERY
(G7M9K.Y1{MsT02> go
,L.x\RI"A.r0已處理 96 頁,這些頁屬于數據庫 'test' 的文件 'TEST_Data'(位于文件 1 上)。19樓互動空間v2i g} [
已處理 1 頁,這些頁屬于數據庫 'test' 的文件 'TEST_Log'(位于文件 1 上)。
|u_;r:h2O_0RESTORE DATABASE 操作成功地處理了 97 頁,花費了 0.107 秒(7.368 MB/秒)。

10 恢復最近的日志
L8};Z'TZ9{"\4c3\01> RESTORE LOG test FROM DISK='D:Program FilesMicrosoft SQL ServerMSSQLBACKU
u|4U:_!H)bp S.e*_ n ?0P est_2.bak' WITH RECOVERY
,i#l0Jf(z'f0y02> go
GO9{4nwdh0已處理 2 頁,這些頁屬于數據庫 'test' 的文件 'TEST_Log'(位于文件 1 上)。
#V I8F2ht'n9bxo/L9L0RESTORE LOG 操作成功地處理了 2 頁,花費了 0.056 秒(0.173 MB/秒)。

存儲過程編寫經驗和優化措施
MDj#ah qJ b0f[0經驗之談,看看……

一、適合讀者對象:數據庫開發程序員,數據庫的數據量很多,涉及到對SP(存儲過程)的優化的項目開發人員,對數據庫有濃厚興趣的人。  

  二、介紹:在數據庫的開發過程中,經常會遇到復雜的業務邏輯和對數據庫的操作,這個時候就會用SP來封裝數據庫操作。如果項目的SP較多,書寫又沒有一定的規范,將會影響以后的系統維護困難和大SP邏輯的難以理解,另外如果數據庫的數據量大或者項目對SP的性能要求很,就會遇到優化的問題,否則速度有可能很慢,經過親身經驗,一個經過優化過的SP要比一個性能差的SP的效率甚至高幾百倍。  

  三、內容:  

  1、開發人員如果用到其他庫的Table或View,務必在當前庫中建立View來實現跨庫操作,最好不要直接使用“databse.dbo.table_name”,因為sp_depends不能顯示出該SP所使用的跨庫table或view,不方便校驗。  

  2、開發人員在提交SP前,必須已經使用set showplan on分析過查詢計劃,做過自身的查詢優化檢查。  

  3、高程序運行效率,優化應用程序,在SP編寫過程中應該注意以下幾點:   

  a)SQL的使用規范:

   i. 盡量避免大事務操作,慎用holdlock子句,提高系統并發能力。

   ii. 盡量避免反復訪問同一張或幾張表,尤其是數據量較大的表,可以考慮先根據條件提取數據到臨時表中,然后再做連接。

   iii. 盡量避免使用游標,因為游標的效率較差,如果游標操作的數據超過1萬行,那么就應該改寫;如果使用了游標,就要盡量避免在游標循環中再進行表連接的操作。

   iv. 注意where字句寫法,必須考慮語句順序,應該根據索引順序、范圍大小來確定條件子句的前后順序,盡可能的讓字段順序與索引順序相一致,范圍從大到小。

   v. 不要在where子句中的“=”左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。

   vi. 盡量使用exists代替select count(1)來判斷是否存在記錄,count函數只有在統計表中所有行數時使用,而且count(1)比count(*)更有效率。

   vii. 盡量使用“>=”,不要使用“>”。

   viii. 注意一些or子句和union子句之間的替換

   ix. 注意表之間連接的數據類型,避免不同類型數據之間的連接。

   x. 注意存儲過程中參數和數據類型的關系。

   xi. 注意insert、update操作的數據量,防止與其他應用沖突。如果數據量超過200個數據頁面(400k),那么系統將會進行鎖升級,頁級鎖會升級成表級鎖。   

  b)索引的使用規范:

   i. 索引的創建要與應用結合考慮,建議大的OLTP表不要超過6個索引。

   ii. 盡可能的使用索引字段作為查詢條件,尤其是聚簇索引,必要時可以通過index index_name來強制指定索引

   iii. 避免對大表查詢時進行table scan,必要時考慮新建索引。

   iv. 在使用索引字段作為條件時,如果該索引是聯合索引,那么必須使用到該索引中的第一個字段作為條件時才能保證系統使用該索引,否則該索引將不會被使用。

   v. 要注意索引的維護,周期性重建索引,重新編譯存儲過程。  

  c)tempdb的使用規范:

   i. 盡量避免使用distinct、order by、group by、having、join、cumpute,因為這些語句會加重tempdb的負擔。

   ii. 避免頻繁創建和刪除臨時表,減少系統表資源的消耗。

   iii. 在新建臨時表時,如果一次性插入數據量很大,那么可以使用select into代替create table,避免log,提高速度;如果數據量不大,為了緩和系統表的資源,建議先create table,然后insert。

   iv. 如果臨時表的數據量較大,需要建立索引,那么應該將創建臨時表和建立索引的過程放在單獨一個子存儲過程中,這樣才能保證系統能夠很好的使用到該臨時表的索引。

    v. 如果使用到了臨時表,在存儲過程的最后務必將所有的臨時表顯式刪除,先truncate table,然后drop table,這樣可以避免系統表的較長時間鎖定。

    vi. 慎用大的臨時表與其他大表的連接查詢和修改,減低系統表負擔,因為這種操作會在一條語句中多次使用tempdb的系統表。  

  d)合理的算法使用:   

  根據上面已提到的SQL優化技術和ASE Tuning手冊中的SQL優化內容,結合實際應用,采用多種算法進行比較,以獲得消耗資源最少、效率最高的方法。具體可用ASE調優命令:set statistics io on, set statistics time on , set showplan on 等。