您的位置:   主页 > 技术文章

sql数据库日常使用技巧

时间:2011-01-29 08:54来源:青岛数据恢复 作者:青岛四通数据恢复公司 点击:455次


标签:

it

分类:Web设计

 

 

 

 

 

包括装置时提示有挂起的操作、收缩数据库、压缩数据库、转移数据库给新用户以已存在用户权限、检查备份集、修复数据库等

一)挂起操作

装置Sql或sp补丁的时候系统提示之前有挂起的装置操作。这里往往重启无用,要求重启。解决方法:

HKEY_LOCA L_MA CHINE\SYSTEM\CurrentControlSet\Control\SessManager

删除PendingFileRenameOperations

二)收缩数据库

--重建索引

DBCCREINDEX

DBCCINDEXDEFRA G

--收缩数据和日志

DBCCSHRINKDB

DBCCSHRINKFILE

三)压缩数据库

dbccshrinkdatabasdbname

四)转移数据库给新用户以已存在用户权限

execsp_change_users_login'update_one'.'oldname'newname'.'

go

五)检查备份集

RESTOREVERIFYONLYfromdisk='E:\dvbbs.bak'

六)修复数据库

A LTERDA TA BA SE[dvbbs]SETSINGLE_USER

GO

repair_allow_data_lossWITHTA BLOCDBCCCHECKDB'dvbbs'.K

GO

A LTERDA TA BA SE[dvbbs]SETMULTI_USER

GO

--CHECKDB有3个参数:

--REPA IR_A LLOW_DA TA _LOSS

--执行由 REPA IR_REBUILD完成的所有修复。以及删除已损坏的文本对象。这些修复可能会导致一些数据丢失。修复操作可以在用户事务下完成以允许用户回滚所做的更改。如果回滚修复,包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误。则数据库仍会含有错误,应该从备份进行恢复。如果由于所提供修复等级的缘故遗漏某个错误的修复,则将遗漏任何取决于该修复的修复。修复完成后,备份数据库。

--REPA IR_FA ST进行小的不耗时的修复操作。并且不会有丢失数据的危险。如修复非聚集索引中的附加键。这些修复可以很快完成。

包括需要较长时间的修复(如重建索引)执行这些修复时不会有丢失数据的危险。 --REPA IR_REBUILD执行由 REPA IR_FA ST完成的所有修复。

PHYSICA L_ONL--DBCCCHECKDB'dvbbs'withNO_INFOMSGS.Y

SQLSERVER日志清除的两种方法

这里介绍了两种处理方法… 使用过程中大家经常碰到数据库日志非常大的情况。

方法一

一般情况下。其主要作用是收缩日志大小,SQL数据库的收缩并不能很大水平上减小数据库大小。应当定期进行此操作以免数据库日志过大

控制台根目录中依次点开MicrosoftSQLServer-->SQLServer组-->双击打开你服务器-->双击打开数据库目录-->选择你数据库名称(如论坛数据库Forum-->然后点击右键选择属性-->选择选项-->故障还原的模式中选择“简单”然后按确定保存 1设置数据库模式为简单模式:打开SQL企业管理器。

2当前数据库上点右键。一般里面的默认设置不用调整,看所有任务中的收缩数据库。直接点确定

3收缩数据库完成后。操作方法同第一点,建议将您的数据库属性重新设置为标准模式。因为日志在一些异常情况下往往是恢复数据库的重要依据

方法二

SETNOCOUNTON

 

 

 

@NewSizINT

USEtablenam--要操作的数据库名

--日志文件名 SELECT@LogicalFileNam='tablename_log'.

--Limitontimeallowtowraplog@MaxMinut=10..

@NewS=1--想设定的日志文件的大小(M

--Setup/initialize

DECLA RE@OriginalSint

SELECT@OriginalS=size

FROMsysfiles

WHEREname=@LogicalFileName

SELECT'OriginSizeof'+db_name+'LOGis'+

@OriginalS+'8Kpageor'CONVERTVA RCHA R30.+

@OriginalSize*8/1024+'MBCONVERTVA RCHA R30.'

FROMsysfiles

WHEREname=@LogicalFileName

CREA TETA BLEDummyTrans

DummyColumnchar8000notnull

 

 

 

@TruncLogVA RCHA R255

 

 

@TruncLog='BA CKUPLOG'+db_name+'WITHPUNCA TE_ONLY'

@NewSiz DBCCSHRINKFILE@LogicalFileName.

EXEC@TruncLog

--Wrapthelogifnecessary.

WHILE@MaxMinut>DA TEDIFFmi.GETDA TE--timehanotexpire@StartTime.d

A ND@OriginalS=SELECTsizeFROMsysfilWHEREname=@LogicalFileNam

A ND@OriginalS*8/1024>@NewSize

BEGIN--Outerloop.

SELECT@Counter=0

WHILE@Counter<@OriginalS/16AND@Counter<50000

BEGIN--update

INSERTDummyTranVA LUES'FillLog'

DELETEDummyTrans

SELECT@Counter=@Counter+1

END

EXEC@TruncLog

END

SELECT'FinalSizeof'+db_name+'LOGis'+

size+'8Kpageor'CONVERTVA RCHA R30.+

size*8/1024+'MBCONVERTVA RCHA R30.'

FROMsysfiles

WHEREname=@LogicalFileName

DROPTA BLEDummyTrans

SETNOCOUNTOFF

删除数据库中重复数据的几个方法

重复数据导致了数据库局部设置不能正确设置… 数据库的使用过程中由于顺序方面的问题有时候会碰到重复数据。

方法一

@idintegedeclar@maxinteger.r

count*from表名 groupby主字段 havecount*>declarcur_rowcursorlocalforselect主字段.1

opencur_rows

@mafetchcur_rowinto@id.x

whil@@fetch_status=0

begin

select@max=@max-1

setrowcount@max

deletfrom表名 where主字段 =@id

@mafetchcur_rowinto@id.x

end

closcur_rows

setrowcount0

方法二

有两个意义上的重复记录。也即所有字段均重复的记录,一是完全重复的记录。二是局部关键字段重复的记录,比方Name字段重复,而其他字段不一定重复或都重复可以忽略。

1对于第一种重复。使用比较容易解决。

selectdistinct*fromtableName

就可以得到无重复记录的结果集。

如果该表需要删除重复的记录(重复记录保存1条)可以按以下方法删除

selectdistinct*into#TmpfromtableName

droptabltableName

select*intotableNamfrom#Tmp

droptabl#Tmp

发生这种重复的原因是表设计不周发生的增加唯一索引列即可解决。

操作方法如下 2这类重复问题通常要求保管重复记录中的第一条记录。

A ddress要求得到这两个字段唯一的结果集假设有重复的字段为Name.

selectidentint.1asautoID,1.*into#TmpfromtableName

autoIselectminautoIDasautoIDinto#Tmp2from#TmpgroupbyName.D

select*from#TmpwhereautoIDinselectautoIDfrom#tmp2

实际写时可以写在select子句中省去此列)最后一个select即得到NameAddress不重复的结果集(但多了一个autoID字段。

更改数据库中表的所属用户的两个方法

大家可能会经常碰到一个数据库备份还原到另外一台机器结果导致所有的表都不能打开了原因是建表的时候采用了当时的数据库用户…

--更改某个表

'dboexecsp_changeobjectown'tablename'.'

--存储更改全部表

CREA TEPROCEDUREdbo.User_ChangeObjectOwnerBatch

 

 

@NewOwnerasNVA RCHA R128

A S

DECLA RE@NameasNVA RCHA R128

DECLA RE@OwnerasNVA RCHA R128

DECLA RE@OwnerNamasNVA RCHA R128

DECLA REcurObjectCURSORFOR

 

 

'Owner'=user_namuid

fromsysobjects

wheruser_namuid=@OldOwner

ordbyname

OPENcurObject

@OwneFETCHNEXTFROMcurObjectINTO@Name.r

WHILE@@FETCH_STA TUS=0

BEGIN

if@Owner=@OldOwner

begin

set@OwnerNam=@OldOwner+'.'+rtrim@Name

@NewOwneexecsp_changeobjectown@OwnerName.r

end

--select@name.@OldOwne@NewOwner.r

@OwneFETCHNEXTFROMcurObjectINTO@Name.r

END

closcurObject

dealloccurObject

GO

SQLSERVER中直接循环写入数据

有时候有点用处没什么好说的大家自己看。

declar@iint

set@i=1

whil@i<30

begin

insertintotestuseridvalu@i

set@i=@i+1

end

无数据库日志文件恢复数据库方法两则

数据库日志文件的误删或别的原因引起数据库日志的损坏

方法一

1.新建一个同名的数据库

2.再停掉sqlserver注意不要分离数据库)

3.用原数据库的数据文件覆盖掉这个新建的数据库

4.再重启sqlserver

5.此时打开企业管理器时会出现置疑。执行下面的语句(注意修改其中的数据库名) 先不管。

6.完成后一般就可以访问数据库中的数据了.数据库自身一般还要问题,这时.解决方法是,利用

并将数据导进去就行了数据库的脚本创建一个新的数据库..

USEMA STER

GO

1RECONFIGUREWITHOVERRIDSP_CONFIGURE'A LLOWUPDA TES'.E

GO

UPDA TESYSDA TA BA SESSETSTA TUS=32768WHERENA ME='置疑的数据库名'

Go

sp_dbopt'置疑的数据库名'.'true'singluser'.'

Go

DBCCCHECKDB'置疑的数据库名'

Go

updsysdatabassetstatu=28wherename='置疑的数据库名'

Go

0reconfigurwithoverridsp_configur'allowupdates'.e

Go

sp_dbopt'置疑的数据库名'.'false'singluser'.'

Go

方法二

事情的起因

昨天。犯了一个自进入行业以来的最大最愚蠢的错误:竟然误删除了这个日志文件!后来我看到所有论及数据库恢复的文章上都说道:无论如何都要保证数据库日志文件存在至关重要”甚至微软甚至有一篇KB文章讲如何只靠日志文件恢复数据库的真是不知道我那时候是怎么想的系统管理员告诉我一个内部应用数据库所在磁盘空间不足了注意到数据库事件日志文件XXX_Data.ldf文件已经增长到3GB于是决意缩小这个日志文件。经过收缩数据库等操作未果后。

应用倒是能用了但是少了许多记录、表和存储过程。真希望这只是一场噩梦!这下子坏了这个数据库连不上了企业管理器在旁边写着“置疑)而且最要命的这个数据库历来没有备份了唯一找得到迁移半年前的另外一个数据库服务器。

没有效果的恢复方法

附加数据库

可以这么做来恢复: _Rambo讲过被删除日志文件中不存在活动日志时。

可以使用sp_detach_d1分离被置疑的数据库。b

可以使用sp_attach_single_file_d2附加数据库。b

但是很遗憾。SQLServer质疑数据文件和日志文件不符,执行之后。所以无法附加数据库数据文件。

DTS数据导出

不行。DTSWizard演讲说“初始化上下文发生错误” 无法读取XXX数据库。

紧急模式

可以这么做:怡红公子讲过没有日志用于恢复时。

1把数据库设置为emergmode

2重新建立一个log文件

3把SQLServer重新启动一下

4把应用数据库设置成单用户模式

5做DBCCCHECKDB

6如果没有什么大问题就可以把数据库状态改回去了记得别忘了把系统表的修改选项关掉

实践了一下。重新建立一个同名的数据库XXX然后停掉SQL服务,把应用数据库的数据文件移走。把原来的数据文件再覆盖回来。之后,依照怡红公子的方法走。

但是也很遗憾。其他方法执行非常胜利。可惜,除了第2步之外。重启SQLServer之后,这个应用数据库仍然是置疑!

倒是能够Select数据了让我大出一口气。只不过,组件使用数据库时,演讲说:发生错误:-2147467259,让我欣慰的这么做之后。不过。未能在数据库 'XXX'中运行 BEGINPA NSA CTION因为该数据库处于回避恢复模式。

最终胜利恢复的全部方法

设置数据库为紧急模式

停掉SQLServer服务;

把应用数据库的数据文件XXX_Data.mdf移走;

重新建立一个同名的数据库XXX

停掉SQL服务;

把原来的数据文件再覆盖回来;

把该数据库设置为紧急模式;运行以下语句。

运行“UseMaster

Go

sp_configur'allowupdates'.1

reconfigurwithoverride

Go

执行结果:

请与系统管理员联系。 DBCC执行完毕。如果 DBCC输出了错误信息。

已将配置选项 'allowupdates'从 0改为 1请运行 RECONFIGURE语句以安装。

接着运行“updatsysdatabassetstatu=32768wherename='XXX'

执行结果:

所影响的行数为 1行)

重启SQLServer服务;

把应用数据库设置为SinglUser模式;运行以下语句。

运行“sp_dboption'XXX'.'true' 'singluser'.

执行结果:

命令已成功完成。

ü 做DBCCCHECKDB

运行“DBCCCHECKDB'XXX'

执行结果:

'XXX'DBCC结果。

'sysobjects'DBCC结果。

这些行位于 5页中。对象 'sysobjects'有 273行。

'sysindexes'DBCC结果。

这些行位于 7页中。对象 'sysindexes'有 202行。

'syscolumns'DBCC结果。

 

ü 运行以下语句把系统表的修改选项关掉;

运行“sp_resetstatu"XXX"

go

sp_configur'allowupdates'.0

reconfigurwithoverride

Go

执行结果:

模式 =0状态 =28状态 suspect_bit=0 sysdatabas中更新数据库 'XXX'条目之前。

没有更新 sysdatabas中的任何行。未进行任何更改。因为已正确地重置了模式和状态。没有错误。

请与系统管理员联系。 DBCC执行完毕。如果 DBCC输出了错误信息。

已将配置选项 'allowupdates'从 1改为 0请运行 RECONFIGURE语句以安装。

重新建立另外一个数据库XXX.Lost

DTS导出向导

运行DTS导出向导;

复制源选择EmergencyMod数据库XXX导入到XXX.Lost

选择“SQLServer数据库之间复制对象和数据”试了多次。只是复制过来了所有表结构,好像不行。但是没有数据,也没有视图和存储过程,而且DTS向导最后演讲复制失败;

这样总是只能复制一局部表记录;所以最后选择“从源数据库复制表和视图”但是后来发现。

就导哪个;于是选择“用一条查询指定要传输的数据”缺哪个表记录。

视图和存储过程是执行SQL语句添加的

维护SqlServer中表的索引

这里可以采用一些另类的方法解决… 使用和创建数据库索引中经常会碰到一些问题。

检查扫描密度/ScanDensiti否为100--第一步:检查是否需要维护。%

declar@table_idint

set@table_id=object_id'表名'

dbccshowcontig@table_id

--第二步:重构表索引

dbccdbreindex'表名'.100 pk_索引名.

如发现扫描密度/ScanDensiti还是小于100%则重构表的所有索引 --重做第一步。

--杨铮:并不一定能达100%

dbccdbreindex'表名'.100 ''.

SQLServer补丁装置罕见问题

谁碰到问题就看看咯:

一、补丁装置过程中常见问题

如果在装置补丁的时候遇到如下类似错误:

1装置过程中出现“以前进行的顺序创立了挂起的文件操作。必需重新启动”请依照下面方法解决:运行装置顺序前。

a重启机器。如果发现还有该错误,再进行安装。请按下面步骤

b开始->运行中输入regedit

cHKEY_LOCA L_MA CHINE\SYSTEM\CurrentControlSet\Control\SessManag位置

保管 d选择文件->倒出.

然后确认 e右边窗口右击PendingFileRenameOperation选择删除。

问题解决 f重启安装。

请检查其它注册表中是否有该值存在如有请删掉。如果还有同样问题。

2装置SQLServerSP3有时候会出现:无论用window认证还是混和认证。这时检查临时目录下的sqlsp.out会发现以下描述:都出现密码错误的情况。

[TCP/IPSockets]SpecifiSQLservernotfound.

[TCP/IPSockets]ConnectionOpenConnect.

其实这是SQLServerSP3一个小bug装置sp3时候。可以依照以下方法进行:没有监听tcp/ip端口。

确保启用的协议中包含namepipe并且位置在第一位1打开SQLserver客户器网络实用工具和服务器网络工具。.

2确保[HKEY_LOCA L_MA CHINE\SOFTWA RE\Microsoft\MSSQLServer\Client\ConnectTo]

"DSQUERY"="DBNETLIB".

请自己建立如果没有。

3停止mssql.

4进行装置.

这样就可以进行正确装置了

二、SQLServer补丁版本的检查

SQLServer补丁版本检查不如Window补丁版本检查直接。如果不了解SQLServer版本对应的补丁号,一个系统管理员。可能也会遇到一点麻烦,因此在这说明一下,通过这样的方法判别机器是平安的方法,不会对系统发生任何影响。

请从顺序中启动,输入sa和密码(也可以用window验证) 1用Isql或者SQL查询分析器登录到SQLServer如果是用Isql请在cmd窗口输入isql-Usa,进入;如果是用SQL查询分析器。然后输入密码。

2ISQL中输入:

Select@@Version

go

只要打开协助的关于就可以了: 或者SQL查询分析器中输入(其实如果不想输入。

Select@@Version

然后按执行;

如下:这时会返回SQL版本信息。

MicrosoftSQLServer2000-8.00.760IntelX86Dec17200214:22:05Copyrightc1988-2003MicrosoftCorporEnterprisEditiononWindowNT5.0Build2195:ServicPack3

其中的8.00.760就是SQLServer版本和补丁号。对应关系如下:

8.00.194SQLServer2000RTM

8.00.384SP1

8.00.534SP2

8.00.760SP3

这样我就能看到SQLServer正确版本和补丁号了

也可以用xp_msver看到更详细的信息

SqlServer数据库的备份和恢复措施

新手们看看… 最常用的操作。

一、备份数据库

控制台根目录中依次点开MicrosoftSQLServe1打开SQL企业管理器。r

2SQLServer组-->双击打开你服务器-->双击打开数据库目录

3选择你数据库名称(如论坛数据库Forum-->然后点上面菜单中的工具-->选择备份数据库

4备份选项选择完全备份。然后点添加,目的中的备份到如果原来有路径和名称则选中名称点删除。如果原来没有路径和名称则直接选择添加,接着指定路径和文件名,指定后点确定返回备份窗口,接着点确定进行备份

二、还原数据库

控制台根目录中依次点开MicrosoftSQLServe1打开SQL企业管理器。r

新建数据库的名字自行取 2SQLServer组-->双击打开你服务器-->点图标栏的新建数据库图标。

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服务停止然后重起看看,至于上述其它错误一般都能依照错误内容做相应改动后即可恢复

三、收缩数据库

一般情况下。其主要作用是收缩日志大小,SQL数据库的收缩并不能很大水平上减小数据库大小。应当定期进行此操作以免数据库日志过大

控制台根目录中依次点开MicrosoftSQLServer-->SQLServer组-->双击打开你服务器-->双击打开数据库目录-->选择你数据库名称(如论坛数据库Forum-->然后点击右键选择属性-->选择选项-->故障还原的模式中选择“简单”然后按确定保存 1设置数据库模式为简单模式:打开SQL企业管理器。

2当前数据库上点右键。一般里面的默认设置不用调整,看所有任务中的收缩数据库。直接点确定

3收缩数据库完成后。操作方法同第一点,建议将您的数据库属性重新设置为标准模式。因为日志在一些异常情况下往往是恢复数据库的重要依据

四、设定每日自动备份数据库

强烈建议有条件的用户进行此操作!

控制台根目录中依次点开MicrosoftSQLServer-->SQLServer组-->双击打开你服务器 1打开企业管理器。

2然后点上面菜单中的工具-->选择数据库维护计划器

3下一步选择要进行自动备份的数据-->下一步更新数据优化信息。也一般不选择这里一般不用做选择-->下一步检查数据完整性。

4下一步指定数据库维护计划。点击更改选择每天备份后点确定默认的1周备份一次。

5下一步指定备份的磁盘目录。如您可以在D盘新建一个目录如:d:\databak然后在这里选择使用此目录,选择指定目录。如果您的数据库比较多最好选择为每个数据库建立子目录,然后选择删除早于多少天前的备份,一般设定47天,这看您的具体备份要求,备份文件扩展名一般都是bak就用默认的

6下一步指定事务日志备份计划。一般不做选择-->下一步维护计划历史记录,看您的需要做选择-->下一步要生成的报表。最好用默认的选项-->下一步完成

7完成后系统很可能会提示SqlServerAgent服务未启动。然后找到桌面最右边状态栏中的SQL绿色图标,先点确定完成计划设定。双击点开,服务中选择SqlServerAgent然后点击运行箭头,选上下方的当启动OS时自动启动服务

8这个时候数据库计划已经胜利的运行了将依照您上面的设置进行自动备份

修改计划:

1打开企业管理器。可以进行修改或者删除操作控制台根目录中依次点开MicrosoftSQLServer-->SQLServer组-->双击打开你服务器-->管理-->数据库维护计划-->打开后可看到设定的计划。

五、数据的转移(新建数据库或转移服务器)

一般情况下。特殊情况下,最好使用备份和还原操作来进行转移数据。可以用导入导出的方式进行转移,这里介绍的就是导入导出方式,导入导出方式转移数据一个作用就是可以在收缩数据库无效的情况下用来减小(收缩)数据库的大小,本操作默认为您对SQL操作有一定的解,如果对其中的局部操作不理解,可以咨询动网相关人员或者查询网上资料

导出的时候注意在选项中选择编写索引脚本和编写主键、外键、默认值和检查约束脚本选项 1将原数据库的所有表、存储过程导出成一个SQL文件。

对新建数据库执行第一步中所建立的SQL文件 2新建数据库。

对新数据库导入原数据库中的所有表内容 3用SQL导入导出方式。

利用数据库日志恢复数据到时间点的操作

由于不正常的数据丢失。只要原来有备份且当前日志保管完好,而又不想使用备份数据还原。可以采用这个方法试试,说不定可挽回损失…

1如果误操作之前存在一个全库备份(或已有多个差异备份或增量备份)首先要做的事就是进

进行一次日志备份(如果为了不让日志文件变大而置trunc.logonchkpt.选项为1那你就死翘了

backuplogdbNametodisk='fileName'

2恢复一个全库备份。则逐个恢注意需要使用withnorecoveri如果还有其他差异或增量备份。

restordatabasdbNamefromdisk='fileName'withnorecovery

指定恢复时间点到误操作之前的时刻 3恢复最后一个日志备份即刚做的日志备份。

restorlogdbNamefromdisk='fileName'

withstopat='date_time'

难度不大。以上这些操作都可以在SQLSERVER企业管理器里完成。

当然。那么是无法利如果误操作是一些不记日志的操作比方truncattablselectinto等操作。

用上述方法来恢复数据的...

SQLServer2000数据库文件损坏时如何恢复

出现这样的问题是比较严重的能否修复只能看你运气…

仅适用于非master,如果数据库文件(非系统数据库文件)遇到错误的时候。SQLServer2000中。msdb数据库。

说明如下:

1建一个测试数据库test数据库类型为完全)

插入点记录 2建一个表。

creattablac1varchar2

go

insertintoavalu'aa'

go

insertintoavalu'bb'

go

文件test_1.ba3作完全备份。k

4作一点修改

insertintoavalu'cc'

go

creattablbc1int

go

insertintobvalu1

go

insertintobvalu2

go

5shutdown数据库服务器

6用ultraedit编辑数据库文件test_data.mdf.相当于数据库遭到致命的损坏。随便修改点字节内容.

7启动数据库。点开数据库,并且运行企业管理器。看到test变成灰色,而且显示置疑。

8运行isql-SLocalhost-Usa-P

1>backuplogtestTODISK='D:ProgramFilesMicrosoftSQLServerMSSQLBA CKUP

est_2.bak'WITHNO_PUNCA TE

2>go

这些页属于数据库 'test'文件 'TEST_Log'位于文件 1上)已处理 2页。

花费了0.111秒(0.087MB/秒) BA CKUPLOG操作胜利地处理了2页。

9进行恢复最老的完全备份

1>RESTOREDA TA BA SEtestFROMDISK='D:ProgramFilesMicrosoftSQLServerMSSQL

BA CKUPest_1.bak'WITHNORECOVERY

2>go

这些页属于数据库 'test'文件 'TEST_Data'位于文件 1上)已处理 96页。

这些页属于数据库 'test'文件 'TEST_Log'位于文件 1上)已处理 1页。

花费了0.107秒(7.368MB/秒) RESTOREDA TA BA SE操作胜利地处理了97页。

10恢复最近的日志

1>RESTORELOGtestFROMDISK='D:ProgramFilesMicrosoftSQLServerMSSQLBA CKU

Pest_2.bak'WITHRECOVERY

2>go

这些页属于数据库 'test'文件 'TEST_Log'位于文件 1上)已处理 2页。

花费了0.056秒(0.173MB/秒) RESTORELOG操作胜利地处理了2页。

存储过程编写经验和优化措施

看看… 经验之谈。

一、适合读者对象:数据库开发顺序员。涉及到对SP存储过程)优化的项目开发人员,数据库的数据量很多。对数据库有浓厚兴趣的人。

二、介绍:数据库的开发过程中。这个时候就会用SP来封装数据库操作。如果项目的SP较多,经常会遇到复杂的业务逻辑和对数据库的操作。书写又没有一定的规范,将会影响以后的系统维护困难和大SP逻辑的难以理解,另外如果数据库的数据量大或者项目对SP性能要求很,就会遇到优化的问题,否则速度有可能很慢,经过亲身经验,一个经过优化过的SP要比一个性能差的SP效率甚至高几百倍。

三、内容:

最好不要直接使用“databse.dbo.table_nam因为sp_depend不能显示出该SP所使用的跨库tabl或view不方便校验。 1开发人员如果用到其他库的Tabl或View务必在当前库中建立View来实现跨库操作。

2开发人员在提交SP前。做过自身的查询优化检查。必需已经使用setshowplanon分析过查询计划。

3高程序运行效率。SP编写过程中应该注意以下几点:优化应用顺序。

aSQL使用规范:

i.尽量防止大事务操作。提高系统并发能力。慎用holdlock子句。

ii.尽量防止反复访问同一张或几张表。可以考虑先根据条件提取数据到临时表中,尤其是数据量较大的表。然后再做连接。

iii.尽量防止使用游标。如果游标操作的数据超越1万行,因为游标的效率较差。那么就应该改写;如果使用了游标,就要尽量防止在游标循环中再进行表连接的操作。

iv.注意where字句写法。应该根据索引顺序、范围大小来确定条件子句的前后顺序,必需考虑语句顺序。尽可能的让字段顺序与索引顺序相一致,范围从大到小。

否则系统将可能无法正确使用索引。 v.不要在where子句中的=左边进行函数、算术运算或其他表达式运算。

vi.尽量使用exist代替selectcount1来判断是否存在记录。而且count1比count*更有效率。 count函数只有在统计表中所有行数时使用。

vii.尽量使用“>=不要使用“>

viii.注意一些or子句和union子句之间的替换

防止不同类型数据之间的连接。 ix.注意表之间连接的数据类型。

x.注意存储过程中参数和数据类型的关系。

xi.注意insertupdat操作的数据量。页级锁会升级成表级锁。防止与其他应用抵触。如果数据量超过200个数据页面(400k那么系统将会进行锁升级。

b索引的使用规范:

建议大的OLTP表不要超过6个索引。 i.索引的创建要与应用结合考虑。

ii.尽可能的使用索引字段作为查询条件。必要时可以通过indexindex_nam来强制指定索引尤其是聚簇索引。

iii.防止对大表查询时进行tablscan必要时考虑新建索引。

iv.使用索引字段作为条件时。那么必需使用到该索引中的第一个字段作为条件时才干保证系统使用该索引,如果该索引是联合索引。否则该索引将不会被使用。

v.要注意索引的维护。重新编译存储过程。周期性重建索引。

ctempdb使用规范:

i.尽量防止使用distinctorderbygroupbyhavejoincumput因为这些语句会加重tempdb负担。

减少系统表资源的消耗。 ii.防止频繁创建和删除临时表。

iii.新建临时表时。那么可以使用selectinto代替creattabl防止log提高速度;如果数据量不大,如果一次性插入数据量很大。为了缓和系统表的资源,建议先creattabl然后insert

iv.如果临时表的数据量较大。那么应该将创建临时表和建立索引的过程放在单独一个子存储过程中,需要建立索引。这样才干保证系统能够很好的使用到该临时表的索引。

v.如果使用到临时表。先truncattabl然后droptabl这样可以防止系统表的较长时间锁定。存储过程的最后务必将所有的临时表显式删除。

vi.慎用大的临时表与其他大表的连接查询和修改。因为这种操作会在一条语句中多次使用tempdb系统表。减低系统表负担。

d合理的算法使用:

根据上面已提到SQL优化技术和ASETune手册中的SQL优化内容.采用多种算法进行比拟,结合实际应用.以获得消耗资源最少、效率最高的方法。具体可用ASE调优命令:setstatistioon,setstatisttimeon,setshowplanon等

Trackback:http://tb.donews.net/TrackBack.aspx?PostId=186474

<src="/PromoteIcon.aspx?id=186474"type="text/javascript">[点击此处收藏本文]发表于 2004年11月28日 5:17PM

沧海笑一声 发表于2005-04-3010:30PMIP:221.221.205.*

附SQLServer中系统表作用

sysaltfil主数据库 保管数据库的文件

syscharset主数据库 字符集与排序顺序

sysconfigur主数据库 配置选项

syscurconfig主数据库 当前配置选项

sysdatabas主数据库 服务器中的数据库

syslanguag主数据库 语言

syslogin主数据库 登陆帐号信息

sysoledbus主数据库 链接服务器登陆信息

sysprocess主数据库 进程

sysremotelogin主数据库 远程登录帐号

syscolumn每个数据库 列

sysconstrain每个数据库 限制

sysfilegroup每个数据库 文件组

sysfil每个数据库 文件

sysforeignkei每个数据库 外部关键字

sysindex每个数据库 索引

sysmenb每个数据库 角色成员

sysobject每个数据库 所有数据库对象

syspermiss每个数据库 权限

systyp每个数据库 用户定义数据类型

sysus每个数据库 用户

沧海笑一声 发表于2005-04-3011:42PMIP:221.221.205.*

SQLServer平安检查列表

关键字 SQLServer平安检查列表

出处

转自:http://www.hdd120.net

不用说大家应该已经装置好了但是觉得最好还是这里提醒一下。 1.确认已经装置了NT/2000和SQLServer最新补丁顺序。

但是有时不能在异种的环境中使用。 2.评估并且选择一个考虑到最大的平安性但是同时又不影响功能的网络协议。多协议是明智的选择.

给这个帐户设定高强度的密码能影响某些功能的使用。 3.给 "sa"和 "probe"帐户设定强壮的密码来加强其安全性。设定一个强壮的密码并将其保存在一个安全的地方。注意:probe帐户被用来进行性能分析和分发传输。当在规范的平安模态中用的时候 .

4.使用一个低特权用户作为 SQL服务器服务的查询操作账户。文件?⒉岜砗褪褂谜呷ɡ?系?A CL同时被处理。不要用 LocalSystem或sa这个帐户应该有最小的权利 注意作为一个服务运行的权利是必需的和应该包含(但不停止)妥协的情况下对服务器的攻击。注意当使用企业管理器做以上设置时 .

且appropraitACL被应用。如果万一某人得到对系统的存取操作权限,而且系统文件是装置在NTFS分区。5.确定所有的SQL服务器数据。该层权限可以阻止入侵者破坏数据,防止造成一场大灾难。

至少使用ServerOption中的SQLExecutieCmdExec账户操作限制非sa用户使用XP_cmdshell6.如果不使用Xp_cmdshell就关掉。如果使用 SQL6.5..

任何的isql/osql窗口中(或查询分析器)

usemaster

execsp_dropextendedproc'xp_cmdshell'

对 SQLExecutiveCmdExec详细情况请检查下列文章:

http://support.microsoft.com/suppor...icle/Q159/2/21.

如果你不需要 xp_cmdshell那请停用它请记住一个系统系统管理员如果需要的话总是能把它增加回来。这也好也不好 -一个侵入者可能发现它不在只需要把他加回来。考虑也除去在下面的dll但是移除之前必需测试因为有些dll同时被一些程序所用。要找到其他顺序是否使用相同的dll:

首先得到该 dll

selecto.name.dbo.sysobjectowherec.id=o.idando.name='xp_cmdshellc.textfromdbo.syscomc.'

使用相同的dll发现其他扩展贮存操作是否使用该dll 其次.

selecto.name.dbo.sysobjectowherec.id=o.idandc.text='xplog70.dllc.textfromdbo.syscomc.'

用户可以用同样的方法处置下面方法中其他想去掉的进程。

一些企业管理器功能可能丢失).这些包括7.如不需要就停用对象连接与嵌入自动化贮存顺序 警告 -当这些贮存顺序被停用的时候 .:

Sp_OA Create

Sp_OA Destroy

Sp_OA GetErrorInfo

Sp_OA GetProperty

Sp_OA Method

Sp_OA SetProperty

Sp_OA Stop

这里正在做的锁定一个应用程序的功能 -开发平台应该放到其他机器上。如果你决定停用该进程那么请给他写一个脚本这样在以后你用到时候你能够把他重新添加回来 记住.

8.禁用你不需要的注册表存取程序。同上面的警告)这些包括:

Xp_regaddmultistring

Xp_regdeletekey

Xp_regdeletevalue

Xp_regenumvalues

Xp_regremovemultistring

所以他移除不被推荐。注意 :过去一直在这里列出 xp_regread/xp_regwrit但是这些顺序的移除影响一些主要功能包括日志和SP装置。

确认这样不会影响到任何的系统功能。下面是所推荐的有待你评估的一些列表9.移除其他认为会造成威胁的系统贮存进程。这种进程是相当多的而且他也会浪费一些cpu时间。小心不要首先在一个配置好的服务器上这样做。首先在开发的机器上测试。:

sp_sdidebug

xp_availablemedia

xp_cmdshell

xp_deletemail

xp_dirtree

xp_dropwebtask

xp_dsninfo

xp_enumdsn

xp_enumerrorlogs

xp_enumgroups

xp_enumqueuedtasks

xp_eventlog

xp_findnextmsg

xp_fixeddrives

xp_getfiledetails

xp_getnetname

xp_grantlogin

xp_logevent

xp_loginconfig

xp_logininfo

xp_makewebtask

xp_msvxp_perfend

xp_perfmonitor

xp_perfsample

xp_perfstart

xp_readerrorlog

xp_readmail

xp_revokelogin

xp_runwebtask

xp_schedulersignal

xp_sendmail

xp_servicecontrol

xp_snmp_getstate

xp_snmp_raisetrap

xp_sprintf

xp_sqlinventory

xp_sqlregister

xp_sqltrace

xp_sscanf

xp_startmail

xp_stopmail

xp_subdirs

xp_unc_to_drive

xp_dirtree

这使未经认可的不在syslogin表中使用者无权登陆一个有效的数据库服务器。 10.企业管理器中"平安选项"之下禁用默认登录。只有SQL6.5当使用整合的平安时候.

因为对他guest帐户是必需的 11.除去数据库的guest账户把未经认可的使用者据之在外。例外情况是master和 tempdb数据库.

请完全地禁用SQL邮件功能。存在使潜在攻击者递送潜在trojan病毒或是简单实现一个DOS攻击成为可能 12.若非必需。

13.检查master..Sp_helpstartup看有无可疑的木马进程。确定没有人已经在这里放置秘密的后门顺序。使用 Sp_unmakestartup移除任何可疑进程。

14.检查master..Sp_password看有无trojan代码。比拟你产品script和一个新安装的系统的默认script而且方便的保管。

15.记录所有的用户存取访问情况。从企业管理器做这些设定或通过以sa登陆进入查询分析器的下列各项:

xp_instance_regwritN'HKEY_LOCA L_MA CHINE'.N'A uditLevel',N'SOFTWA RE\Microsoft\MSSQLServer\MSSQLServer'.REG_DWORD,3

16.重写应用顺序使用更多用户定义的贮存和观察进程所以一般的对表的访问可以被禁用。这里你也应该看到由于不必经常进行查询计划操作而带来的性能提升。

17.除去不需要的网络协议。

18.注意SQL服务器的物理平安。把它锁在固定的房间里。就总是会找到一个方法进入。并且注意钥匙的平安。只要有机会到服务器面前。

19.建立一个计划的任务运行:

findstr/C:"LoginFailed"\mssql7\log\*.*'

因此你监测失败的登录尝试。这也为系统管理员提供一个好的记录攻击的方法。也有很多用来分析NT日志事件的第三者工具。注意:可能需要将路径换成你装置SQL路径。然后再重定向输出到一个文本文件或电子邮件。

发送一个电子邮件或信息到一个能够对问题及时响应的操作员。 20.设定非法访问和登陆失败日志警报。企业管理器中的"ManagSQLServerMessag"搜寻任何有关无权访问的消息 从查找"loginfailed"和"denied"开始).确定你所有感兴趣的信息被记录到事件日志。然后在这些信息上设定警报 .

确定没有人被授予了逾越必需的权限。 21.确定在服务器和数据库层次上的角色都只被授给了需要的用户。当 SQLServer平安模型 7有许多增强的时候,必需监控该层。也增加额外的许可层。

22.经常检查组或角色全体会员并且确定用组分配权限。公众的组不能从系统表执行选择操作。这样你审计工作能够简化。确定当你时候 .

23.花些时间审计用空密码登陆的请求。使用下面的代码进行空密码检查:

使用主体

 

 

password

fromsyslogins

wherpasswordisnull

ordbyname

24.如果可能。能够依赖系统的平安,组织中利用整合的平安战略。通过使用整合的平安战略。最大简化管理工作从维护二个分开的平安模型中分离开来。这也不让密码接近连接字串。

25.检查所有非sa用户的存取进程和扩充存储进程的权限。使用下面的查询定期的查询哪一个进程有公众存储权限。SQLServer中 使用 "type"而不是"xtype":

Usemaster

selectsysobjects.name

sysprotectfromsysobjects.s

whersysprotects.uid=0

'P' A NDxtype'X'.

A NDsysobjects.id=sysprotects.id

Ordbyname

企业管理器被发现在规范的平安模态中储存 "sa"密码在注册表的plaintext中。注意:即使你改变模态,使用整合的平安战略。过去。26.当时用企业管理器的时候。密码也会留在注册表中。使用 regedit而且检查键:

HKEY_CURRENT_USER\SOFTWA RE\Microsoft\

MSSQLServer\SQLEW\Regedi\

SQL6.5

现在数据被隐藏在

HKEY_USERS\{yourSID}\software\Microsoft\MicrosoftSQLserver\80\tool\SQLEW\registserverX\SQLservergroup

"SQLserver组"默认值但是可能已建立用户组因此相应地改变其位置)

27.发展一个审核计划而且订定每月的平安演讲。备份保护 ,对IT主管可用的报表包括任何的新exploit胜利的攻击 .和对象存取失败统计。

就有能用来获得管理员的存取特权得到管理员权限。 28.不要允许使用者交互式登陆到SQLServer之上。这个规则适用任何的服务器。一旦一个使用者能够交互式进入一个服务器之内.

30.尽力限制对SQLServer查询与存取操作。用户可以用最小权限查询sqlserver中的很多东西。若非必需不要给他机会

2011-01-1309:42:56转载