SQL Server 数据库操作实用技巧锦集Word格式文档下载.docx
《SQL Server 数据库操作实用技巧锦集Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《SQL Server 数据库操作实用技巧锦集Word格式文档下载.docx(22页珍藏版)》请在冰点文库上搜索。
ALTERDATABASE[dvbbs]SETMULTI_USER
CHECKDB有3个参数:
REPAIR_ALLOW_DATA_LOSS:
执行由REPAIR_REBUILD完成的所有修复,包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误,以及删除已损坏的文本对象。
这些修复可能会导致一些数据丢失。
修复操作可以在用户事务下完成以允许用户回滚所做的更改。
如果回滚修复,则数据库仍会含有错误,应该从备份进行恢复。
如果由于所提供修复等级的缘故遗漏某个错误的修复,则将遗漏任何取决于该修复的修复。
修复完成后,备份数据库。
REPAIR_FAST进行小的、不耗时的修复操作,如修复非聚集索引中的附加键。
这些修复可以很快完成,并且不会有丢失数据的危险。
REPAIR_REBUILD执行由REPAIR_FAST完成的所有修复,包括需要较长时间的修复(如重建索引),执行这些修复时不会有丢失数据的危险。
)withNO_INFOMSGS,PHYSICAL_ONLY。
7.SQLSERVER日志清除的两种方法
在使用过程中大家经常碰到数据库日志非常大的情况,在这里介绍了两种处理方法。
方法一:
一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,应当定期进行此操作以免数据库日志过大。
1、设置数据库模式为简单模式:
打开SQL企业管理器,在控制台根目录中依次点开MicrosoftSQLServer-->
SQLServer组-->
双击打开你的服务器-->
双击打开数据库目录-->
选择你的数据库名称(如论坛数据库Forum)-->
然后点击右键选择属性-->
选择选项-->
在故障还原的模式中选择“简单”,然后按确定保存。
2、在当前数据库上点右键,看所有任务中的收缩数据库,一般里面的默认设置不用调整,直接点确定。
3、收缩数据库完成后,建议将您的数据库属性重新设置为标准模式,操作方法同第一点,因为日志在一些异常情况下往往是恢复数据库的重要依据。
方法二:
SETNOCOUNTON
DECLARE@LogicalFileNamesysname,
@MaxMinutesINT,
@NewSizeINT
USEdatabasename--要操作的数据库名
SELECT@LogicalFileName=
'
databasename_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'
CREATETABLEDummyTrans
(DummyColumnchar(8000)notnull)
DECLARE@CounterINT,
@StartTimeDATETIME,
@TruncLogVARCHAR(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)
FinalSizeof'
+
CONVERT(VARCHAR(30),size)+'
8Kpagesor'
CONVERT(VARCHAR(30),(size*8/1024))+'
FROMsysfiles
DROPTABLEDummyTrans
SETNOCOUNTOFF
8.删除数据库中重复数据的几个方法
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置。
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
end
closecur_rows
setrowcount0
有两个意义上的重复记录:
一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
A、对于第一种重复,比较容易解决可使用:
selectdistinct*fromtableName
就可以得到无重复记录的结果集。
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除:
selectdistinct*into#TmpfromtableName
droptabletableName
select*intotableNamefrom#Tmp
droptable#Tmp
发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
B、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下:
假设有重复的字段为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子句中省去此列)。
9.更改数据库中表的所属用户的两个方法
大家可能会经常碰到一个数据库备份还原到另外一台机器结果导致所有的表都不能打开了,原因是建表的时候采用了当时的数据库用户,更改某个表:
execsp_changeobjectowner'
tablename'
dbo'
存储更改全部表:
CREATEPROCEDUREdbo.User_ChangeObjectOwnerBatch
@OldOwnerasNVARCHAR(128),
@NewOwnerasNVARCHAR(128)
AS
DECLARE@NameasNVARCHAR(128)
DECLARE@OwnerasNVARCHAR(128)
DECLARE@OwnerNameasNVARCHAR(128)
DECLAREcurObjectCURSORFOR
select'
Name'
=name,
Owner'
=user_name(uid)
fromsysobjects
whereuser_name(uid)=@OldOwner
orderbyname
OPENcurObject
FETCHNEXTFROMcurObjectINTO@Name,@Owner
WHILE(@@FETCH_STATUS=0)
BEGIN
if@Owner=@OldOwner
set@OwnerName=@OldOwner+'
.'
+rtrim(@Name)
execsp_changeobjectowner@OwnerName,@NewOwner
--select@name,@NewOwner,@OldOwner
END
closecurObject
deallocatecurObject
10.SQLSERVER中直接循环写入数据
declare@iint
set@i=1
while@i<
30
insertintotest(userid)values(@i)
set@i=@i+1
11.无数据库日志文件恢复数据库方法两则
数据库日志文件的误删或别的原因引起数据库日志的损坏:
方法一:
1.新建一个同名的数据库;
2.再停掉SQLServer(注意不要分离数据库);
3.用原数据库的数据文件覆盖掉这个新建的数据库;
4.再重启SQLServer;
5.此时打开企业管理器时会出现置疑,先不管,执行下面的语句(注意修改其中的数据库名);
6.完成后一般就可以访问数据库中的数据了,这时,数据库本身一般还要问题,解决办法是,利用数据库的脚本创建一个新的数据库,并将数据导进去就行了。
USEMASTER
SP_CONFIGURE'
ALLOWUPDATES'
1RECONFIGUREWITHOVERRIDE
UPDATESYSDATABASESSETSTATUS=32768WHERENAME='
置疑的数据库名'
Go
sp_dboption'
'
singleuser'
true'
updatesysdatabasessetstatus=28wherename='
sp_configure'
allowupdates'
0reconfigurewithoverride
Go
false'
1、设置数据库为紧急模式;
2、停掉SQLServer服务;
3、把应用数据库的数据文件XXX_Data.mdf移走;
4、重新建立一个同名的数据库XXX;
5、停掉SQL服务;
6、把原来的数据文件再覆盖回来;
7、运行以下语句,把该数据库设置为紧急模式;
8、运行。
“UseMaster
1
reconfigurewithoverride
Go”
执行结果:
DBCC执行完毕。
(如果DBCC输出了错误信息,请与系统管理员联系。
)已将配置选项'
从0改为1。
请运行RECONFIGURE语句以安装,接着运行“updatesysdatabasessetstatus=32768wherename='
XXX'
”。
重启SQLServer服务;
运行以下语句,把应用数据库设置为SingleUser模式;
运行“sp_dboption'
命令已成功完成;
做DBCCCHECKDB;
运行“DBCCCHECKDB('
)”。
的DBCC结果;
sysobjects'
对象'
有273行,这些行位于5页中;
sysindexes'
有202行,这些行位于7页中;
syscolumns'
的DBCC结果。
运行以下语句把系统表的修改选项关掉,运行“sp_resetstatus"
XXX"
:
0
在sysdatabases中更新数据库'
的条目之前,模式=0,状态=28(状态suspect_bit=0),没有更新sysdatabases中的任何行,因为已正确地重置了模式和状态。
没有错误,未进行任何更改。
从1改为0。
请运行RECONFIGURE语句以安装;
重新建立另外一个数据库XXX.Lost。
DTS导出向导:
运行DTS导出向导;
复制源选择EmergencyMode的数据库XXX,导入到XXX.Lost,选择“在SQLServer数据库之间复制对象和数据”,试了多次,好像不行,只是复制过来了所有表结构,但是没有数据,也没有视图和存储过程,而且DTS向导最后报告复制失败;
所以最后选择“从源数据库复制表和视图”,但是后来发现,这样总是只能复制一部分表记录;
于是选择“用一条查询指定要传输的数据”,缺哪个表记录,就导哪个;
视图和存储过程是执行SQL语句添加的。
12.维护SqlServer中表的索引
在使用和创建数据库索引中经常会碰到一些问题,在这里可以采用一些另类的方法解决:
第一步:
查看是否需要维护,查看扫描密度/ScanDensity是否为100%:
declare@table_idint
set@table_id=object_id('
表名'
)
dbccshowcontig(@table_id)
第二步:
重构表索引:
dbccdbreindex('
pk_索引名,100)
重做第一步,如发现扫描密度/ScanDensity还是小于100%则重构表的所有索引:
100)
13.SQLServer补丁版本的检查
SQLServer的补丁版本检查不如Windows补丁版本检查直接,一个系统管理员,如果不了解SQLServer版本对应的补丁号,可能也会遇到一点麻烦,因此在这说明一下,通过这样的办法判别机器是安全的办法,不会对系统产生任何影响。
1、用Isql或者SQL查询分析器登录到SQLServer,如果是用Isql,请在cmd窗口输入isql-Usa,然后输入密码,进入;
如果是用SQL查询分析器,请从程序中启动,输入sa和密码(也可以用windows验证)。
2、在ISQL中输入:
Select@@Version;
或者SQL查询分析器中输入(其实如果不想输入,只要打开帮助的关于就可以了:
然后按执行,这时会返回SQL的版本信息,如下:
MicrosoftSQLServer2000-8.00.760
(IntelX86)Dec17200214:
22:
05Copyright(c)
1988-2003MicrosoftCorporationEnterprise
EditiononWindowsNT5.0(Build2195:
ServicePack3)
其中的8.00.760就是SQLServer的版本和补丁号。
对应关系如下:
SQLServer2000版本和级别@@VERSION产品级别
SQLServer2000原始版本8.00.194RTM
DatabaseComponentsSP18.00.384SP1
DatabaseComponentsSP28.00.534SP2
DatabaseComponentsSP3、SP3a或MSDE2000ReleaseA8.00.760SP3
DatabaseComponentsSP48.00.2039SP4
这样我们就能看到SQLServer的正确版本和补丁号了与此同进也可以用xp_msver看到更详细的信息。
14.SqlServer数据库的备份和恢复措施
14.1、备份数据库
1、打开SQL企业管理器,在控制台根目录中依次点开MicrosoftSQLServer。
2、SQLServer组-->
双击打开数据库目录。
3、选择你的数据库名称(如论坛数据库Forum)-->
然后点上面菜单中的工具-->
选择备份数据库。
4、备份选项选择完全备份,目的中的备份到如果原来有路径和名称则选中名称点删除,然后点添加,如果原来没有路径和名称则直接选择添加,接着指定路径和文件名,指定后点确定返回备份窗口,接着点确定进行备份。
14.2、还原数据库
点图标栏的新建数据库图标,新建数据库的名字自行取。
3、点击新建好的数据库名称(如论坛数据库Forum)-->
选择恢复数据库。
4、在弹出来的窗口中的还原选项中选择从设备-->
点选择设备-->
点添加-->
然后选择你的备份文件名-->
添加后点确定返回,这时候设备栏应该出现您刚才选择的数据库备份文件名,备份号默认为1(如果您对同一个文件做过多次备份,可以点击备份号旁边的查看内容,在复选框中选择最新的一次备份后点确定)-->
然后点击上方常规旁边的选项按钮。
5、在出现的窗口中选择在现有数据库上强制还原,以及在恢复完成状态中选择使数据库可以继续运行但无法还原其它事务日志的选项。
在窗口的中间部位的将数据库文件还原为这里要按照你SQL的安装进行设置(也可以指定自己的目录),逻辑文件名不需要改动,移至物理文件名要根据你所恢复的机器情况做改动,如您的SQL数据库装在D:
\ProgramFiles\MicrosoftSQLServer\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服务停止然后重起看看,至于上述其它的错误一般都能按照错误内容做相应改动后即可恢复。
14.3、收缩数据库
1、设置数据