SQL語句大全[轉(zhuǎn)]
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
1.按姓氏筆畫排序:
Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as 2.數(shù)據(jù)庫加密: select encrypt('原始密碼') select pwdencrypt('原始密碼') select pwdcompare('原始密碼','加密后密碼') = 1--相同;否則不相同 encrypt('原始密碼') select pwdencrypt('原始密碼') select pwdcompare('原始密碼','加密后密碼') = 1--相同;否則不相同 3.取回表中字段: declare @list varchar(1000),@sql nvarchar(1000) select @list=@list+','+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name='表A' set @sql='select '+right(@list,len(@list)-1)+' from 表A' exec (@sql) 4.查看硬盤分區(qū): EXEC master..xp_fixeddrives 5.比較A,B表是否相等: if (select checksum_agg(binary_checksum(*)) from A) = (select checksum_agg(binary_checksum(*)) from B) print '相等' else print '不相等' 6.殺掉所有的事件探察器進(jìn)程: DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid) FROM master.dbo.sysprocesses WHERE program_name IN('SQL profiler',N'SQL 事件探查器') EXEC sp_msforeach_worker '?' 7.記錄搜索: 開頭到N條記錄 Select Top N * From 表 ------------------------------- N到M條記錄(要有主索引ID) Select Top M-N * From 表 Where ID in (Select Top M ID From 表) Order by ID Desc ---------------------------------- N到結(jié)尾記錄 Select Top N * From 表 Order by ID Desc 8.如何修改數(shù)據(jù)庫的名稱: sp_renamedb 'old_name', 'new_name' 9:獲取當(dāng)前數(shù)據(jù)庫中的所有用戶表 select Name from sysobjects where xtype='u' and status>=0 10:獲取某一個(gè)表的所有字段 select name from syscolumns where id=object_id('表名') 11:查看與某一個(gè)表相關(guān)的視圖、存儲(chǔ)過程、函數(shù) select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '%表名%' 12:查看當(dāng)前數(shù)據(jù)庫中所有存儲(chǔ)過程 select name as 存儲(chǔ)過程名稱 from sysobjects where xtype='P' 13:查詢用戶創(chuàng)建的所有數(shù)據(jù)庫 select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa') 或者 select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01 14:查詢某一個(gè)表的字段和數(shù)據(jù)類型 select column_name,data_type from information_schema.columns where table_name = '表名' [n].[標(biāo)題]: Select * From TableName Order By CustomerName [n].[標(biāo)題]: Select * From TableName Order By CustomerName ------------------------------ 1. 查看數(shù)據(jù)庫的版本 select @@version 2. 查看數(shù)據(jù)庫所在機(jī)器操作系統(tǒng)參數(shù) exec master..xp_msver 3. 查看數(shù)據(jù)庫啟動(dòng)的參數(shù) sp_configure 4. 查看數(shù)據(jù)庫啟動(dòng)時(shí)間 select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1 查看數(shù)據(jù)庫服務(wù)器名和實(shí)例名 print 'Server Name...............: ' + convert(varchar(30),@@SERVERNAME) print 'Instance..................: ' + convert(varchar(30),@@SERVICENAME) 5. 查看所有數(shù)據(jù)庫名稱及大小 sp_helpdb 重命名數(shù)據(jù)庫用的SQL sp_renamedb 'old_dbname', 'new_dbname' 6. 查看所有數(shù)據(jù)庫用戶登錄信息 sp_helplogins 查看所有數(shù)據(jù)庫用戶所屬的角色信息 sp_helpsrvrolemember 修復(fù)遷移服務(wù)器時(shí)孤立用戶時(shí),可以用的fix_orphan_user腳本或者LoneUser過程 更改某個(gè)數(shù)據(jù)對象的用戶屬主 sp_changeobjectowner [@objectname =] 'object', [@newowner =] 'owner' 注意: 更改對象名的任一部分都可能破壞腳本和存儲(chǔ)過程。 把一臺(tái)服務(wù)器上的數(shù)據(jù)庫用戶登錄信息備份出來可以用add_login_to_aserver腳本 7. 查看鏈接服務(wù)器 sp_helplinkedsrvlogin 查看遠(yuǎn)端數(shù)據(jù)庫用戶登錄信息 sp_helpremotelogin 8.查看某數(shù)據(jù)庫下某個(gè)數(shù)據(jù)對象的大小 sp_spaceused @objname 還可以用sp_toptables過程看最大的N(默認(rèn)為50)個(gè)表 查看某數(shù)據(jù)庫下某個(gè)數(shù)據(jù)對象的索引信息 sp_helpindex @objname 還可以用SP_NChelpindex過程查看更詳細(xì)的索引情況 SP_NChelpindex @objname clustered索引是把記錄按物理順序排列的,索引占的空間比較少。 對鍵值DML操作十分頻繁的表我建議用非clustered索引和約束,fillfactor參數(shù)都用默認(rèn)值。 查看某數(shù)據(jù)庫下某個(gè)數(shù)據(jù)對象的的約束信息 sp_helpconstraint @objname 9.查看數(shù)據(jù)庫里所有的存儲(chǔ)過程和函數(shù) use @database_name sp_stored_procedures 查看存儲(chǔ)過程和函數(shù)的源代碼 sp_helptext [email=]'@procedure_name'[/email] 查看包含某個(gè)字符串@str的數(shù)據(jù)對象名稱 select distinct object_name(id) from syscomments where text like [email=]'%@str%'[/email] 創(chuàng)建加密的存儲(chǔ)過程或函數(shù)在AS前面加WITH ENCRYPTION參數(shù) 解密加密過的存儲(chǔ)過程和函數(shù)可以用sp_decrypt過程 10.查看數(shù)據(jù)庫里用戶和進(jìn)程的信息 sp_who 查看SQL Server數(shù)據(jù)庫里的活動(dòng)用戶和進(jìn)程的信息 sp_who 'active' 查看SQL Server數(shù)據(jù)庫里的鎖的情況 sp_lock 進(jìn)程號(hào)1--50是SQL Server系統(tǒng)內(nèi)部用的,進(jìn)程號(hào)大于50的才是用戶的連接進(jìn)程. spid是進(jìn)程編號(hào),dbid是數(shù)據(jù)庫編號(hào),objid是數(shù)據(jù)對象編號(hào) 查看進(jìn)程正在執(zhí)行的SQL語句 dbcc inputbuffer () 推薦大家用經(jīng)過改進(jìn)后的sp_who3過程可以直接看到進(jìn)程運(yùn)行的SQL語句 sp_who3 檢查死鎖用sp_who_lock過程 sp_who_lock 11.收縮數(shù)據(jù)庫日志文件的方法 收縮簡單恢復(fù)模式數(shù)據(jù)庫日志,收縮后@database_name_log的大小單位為M backup log @database_name with no_log dbcc shrinkfile (@database_name_log, 5) 12.分析SQL Server SQL 語句的方法: set statistics time {on | off} set statistics io {on | off} 圖形方式顯示查詢執(zhí)行計(jì)劃 在查詢分析器->查詢->顯示估計(jì)的評估計(jì)劃(D)-Ctrl-L 或者點(diǎn)擊工具欄里的圖形 文本方式顯示查詢執(zhí)行計(jì)劃 set showplan_all {on | off} set showplan_text { on | off } set statistics profile { on | off } 13.出現(xiàn)不一致錯(cuò)誤時(shí),NT事件查看器里出3624號(hào)錯(cuò)誤,修復(fù)數(shù)據(jù)庫的方法 先注釋掉應(yīng)用程序里引用的出現(xiàn)不一致性錯(cuò)誤的表,然后在備份或其它機(jī)器上先恢復(fù)然后做修復(fù)操作 alter database [@error_database_name] set single_user 修復(fù)出現(xiàn)不一致錯(cuò)誤的表 dbcc checktable([email=]'@error_table_name',repair_allow_data_loss[/email]) 或者可惜選擇修復(fù)出現(xiàn)不一致錯(cuò)誤的小型數(shù)據(jù)庫名 dbcc checkdb([email=]'@error_database_name',repair_allow_data_loss[/email]) alter database [@error_database_name] set multi_user CHECKDB 有3個(gè)參數(shù): repair_allow_data_loss 包括對行和頁進(jìn)行分配和取消分配以改正分配錯(cuò)誤、結(jié)構(gòu)行或頁的錯(cuò)誤, 以及刪除已損壞的文本對象,這些修復(fù)可能會(huì)導(dǎo)致一些數(shù)據(jù)丟失。 修復(fù)操作可以在用戶事務(wù)下完成以允許用戶回滾所做的更改。 如果回滾修復(fù),則數(shù)據(jù)庫仍會(huì)含有錯(cuò)誤,應(yīng)該從備份進(jìn)行恢復(fù)。 如果由于所提供修復(fù)等級的緣故遺漏某個(gè)錯(cuò)誤的修復(fù),則將遺漏任何取決于該修復(fù)的修復(fù)。 修復(fù)完成后,請備份數(shù)據(jù)庫。 repair_fast 進(jìn)行小的、不耗時(shí)的修復(fù)操作,如修復(fù)非聚集索引中的附加鍵。 這些修復(fù)可以很快完成,并且不會(huì)有丟失數(shù)據(jù)的危險(xiǎn)。 repair_rebuild 執(zhí)行由 repair_fast 完成的所有修復(fù),包括需要較長時(shí)間的修復(fù)(如重建索引)。 執(zhí)行這些修復(fù)時(shí)不會(huì)有丟失數(shù)據(jù)的危險(xiǎn)。 ------------------------- Sql Server實(shí)用操作小技巧集合 包括安裝時(shí)提示有掛起的操作、收縮數(shù)據(jù)庫、壓縮數(shù)據(jù)庫、轉(zhuǎn)移數(shù)據(jù)庫給新用戶以已存在用戶權(quán)限、檢查備份集、修復(fù)數(shù)據(jù)庫等 (一)掛起操作 在安裝Sql或sp補(bǔ)丁的時(shí)候系統(tǒng)提示之前有掛起的安裝操作,要求重啟,這里往往重啟無用,解決辦法: 到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession Manager 刪除PendingFileRenameOperations (二)收縮數(shù)據(jù)庫 --重建索引 DBCC REINDEX DBCC INDEXDEFRAG --收縮數(shù)據(jù)和日志 DBCC SHRINKDB DBCC SHRINKFILE (三)壓縮數(shù)據(jù)庫 dbcc shrinkdatabase(dbname) (四)轉(zhuǎn)移數(shù)據(jù)庫給新用戶以已存在用戶權(quán)限 exec sp_change_users_login update_one,newname,oldname go (五)檢查備份集 RESTORE VERIFYONLY from disk=Evbbs.bak (六)修復(fù)數(shù)據(jù)庫 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個(gè)參數(shù): --REPAIR_ALLOW_DATA_LOSS -- 執(zhí)行由 REPAIR_REBUILD 完成的所有修復(fù),包括對行和頁進(jìn)行分配和取消分配以改正分配錯(cuò)誤、結(jié)構(gòu)行或頁的錯(cuò)誤,以及刪除已損壞的文本對象。這些修復(fù)可能會(huì)導(dǎo)致一些數(shù)據(jù)丟失。修復(fù)操作可以在用戶事務(wù)下完成以允許用戶回滾所做的更改。如果回滾修復(fù),則數(shù)據(jù)庫仍會(huì)含有錯(cuò)誤,應(yīng)該從備份進(jìn)行恢復(fù)。如果由于所提供修復(fù)等級的緣故遺漏某個(gè)錯(cuò)誤的修復(fù),則將遺漏任何取決于該修復(fù)的修復(fù)。修復(fù)完成后,備份數(shù)據(jù)庫。 --REPAIR_FAST 進(jìn)行小的、不耗時(shí)的修復(fù)操作,如修復(fù)非聚集索引中的附加鍵。這些修復(fù)可以很快完成,并且不會(huì)有丟失數(shù)據(jù)的危險(xiǎn)。 --REPAIR_REBUILD 執(zhí)行由 REPAIR_FAST 完成的所有修復(fù),包括需要較長時(shí)間的修復(fù)(如重建索引)。執(zhí)行這些修復(fù)時(shí)不會(huì)有丟失數(shù)據(jù)的危險(xiǎn)。 --DBCC CHECKDB(dvbbs) with NO_INFOMSGS,PHYSICAL_ONLY SQL SERVER日志清除的兩種方法 在使用過程中大家經(jīng)常碰到數(shù)據(jù)庫日志非常大的情況,在這里介紹了兩種處理方法...... 方法一 一般情況下,SQL數(shù)據(jù)庫的收縮并不能很大程度上減小數(shù)據(jù)庫大小,其主要作用是收縮日志大小,應(yīng)當(dāng)定期進(jìn)行此操作以免數(shù)據(jù)庫日志過大 1、設(shè)置數(shù)據(jù)庫模式為簡單模式:打開SQL企業(yè)管理器,在控制臺(tái)根目錄中依次點(diǎn)開Microsoft SQL Server-->SQL Server組-->雙擊打開你的服務(wù)器-->雙擊打開數(shù)據(jù)庫目錄-->選擇你的數(shù)據(jù)庫名稱(如論壇數(shù)據(jù)庫Forum)-->然后點(diǎn)擊右鍵選擇屬性-->選擇選項(xiàng)-->在故障還原的模式中選擇&#8220;簡單&#8221;,然后按確定保存 2、在當(dāng)前數(shù)據(jù)庫上點(diǎn)右鍵,看所有任務(wù)中的收縮數(shù)據(jù)庫,一般里面的默認(rèn)設(shè)置不用調(diào)整,直接點(diǎn)確定 3、收縮數(shù)據(jù)庫完成后,建議將您的數(shù)據(jù)庫屬性重新設(shè)置為標(biāo)準(zhǔn)模式,操作方法同第一點(diǎn),因?yàn)槿罩驹谝恍┊惓G闆r下往往是恢復(fù)數(shù)據(jù)庫的重要依據(jù) 方法二 SET NOCOUNT ON DECLARE @LogicalFileName sysname, @MaxMinutes INT, @NewSize INT USE tablename -- 要操作的數(shù)據(jù)庫名 SELECT @LogicalFileName = tablename_log, -- 日志文件名 @MaxMinutes = 10, -- Limit on time allowed to wrap log. @NewSize = 1 -- 你想設(shè)定的日志文件的大小(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 刪除數(shù)據(jù)庫中重復(fù)數(shù)據(jù)的幾個(gè)方法 數(shù)據(jù)庫的使用過程中由于程序方面的問題有時(shí)候會(huì)碰到重復(fù)數(shù)據(jù),重復(fù)數(shù)據(jù)導(dǎo)致了數(shù)據(jù)庫部分設(shè)置不能正確設(shè)置...... 方法一 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 方法二 有兩個(gè)意義上的重復(fù)記錄,一是完全重復(fù)的記錄,也即所有字段均重復(fù)的記錄,二是部分關(guān)鍵字段重復(fù)的記錄,比如Name字段重復(fù),而其他字段不一定重復(fù)或都重復(fù)可以忽略。 1、對于第一種重復(fù),比較容易解決,使用 select distinct * from tableName 就可以得到無重復(fù)記錄的結(jié)果集。 如果該表需要?jiǎng)h除重復(fù)的記錄(重復(fù)記錄保留1條),可以按以下方法刪除 select distinct * into #Tmp from tableName drop table tableName select * into tableName from #Tmp drop table #Tmp 發(fā)生這種重復(fù)的原因是表設(shè)計(jì)不周產(chǎn)生的,增加唯一索引列即可解決。 2、這類重復(fù)問題通常要求保留重復(fù)記錄中的第一條記錄,操作方法如下 假設(shè)有重復(fù)的字段為Name,Address,要求得到這兩個(gè)字段唯一的結(jié)果集 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) 最后一個(gè)select即得到了Name,Address不重復(fù)的結(jié)果集(但多了一個(gè)autoID字段,實(shí)際寫時(shí)可以寫在select子句中省去此列) 更改數(shù)據(jù)庫中表的所屬用戶的兩個(gè)方法 大家可能會(huì)經(jīng)常碰到一個(gè)數(shù)據(jù)庫備份還原到另外一臺(tái)機(jī)器結(jié)果導(dǎo)致所有的表都不能打開了,原因是建表的時(shí)候采用了當(dāng)時(shí)的數(shù)據(jù)庫用戶...... --更改某個(gè)表 exec sp_changeobjectowner tablename,dbo --存儲(chǔ)更改全部表 CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch @OldOwner as NVARCHAR(128), @NewOwner as NVARCHAR(128) AS DECLARE @Name as NVARCHAR(128) DECLARE @Owner as NVARCHAR(128) DECLARE @OwnerName as NVARCHAR(128) DECLARE curObject CURSOR FOR select Name = name, Owner = user_name(uid) from sysobjects where user_name(uid)=@OldOwner order by name OPEN curObject FETCH NEXT FROM curObject INTO @Name, @Owner WHILE(@@FETCH_STATUS=0) BEGIN if @Owner=@OldOwner begin set @OwnerName = @OldOwner . rtrim(@Name) exec sp_changeobjectowner @OwnerName, @NewOwner end -- select @name,@NewOwner,@OldOwner FETCH NEXT FROM curObject INTO @Name, @Owner END close curObject deallocate curObject GO SQL SERVER中直接循環(huán)寫入數(shù)據(jù) 沒什么好說的了,大家自己看,有時(shí)候有點(diǎn)用處 declare @i int set @i=1 while @i<30 begin insert into test (userid) values(@i) set @i=@i 1 end 無數(shù)據(jù)庫日志文件恢復(fù)數(shù)據(jù)庫方法兩則 數(shù)據(jù)庫日志文件的誤刪或別的原因引起數(shù)據(jù)庫日志的損壞 方法一 1.新建一個(gè)同名的數(shù)據(jù)庫 2.再停掉sql server(注意不要分離數(shù)據(jù)庫) 3.用原數(shù)據(jù)庫的數(shù)據(jù)文件覆蓋掉這個(gè)新建的數(shù)據(jù)庫 4.再重啟sql server 5.此時(shí)打開企業(yè)管理器時(shí)會(huì)出現(xiàn)置疑,先不管,執(zhí)行下面的語句(注意修改其中的數(shù)據(jù)庫名) 6.完成后一般就可以訪問數(shù)據(jù)庫中的數(shù)據(jù)了,這時(shí),數(shù)據(jù)庫本身一般還要問題,解決辦法是,利用 數(shù)據(jù)庫的腳本創(chuàng)建一個(gè)新的數(shù)據(jù)庫,并將數(shù)據(jù)導(dǎo)進(jìn)去就行了. USE MASTER GO SP_CONFIGURE ALLOW UPDATES,1 RECONFIGURE WITH OVERRIDE GO UPDATE SYSDATABASES SET STATUS =32768 WHERE NAME=置疑的數(shù)據(jù)庫名 Go sp_dboption 置疑的數(shù)據(jù)庫名, single user, true Go DBCC CHECKDB(置疑的數(shù)據(jù)庫名) Go update sysdatabases set status =28 where name=置疑的數(shù)據(jù)庫名 Go sp_configure allow updates, 0 reconfigure with override Go sp_dboption 置疑的數(shù)據(jù)庫名, single user, false Go 方法二 事情的起因 昨天,系統(tǒng)管理員告訴我,我們一個(gè)內(nèi)部應(yīng)用數(shù)據(jù)庫所在的磁盤空間不足了。我注意到數(shù)據(jù)庫事件日志文件XXX_Data.ldf文件已經(jīng)增長到了3GB,于是我決意縮小這個(gè)日志文件。經(jīng)過收縮數(shù)據(jù)庫等操作未果后,我犯了一個(gè)自進(jìn)入行業(yè)以來的最大最愚蠢的錯(cuò)誤:竟然誤刪除了這個(gè)日志文件!后來我看到所有論及數(shù)據(jù)庫恢復(fù)的文章上都說道:&#8220;無論如何都要保證數(shù)據(jù)庫日志文件存在,它至關(guān)重要&#8221;,甚至微軟甚至有一篇KB文章講如何只靠日志文件恢復(fù)數(shù)據(jù)庫的。我真是不知道我那時(shí)候是怎么想的?! 這下子壞了!這個(gè)數(shù)據(jù)庫連不上了,企業(yè)管理器在它的旁邊寫著&#8220;(置疑)&#8221;。而且最要命的,這個(gè)數(shù)據(jù)庫從來沒有備份了。我唯一找得到的是遷移半年前的另外一個(gè)數(shù)據(jù)庫服務(wù)器,應(yīng)用倒是能用了,但是少了許多記錄、表和存儲(chǔ)過程。真希望這只是一場噩夢! 沒有效果的恢復(fù)步驟 附加數(shù)據(jù)庫 _Rambo講過被刪除日志文件中不存在活動(dòng)日志時(shí),可以這么做來恢復(fù): 1,分離被置疑的數(shù)據(jù)庫,可以使用sp_detach_db 2,附加數(shù)據(jù)庫,可以使用sp_attach_single_file_db 但是,很遺憾,執(zhí)行之后,SQL Server質(zhì)疑數(shù)據(jù)文件和日志文件不符,所以無法附加數(shù)據(jù)庫數(shù)據(jù)文件。 DTS數(shù)據(jù)導(dǎo)出 不行,無法讀取XXX數(shù)據(jù)庫,DTS Wizard報(bào)告說&#8220;初始化上下文發(fā)生錯(cuò)誤&#8221;。 緊急模式 怡紅公子講過沒有日志用于恢復(fù)時(shí),可以這么做: 1,把數(shù)據(jù)庫設(shè)置為emergency mode 2,重新建立一個(gè)log文件 3,把SQL Server 重新啟動(dòng)一下 4,把應(yīng)用數(shù)據(jù)庫設(shè)置成單用戶模式 5,做DBCC CHECKDB 6,如果沒有什么大問題就可以把數(shù)據(jù)庫狀態(tài)改回去了,記得別忘了把系統(tǒng)表的修改選項(xiàng)關(guān)掉 我實(shí)踐了一下,把應(yīng)用數(shù)據(jù)庫的數(shù)據(jù)文件移走,重新建立一個(gè)同名的數(shù)據(jù)庫XXX,然后停掉SQL服務(wù),把原來的數(shù)據(jù)文件再覆蓋回來。之后,按照怡紅公子的步驟走。 但是,也很遺憾,除了第2步之外,其他步驟執(zhí)行非常成功??上?,重啟SQL Server之后,這個(gè)應(yīng)用數(shù)據(jù)庫仍然是置疑! 不過,讓我欣慰的是,這么做之后,倒是能夠Select數(shù)據(jù)了,讓我大出一口氣。只不過,組件使用數(shù)據(jù)庫時(shí),報(bào)告說:&#8220;發(fā)生錯(cuò)誤:-2147467259,未能在數(shù)據(jù)庫 XXX 中運(yùn)行 BEGIN TRANSACTION,因?yàn)樵摂?shù)據(jù)庫處于回避恢復(fù)模式。&#8221; 最終成功恢復(fù)的全部步驟 設(shè)置數(shù)據(jù)庫為緊急模式 停掉SQL Server服務(wù); 把應(yīng)用數(shù)據(jù)庫的數(shù)據(jù)文件XXX_Data.mdf移走; 重新建立一個(gè)同名的數(shù)據(jù)庫XXX; 停掉SQL服務(wù); 把原來的數(shù)據(jù)文件再覆蓋回來; 運(yùn)行以下語句,把該數(shù)據(jù)庫設(shè)置為緊急模式; 運(yùn)行&#8220;Use Master Go sp_configure allow updates, 1 reconfigure with override Go&#8221; 執(zhí)行結(jié)果: DBCC 執(zhí)行完畢。如果 DBCC 輸出了錯(cuò)誤信息,請與系統(tǒng)管理員聯(lián)系。 已將配置選項(xiàng) allow updates 從 0 改為 1。請運(yùn)行 RECONFIGURE 語句以安裝。 接著運(yùn)行&#8220;update sysdatabases set status = 32768 where name = XXX&#8221; 執(zhí)行結(jié)果: (所影響的行數(shù)為 1 行) 重啟SQL Server服務(wù); 運(yùn)行以下語句,把應(yīng)用數(shù)據(jù)庫設(shè)置為Single User模式; 運(yùn)行&#8220;sp_dboption XXX, single user, true&#8221; 執(zhí)行結(jié)果: 命令已成功完成。 &#252; 做DBCC CHECKDB; 運(yùn)行&#8220;DBCC CHECKDB(XXX)&#8221; 執(zhí)行結(jié)果: XXX 的 DBCC 結(jié)果。 sysobjects 的 DBCC 結(jié)果。 對象 sysobjects 有 273 行,這些行位于 5 頁中。 sysindexes 的 DBCC 結(jié)果。 對象 sysindexes 有 202 行,這些行位于 7 頁中。 syscolumns 的 DBCC 結(jié)果。 ......... &#252; 運(yùn)行以下語句把系統(tǒng)表的修改選項(xiàng)關(guān)掉; 運(yùn)行&#8220;sp_resetstatus XXX go sp_configure allow updates, 0 reconfigure with override Go&#8221; 執(zhí)行結(jié)果: 在 sysdatabases 中更新數(shù)據(jù)庫 XXX 的條目之前,模式 = 0,狀態(tài) = 28(狀態(tài) suspect_bit = 0), 沒有更新 sysdatabases 中的任何行,因?yàn)橐颜_地重置了模式和狀態(tài)。沒有錯(cuò)誤,未進(jìn)行任何更改。 DBCC 執(zhí)行完畢。如果 DBCC 輸出了錯(cuò)誤信息,請與系統(tǒng)管理員聯(lián)系。 已將配置選項(xiàng) allow updates 從 1 改為 0。請運(yùn)行 RECONFIGURE 語句以安裝。 重新建立另外一個(gè)數(shù)據(jù)庫XXX.Lost; DTS導(dǎo)出向?qū)?BR>運(yùn)行DTS導(dǎo)出向?qū)В?/FONT> 復(fù)制源選擇EmergencyMode的數(shù)據(jù)庫XXX,導(dǎo)入到XXX.Lost; 選擇&#8220;在SQL Server數(shù)據(jù)庫之間復(fù)制對象和數(shù)據(jù)&#8221;,試了多次,好像不行,只是復(fù)制過來了所有表結(jié)構(gòu),但是沒有數(shù)據(jù),也沒有視圖和存儲(chǔ)過程,而且DTS向?qū)ё詈髨?bào)告復(fù)制失?。?/FONT> 所以最后選擇&#8220;從源數(shù)據(jù)庫復(fù)制表和視圖&#8221;,但是后來發(fā)現(xiàn),這樣總是只能復(fù)制一部分表記錄; 于是選擇&#8220;用一條查詢指定要傳輸?shù)臄?shù)據(jù)&#8221;,缺哪個(gè)表記錄,就導(dǎo)哪個(gè); 視圖和存儲(chǔ)過程是執(zhí)行SQL語句添加的。 維護(hù)Sql Server中表的索引 在使用和創(chuàng)建數(shù)據(jù)庫索引中經(jīng)常會(huì)碰到一些問題,在這里可以采用一些另類的方法解決... --第一步:查看是否需要維護(hù),查看掃描密度/Scan Density是否為100% declare @table_id int set @table_id=object_id(表名) dbcc showcontig(@table_id) --第二步:重構(gòu)表索引 dbcc dbreindex(表名,pk_索引名,100) --重做第一步,如發(fā)現(xiàn)掃描密度/Scan Density還是小于100%則重構(gòu)表的所有索引 --楊錚:并不一定能達(dá)100%。 dbcc dbreindex(表名,,100) SQL Server補(bǔ)丁安裝常見問題 誰碰到問題就看看咯:) 一、補(bǔ)丁安裝過程中常見問題 如果在安裝補(bǔ)丁的時(shí)候遇到如下類似錯(cuò)誤: 1、安裝過程中出現(xiàn)&#8220;以前進(jìn)行的程序創(chuàng)建了掛起的文件操作,運(yùn)行安裝程序前,必須重新啟動(dòng)&#8221;,請按照下面步驟解決: a、重啟機(jī)器,再進(jìn)行安裝,如果發(fā)現(xiàn)還有該錯(cuò)誤,請按下面步驟 b、在開始->運(yùn)行中輸入regedit c、到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession Manager 位置 d、選擇文件->倒出,保存 e、在右邊窗口右擊PendingFileRenameOperations,選擇刪除,然后確認(rèn) f、重啟安裝,問題解決 如果還有同樣問題,請檢查其它注冊表中是否有該值存在,如有請刪掉。 2、在安裝SQL Server SP3,有時(shí)候會(huì)出現(xiàn):無論用windows認(rèn)證還是混和認(rèn)證,都出現(xiàn)密碼錯(cuò)誤的情況,這時(shí)查看臨時(shí)目錄下的sqlsp.out,會(huì)發(fā)現(xiàn)以下描述: [TCP/IP Sockets]Specified SQL server not found. [TCP/IP Sockets]ConnectionOpen (Connect()). 其實(shí)這是SQL Server SP3的一個(gè)小bug,在安裝sp3的時(shí)候,沒有監(jiān)聽tcp/ip端口,可以按照以下步驟進(jìn)行: 1、打開SQL server客戶器網(wǎng)絡(luò)實(shí)用工具和服務(wù)器網(wǎng)絡(luò)工具,確保啟用的協(xié)議中包含name pipe,并且位置在第一位. 2、確保[HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSSQLServerClientConnectTo] DSQUERY=DBNETLIB. 如果沒有,請自己建立 3、停止mssql. 4、進(jìn)行安裝. 這樣就可以進(jìn)行正確安裝了。 二、SQL Server補(bǔ)丁版本的檢查 SQL Server的補(bǔ)丁版本檢查不如Windows 補(bǔ)丁版本檢查直接,一個(gè)系統(tǒng)管理員,如果不了解SQL Server版本對應(yīng)的補(bǔ)丁號(hào),可能也會(huì)遇到一點(diǎn)麻煩,因此在這說明一下,通過這樣的辦法判別機(jī)器是安全的辦法,不會(huì)對系統(tǒng)產(chǎn)生任何影響。 1、用Isql或者SQL查詢分析器登錄到SQL Server,如果是用Isql,請?jiān)赾md窗口輸入isql -U sa,然后輸入密碼,進(jìn)入;如果是用SQL查詢分析器,請從程序中啟動(dòng),輸入sa和密碼(也可以用windows驗(yàn)證)。 2、在ISQL中輸入: Select @@Version; go 或者SQL查詢分析器中輸入(其實(shí)如果不想輸入,只要打開幫助的關(guān)于就可以了) Select @@Version; 然后按執(zhí)行; 這時(shí)會(huì)返回SQL的版本信息,如下: Microsoft 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) 其中的8.00.760就是SQL Server的版本和補(bǔ)丁號(hào)。對應(yīng)關(guān)系如下: 8.00.194 -&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;SQL Server 2000 RTM 8.00.384 -&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;(SP1) 8.00.534 -&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;(SP2) 8.00.760 -&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;(SP3) 這樣我們就能看到SQL Server的正確版本和補(bǔ)丁號(hào)了。 我們也可以用xp_msver看到更詳細(xì)的信息 Sql Server數(shù)據(jù)庫的備份和恢復(fù)措施 最常用的操作,新手們看看...... 一、備份數(shù)據(jù)庫 1、打開SQL企業(yè)管理器,在控制臺(tái)根目錄中依次點(diǎn)開Microsoft SQL Server 2、SQL Server組-->雙擊打開你的服務(wù)器-->雙擊打開數(shù)據(jù)庫目錄 3、選擇你的數(shù)據(jù)庫名稱(如論壇數(shù)據(jù)庫Forum)-->然后點(diǎn)上面菜單中的工具-->選擇備份數(shù)據(jù)庫 4、備份選項(xiàng)選擇完全備份,目的中的備份到如果原來有路徑和名稱則選中名稱點(diǎn)刪除,然后點(diǎn)添加,如果原來沒有路徑和名稱則直接選擇添加,接著指定路徑和文件名,指定后點(diǎn)確定返回備份窗口,接著點(diǎn)確定進(jìn)行備份 二、還原數(shù)據(jù)庫 1、打開SQL企業(yè)管理器,在控制臺(tái)根目錄中依次點(diǎn)開Microsoft SQL Server 2、SQL Server組-->雙擊打開你的服務(wù)器-->點(diǎn)圖標(biāo)欄的新建數(shù)據(jù)庫圖標(biāo),新建數(shù)據(jù)庫的名字自行取 3、點(diǎn)擊新建好的數(shù)據(jù)庫名稱(如論壇數(shù)據(jù)庫Forum)-->然后點(diǎn)上面菜單中的工具-->選擇恢復(fù)數(shù)據(jù)庫 4、在彈出來的窗口中的還原選項(xiàng)中選擇從設(shè)備-->點(diǎn)選擇設(shè)備-->點(diǎn)添加-->然后選擇你的備份文件名-->添加后點(diǎn)確定返回,這時(shí)候設(shè)備欄應(yīng)該出現(xiàn)您剛才選擇的數(shù)據(jù)庫備份文件名,備份號(hào)默認(rèn)為1(如果您對同一個(gè)文件做過多次備份,可以點(diǎn)擊備份號(hào)旁邊的查看內(nèi)容,在復(fù)選框中選擇最新的一次備份后點(diǎn)確定)-->然后點(diǎn)擊上方常規(guī)旁邊的選項(xiàng)按鈕 5、在出現(xiàn)的窗口中選擇在現(xiàn)有數(shù)據(jù)庫上強(qiáng)制還原,以及在恢復(fù)完成狀態(tài)中選擇使數(shù)據(jù)庫可以繼續(xù)運(yùn)行但無法還原其它事務(wù)日志的選項(xiàng)。在窗口的中間部位的將數(shù)據(jù)庫文件還原為這里要按照你SQL的安裝進(jìn)行設(shè)置(也可以指定自己的目錄),邏輯文件名不需要改動(dòng),移至物理文件名要根據(jù)你所恢復(fù)的機(jī)器情況做改動(dòng),如您的SQL數(shù)據(jù)庫裝在Drogram FilesMicrosoft SQL ServerMSSQLData,那么就按照您恢復(fù)機(jī)器的目錄進(jìn)行相關(guān)改動(dòng)改動(dòng),并且最后的文件名最好改成您當(dāng)前的數(shù)據(jù)庫名(如原來是bbs_data.mdf,現(xiàn)在的數(shù)據(jù)庫是forum,就改成forum_data.mdf),日志和數(shù)據(jù)文件都要按照這樣的方式做相關(guān)的改動(dòng)(日志的文件名是*_log.ldf結(jié)尾的),這里的恢復(fù)目錄您可以自由設(shè)置,前提是該目錄必須存在(如您可以指定d:sqldatabbs_data.mdf或者d:sqldatabbs_log.ldf),否則恢復(fù)將報(bào)錯(cuò) 6、修改完成后,點(diǎn)擊下面的確定進(jìn)行恢復(fù),這時(shí)會(huì)出現(xiàn)一個(gè)進(jìn)度條,提示恢復(fù)的進(jìn)度,恢復(fù)完成后系統(tǒng)會(huì)自動(dòng)提示成功,如中間提示報(bào)錯(cuò),請記錄下相關(guān)的錯(cuò)誤內(nèi)容并詢問對SQL操作比較熟悉的人員,一般的錯(cuò)誤無非是目錄錯(cuò)誤或者文件名重復(fù)或者文件名錯(cuò)誤或者空間不夠或者數(shù)據(jù)庫正在使用中的錯(cuò)誤,數(shù)據(jù)庫正在使用的錯(cuò)誤您可以嘗試關(guān)閉所有關(guān)于SQL窗口然后重新打開進(jìn)行恢復(fù)操作,如果還提示正在使用的錯(cuò)誤可以將SQL服務(wù)停止然后重起看看,至于上述其它的錯(cuò)誤一般都能按照錯(cuò)誤內(nèi)容做相應(yīng)改動(dòng)后即可恢復(fù) 該文章在 2010/8/18 1:22:44 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |