Sql Server实用操作小技巧集合.docx
《Sql Server实用操作小技巧集合.docx》由会员分享,可在线阅读,更多相关《Sql Server实用操作小技巧集合.docx(17页珍藏版)》请在冰豆网上搜索。
SqlServer实用操作小技巧集合
SqlServer实用操作小技巧集合
Postedon2005-11-1613:
48赵国亮阅读(53)评论(0) 编辑收藏
包括安装时提示有挂起的操作、收缩数据库、压缩数据库、转移数据库给新用户以已存在用户权限、检查备份集、修复数据库等
(一)挂起操作
在安装Sql或sp补丁的时候系统提示之前有挂起的安装操作,要求重启,这里往往重启无用,解决办法:
到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager
删除PendingFileRenameOperations
(二)收缩数据库
--重建索引
DBCCREINDEX
DBCCINDEXDEFRAG
--收缩数据和日志
DBCCSHRINKDB
DBCCSHRINKFILE
(三)压缩数据库
dbccshrinkdatabase(dbname)
(四)转移数据库给新用户以已存在用户权限
execsp_change_users_login'update_one','newname','oldname'
go
(五)检查备份集
RESTOREVERIFYONLYfromdisk='E:
\dvbbs.bak'
(六)修复数据库
ALTERDATABASE[dvbbs]SETSINGLE_USER
GO
DBCCCHECKDB('dvbbs',repair_allow_data_loss)WITHTABLOCK
GO
ALTERDATABASE[dvbbs]SETMULTI_USER
GO
--CHECKDB有3个参数:
--REPAIR_ALLOW_DATA_LOSS
-- 执行由REPAIR_REBUILD完成的所有修复,包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误,以及删除已损坏的文本对象。
这些修复可能会导致一些数据丢失。
修复操作可以在用户事务下完成以允许用户回滚所做的更改。
如果回滚修复,则数据库仍会含有错误,应该从备份进行恢复。
如果由于所提供修复等级的缘故遗漏某个错误的修复,则将遗漏任何取决于该修复的修复。
修复完成后,备份数据库。
--REPAIR_FAST进行小的、不耗时的修复操作,如修复非聚集索引中的附加键。
这些修复可以很快完成,并且不会有丢失数据的危险。
--REPAIR_REBUILD执行由REPAIR_FAST完成的所有修复,包括需要较长时间的修复(如重建索引)。
执行这些修复时不会有丢失数据的危险。
--DBCCCHECKDB('dvbbs')withNO_INFOMSGS,PHYSICAL_ONLY
SQLSERVER日志清除的两种方法
在使用过程中大家经常碰到数据库日志非常大的情况,在这里介绍了两种处理方法……
方法一
一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,应当定期进行此操作以免数据库日志过大
1、设置数据库模式为简单模式:
打开SQL企业管理器,在控制台根目录中依次点开MicrosoftSQLServer-->SQLServer组-->双击打开你的服务器-->双击打开数据库目录-->选择你的数据库名称(如论坛数据库Forum)-->然后点击右键选择属性-->选择选项-->在故障还原的模式中选择“简单”,然后按确定保存
2、在当前数据库上点右键,看所有任务中的收缩数据库,一般里面的默认设置不用调整,直接点确定
3、收缩数据库完成后,建议将您的数据库属性重新设置为标准模式,操作方法同第一点,因为日志在一些异常情况下往往是恢复数据库的重要依据
方法二
SETNOCOUNTON
DECLARE@LogicalFileNamesysname,
@MaxMinutesINT,
@NewSizeINT
USE tablename --要操作的数据库名
SELECT @LogicalFileName='tablename_log', --日志文件名
@MaxMinutes=10, --Limitontimeallowedtowraplog.
@NewSize=1 --你想设定的日志文件的大小(M)
--Setup/initialize
DECLARE@OriginalSizeint
SELECT@OriginalSize=size
FROMsysfiles
WHEREname=@LogicalFileName
SELECT'OriginalSizeof'+db_name()+'LOGis'+
CONVERT(VARCHAR(30),@OriginalSize)+'8Kpagesor'+
CONVERT(VARCHAR(30),(@OriginalSize*8/1024))+'MB'
FROMsysfiles
WHEREname=@LogicalFileName
CREATETABLEDummyTrans
(DummyColumnchar(8000)notnull)
DECLARE@Counter INT,
@StartTimeDATETIME,
@TruncLog VARCHAR(255)
SELECT @StartTime=GETDATE(),
@TruncLog='BACKUPLOG'+db_name()+'WITHTRUNCATE_ONLY'
DBCCSHRINKFILE(@LogicalFileName,@NewSize)
EXEC(@TruncLog)
--Wrapthelogifnecessary.
WHILE @MaxMinutes>DATEDIFF(mi,@StartTime,GETDATE())--timehasnotexpired
AND@OriginalSize=(SELECTsizeFROMsysfilesWHEREname=@LogicalFileName)
AND(@OriginalSize*8/1024)>@NewSize
BEGIN--Outerloop.
SELECT@Counter=0
WHILE ((@Counter<@OriginalSize/16)AND(@Counter<50000))
BEGIN--update
INSERTDummyTransVALUES('FillLog')
DELETEDummyTrans
SELECT@Counter=@Counter+1
END
EXEC(@TruncLog)
END
SELECT'FinalSizeof'+db_name()+'LOGis'+
CONVERT(VARCHAR(30),size)+'8Kpagesor'+
CONVERT(VARCHAR(30),(size*8/1024))+'MB'
FROMsysfiles
WHEREname=@LogicalFileName
DROPTABLEDummyTrans
SETNOCOUNTOFF
删除数据库中重复数据的几个方法
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
方法一
declare@maxinteger,@idinteger
declarecur_rowscursorlocalforselect主字段,count(*)from表名groupby主字段havingcount(*)>1
opencur_rows
fetchcur_rowsinto@id,@max
while@@fetch_status=0
begin
select@max=@max-1
setrowcount@max
deletefrom表名where主字段=@id
fetchcur_rowsinto@id,@max
end
closecur_rows
setrowcount0
方法二
有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
1、对于第一种重复,比较容易解决,使用
selectdistinct*fromtableName
就可以得到无重复记录的结果集。
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
selectdistinct*into#TmpfromtableName
droptabletableName
select*intotableNamefrom#Tmp
droptable#Tmp
发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
selectidentity(int,1,1)asautoID,*into#TmpfromtableName
selectmin(autoID)asautoIDinto#Tmp2from#TmpgroupbyName,autoID
select*from#TmpwhereautoIDin(selectautoIDfrom#tmp2)
最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)
更改数据库中表的所属用户的两个方法
大家可能会经常碰到一个数据库备份还原到另外一台机器结果导致所有的表都不能打开了,原因是建表的时候采用了当时的数据库用户……
--更改某个表
execsp_changeobjectowner'tablename','dbo'
--存储更改全部表
CREATEPROCEDUREdbo.User_ChangeObjectOwnerBatch
@OldOwner asNVARCHAR(128),
@NewOwner asNVARCHAR(128)
AS
DECLARE@Name asNVARCHAR(128)
DECLARE@Owner asNVARCHAR(128)
DECLARE@OwnerName asNVARCHAR(128)
DECLAREcurObjectCURSORFOR
select 'Name' =name,
'Owner' =user_name(uid)
fromsysobjects
whereuser_name(uid)=@OldOwner
orderbyname
OPEN curObject
FETCHNEXTFROMcurObjectINTO@Name,@Owner
WHILE(@@FETCH_STATUS=0)
BEGIN
if@Owner=@OldOwner
begin
set@OwnerName=@OldOwner+'.'+rtrim(@Name)
execsp_changeobjectowner@OwnerName,@NewOwner
end
-- select@name,@NewOwner,@OldOwner
FETCHNEXTFROMcurObjectINTO@Name,@Owner
END
closecurObject
deallocatecurObject
GO
SQLSERVER中直接循环写入数据
没什么好说的了,大家自己看,有时候有点用处
declare@iint
set@i=1
while@i<30
begin
insertintotest(userid)values(@i)
set@i=@i+1
end
无数据库日志文件恢复数据库方法两则
数据库日志文件的误删或别的原因引起数据库日志的损坏
方法一
1.新建一个同名的数据库
2.再停掉sqlserver(注意不要分离数据库)
3.用原数据库的数据文件覆盖掉这个新建的数据库
4.再重启sqlserver
5.此时打开企业管理器时会出现置疑,先不管,执行下面的语句(注意修改其中的数据库名)
6.完成后一般就可以访问数据库中的数据了,这时,数据库本身一般还要问题,解决办法是,利用
数据库的脚本创建一个新的数据库,并将数据导进去就行了.
USEMASTER
GO
SP_CONFIGURE'ALLOWUPDATES',1RECONFIGUREWITHOVERRIDE
GO
UPDATESYSDATABASESSETSTATUS=32768WHERENAME='置疑的数据库名'
Go
sp_dboption'置疑的数据库名','singleuser','true'
Go
DBCCCHECKDB('置疑的数据库名')
Go
updatesysdatabasessetstatus=28wherename='置疑的数据库名'
Go
sp_configure'allowupdates',0reconfigurewithoverride
Go
sp_dboption'置疑的数据库名','singleuser','false'
Go
方法二
事情的起因
昨天,系统管理员告诉我,我们一个内部应用数据库所在的磁盘空间不足了。
我注意到数据库事件日志文件XXX_Data.ldf文件已经增长到了3GB,于是我决意缩小这个日志文件。
经过收缩数据库等操作未果后,我犯了一个自进入行业以来的最大最愚蠢的错误:
竟然误删除了这个日志文件!
后来我看到所有论及数据库恢复的文章上都说道:
“无论如何都要保证数据库日志文件存在,它至关重要”,甚至微软甚至有一篇KB文章讲如何只靠日志文件恢复数据库的。
我真是不知道我那时候是怎么想的?
!
这下子坏了!
这个数据库连不上了,企业管理器在它的旁边写着“(置疑)”。
而且最要命的,这个数据库从来没有备份了。
我唯一找得到的是迁移半年前的另外一个数据库服务器,应用倒是能用了,但是少了许多记录、表和存储过程。
真希望这只是一场噩梦!
没有效果的恢复步骤
附加数据库
_Rambo讲过被删除日志文件中不存在活动日志时,可以这么做来恢复:
1,分离被置疑的数据库,可以使用sp_detach_db
2,附加数据库,可以使用sp_attach_single_file_db
但是,很遗憾,执行之后,SQLServer质疑数据文件和日志文件不符,所以无法附加数据库数据文件。
DTS数据导出
不行,无法读取XXX数据库,DTSWizard报告说“初始化上下文发生错误”。
紧急模式
怡红公子讲过没有日志用于恢复时,可以这么做:
1,把数据库设置为emergencymode
2,重新建立一个log文件
3,把SQLServer重新启动一下
4,把应用数据库设置成单用户模式
5,做DBCCCHECKDB
6,如果没有什么大问题就可以把数据库状态改回去了,记得别忘了把系统表的修改选项关掉
我实践了一下,把应用数据库的数据文件移走,重新建立一个同名的数据库XXX,然后停掉SQL服务,把原来的数据文件再覆盖回来。
之后,按照怡红公子的步骤走。
但是,也很遗憾,除了第2步之外,其他步骤执行非常成功。
可惜,重启SQLServer之后,这个应用数据库仍然是置疑!
不过,让我欣慰的是,这么做之后,倒是能够Select数据了,让我大出一口气。
只不过,组件使用数据库时,报告说:
“发生错误:
-2147467259,未能在数据库'XXX'中运行BEGINTRANSACTION,因为该数据库处于回避恢复模式。
”
最终成功恢复的全部步骤
设置数据库为紧急模式
停掉SQLServer服务;
把应用数据库的数据文件XXX_Data.mdf移走;
重新建立一个同名的数据库XXX;
停掉SQL服务;
把原来的数据文件再覆盖回来;
运行以下语句,把该数据库设置为紧急模式;
运行“UseMaster
Go
sp_configure'allowupdates',1
reconfigurewithoverride
Go”
执行结果:
DBCC执行完毕。
如果DBCC输出了错误信息,请与系统管理员联系。
已将配置选项'allowupdates'从0改为1。
请运行RECONFIGURE语句以安装。
接着运行“updatesysdatabasessetstatus=32768wherename='XXX'”
执行结果:
(所影响的行数为1行)
重启SQLServer服务;
运行以下语句,把应用数据库设置为SingleUser模式;
运行“sp_dboption'XXX','singleuser','true'”
执行结果:
命令已成功完成。
ü 做DBCCCHECKDB;
运行“DBCCCHECKDB('XXX')”
执行结果:
'XXX'的DBCC结果。
'sysobjects'的DBCC结果。
对象'sysobjects'有273行,这些行位于5页中。
'sysindexes'的DBCC结果。
对象'sysindexes'有202行,这些行位于7页中。
'syscolumns'的DBCC结果。
………
ü 运行以下语句把系统表的修改选项关掉;
运行“sp_resetstatus"XXX"
go
sp_configure'allowupdates',0
reconfigurewithoverride
Go”
执行结果:
在sysdatabases中更新数据库'XXX'的条目之前,模式=0,状态=28(状态suspect_bit=0),
没有更新sysdatabases中的任何行,因为已正确地重置了模式和状态。
没有错误,未进行任何更改。
DBCC执行完毕。
如果DBCC输出了错误信息,请与系统管理员联系。
已将配置选项'allowupdates'从1改为0。
请运行RECONFIGURE语句以安装。
重新建立另外一个数据库XXX.Lost;
DTS导出向导
运行DTS导出向导;
复制源选择EmergencyMode的数据库XXX,导入到XXX.Lost;
选择“在SQLServer数据库之间复制对象和数据”,试了多次,好像不行,只是复制过来了所有表结构,但是没有数据,也没有视图和存储过程,而且DTS向导最后报告复制失败;
所以最后选择“从源数据库复制表和视图”,但是后来发现,这样总是只能复制一部分表记录;
于是选择“用一条查询指定要传输的数据”,缺哪个表记录,就导哪个;
视图和存储过程是执行SQL语句添加的。
维护SqlServer中表的索引
在使用和创建数据库索引中经常会碰到一些问题,在这里可以采用一些另类的方法解决…
--第一步:
查看是否需要维护,查看扫描密度/ScanDensity是否为100%
declare@table_idint
set@table_id=object_id('表名')
dbccshowcontig(@table_id)
--第二步:
重构表索引
dbccdbreindex('表名',pk_索引名,100)
--重做第一步,如发现扫描密度/ScanDensity还是小于100%则重构表的所有索引
--杨铮:
并不一定能达100%。
dbccdbreindex('表名','',100)
SQLServer补丁安装常见问题
谁碰到问题就看看咯:
)
一、补丁安装过程中常见问题
如果在安装补丁的时候遇到如下类似错误:
1、安装过程中出现“以前进行的程序创建了挂起的文件操作,运行安装程序前,必须重新启动”,请按照下面步骤解决:
a、重启机器,再进行安装,如果发现还有该错误,请按下面步骤
b、在开始->运行中输入regedit
c、到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager位置
d、选择文件->倒出,保存
e、在右边窗口右击PendingFileRenameOperations,选择删除,然后确认
f、重启安装,问题解决
如果还有同样问题,请检查其它注册表中是否有该值存在,如有请删掉。
2、在安装SQLServerSP3,有时候会出现:
无论用windows认证还是混和认证,都出现密码错误的情况,这时查看临时目录下的sqlsp.out,会发现以下描述:
[TCP/IPSockets]SpecifiedSQLservernotfound.
[TCP/IPSockets]ConnectionOpen(Connect()).
其实这是SQLServerSP3的一个小bug,在安装sp3的时候,没有监听tcp/ip端口,可以按照以下步骤进行:
1、打开SQLserver客户器网络实用工具和服务器网络工具,确保启用的协议中包含namepipe,并且位置在第一位.
2、确保[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\ConnectTo]
"DSQUERY"="DBNETLIB".
如果没有,请自己建立
3、停止mssql.
4、进行安装.
这样就