数据库维护常用语句.docx

上传人:b****8 文档编号:10952663 上传时间:2023-02-23 格式:DOCX 页数:23 大小:24.80KB
下载 相关 举报
数据库维护常用语句.docx_第1页
第1页 / 共23页
数据库维护常用语句.docx_第2页
第2页 / 共23页
数据库维护常用语句.docx_第3页
第3页 / 共23页
数据库维护常用语句.docx_第4页
第4页 / 共23页
数据库维护常用语句.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

数据库维护常用语句.docx

《数据库维护常用语句.docx》由会员分享,可在线阅读,更多相关《数据库维护常用语句.docx(23页珍藏版)》请在冰豆网上搜索。

数据库维护常用语句.docx

数据库维护常用语句

数据库维护常用语句

编制:

郁涛

文件编号:

版本:

1.0

审核:

会签:

批准:

修订历史记录

日期

版本

说明

作者

2016/12/16日

1.0

数据库维护常用语句

郁涛

目录

第I条背景3

第II条MSSQL常用语句3

节2.01K3数据库重启方法3

节2.02K3查看是否有死锁4

节2.03MSSQL性能监控SQL语句4

节2.04tempdb空间清理方法10

节2.05查询所有的占用空间大小和行数11

节2.06找出执行慢的SQL语句12

第III条MySql维护常用命令13

节3.01连接MYSQL13

节3.02修改密码13

节3.03增加新用户14

节3.04显示命令14

节3.05备份数据库16

第IV条Oracle维护常用语句16

节4.01oracle常规命令16

节4.02查看数据库的SQL17

节4.03ORACLE用户连接的管理18

第I条背景

主要用于MSSQL日常维护。

第II条MSSQL常用语句

节II.01K3数据库重启方法

--1、重启中间层

--2、清除数据库连接

--3、重启数据库

--4、重新运行所有相关功能

--清除所有数据库连接,然后重起服务器来设放temp空间

declare@sqlvarchar(100)

while1=1

begin

selecttop1@sql='kill'+cast(spidasvarchar(3))frommaster..sysprocesseswherespid>50andspid<>@@spid

if@@rowcount=0

break

exec(@sql)

end

select*frommaster..sysprocesseswherespid>50andspid<>@@spid

 

节II.02K3查看是否有死锁

execmaster.dbo.sp_who_lock

节II.03MSSQL性能监控SQL语句

selectconvert(numeric(5,4),sum(signal_wait_time_ms)/sum(wait_time_ms))

fromSys.dm_os_wait_stats

--计算'Cxpacket'占整wait时间的百分比

--Cxpacket:

SqlServer在处理一句代价很大的语句,要不就是没有合适的索引或筛选条件没能筛选足够的记录,使得语句要返回大量的结果,当>5%说明有问题

declare@Cxpacketbigint

declare@Sumwaitsbigint

select@Cxpacket=wait_time_ms

fromSys.dm_os_wait_stats

wherewait_type='Cxpacket'

select@Sumwaits=sum(wait_time_ms)

fromSys.dm_os_wait_stats

selectconvert(numeric(5,4),@Cxpacket/@Sumwaits)

--查询当前数据库上所有用户表格在Rowlock上发生阻塞的频率

declare@dbidint

select@dbid=db_id()

Selectdbid=database_id,objectname=object_name(s.object_id),

indexname=i.name,i.index_id

--,partition_number,row_lock_count,

row_lock_wait_count,[block%]=cast(100.0*row_lock_wait_count/(1+row_lock_count)

asnumeric(15,2)),row_lock_wait_in_ms,

[avgrowlockwaitsinms]=cast(1.0*row_lock_wait_in_ms/(1+row_lock_wait_count)

asnumeric(15,2))

fromsys.dm_db_index_operational_stats(@dbid,NULL,NULL,NULL)s,

sys.indexesiwhereobjectproperty(s.object_id,'IsUserTable')=1

andi.object_id=s.object_idandi.index_id=s.index_id

order

byrow_lock_wait_countdesc

--返回当前数据库所有碎片率大于25%的索引

--运行本语句会扫描很多数据页面

--避免在系统负载比较高时运行

--避免在系统负载比较高时运行

declare@dbidint

select@dbid=db_id()

SELECTo.nameastablename,s.*

FROMsys.dm_db_index_physical_stats(@dbid,NULL,NULL,NULL,NULL)s,

sys.objectso

whereavg_fragmentation_in_percent>25ando.object_id=s.object_id

orderbyavg_fragmentation_in_percentdesc

GO

--当前数据库可能缺少的索引

selectd.*,s.avg_total_user_cost,

s.avg_user_impact,s.last_user_seek,

s.unique_compiles

fromsys.dm_db_missing_index_group_statss,

sys.dm_db_missing_index_groupsg,

sys.dm_db_missing_index_detailsd

wheres.group_handle=g.index_group_handle

andd.index_handle=g.index_handle

orderbys.avg_user_impactdesc

--自动重建或重新组织索引

SETNOCOUNTON;DECLARE@objectidint;DECLARE@indexidint;DECLARE@partitioncountbigint;

DECLARE@schemanamenvarchar(130);DECLARE@objectnamenvarchar(130);

DECLARE@indexnamenvarchar(130);DECLARE@partitionnumbigint;

DECLARE@partitionsbigint;DECLARE@fragfloat;DECLARE@commandnvarchar(4000);

--Conditionallyselecttablesandindexesfromthesys.dm_db_index_physical_statsfunction

--andconvertobjectandindexIDstonames.

SELECTobject_idASobjectid,index_idASindexid,partition_numberASpartitionnum,avg_fragmentation_in_percentASfrag

INTO

#work_to_do

FROMsys.dm_db_index_physical_stats(DB_ID(),

NULL,NULL,NULL,'LIMITED')

WHEREavg_fragmentation_in_percent>10.0ANDindex_id>0;

--Declarethecursorforthelistofpartitionstobeprocessed.

DECLAREpartitionsCURSORFORSELECT*FROM#work_to_do;

--Openthecursor.

OPENpartitions;

--Loopthroughthepartitions.

WHILE(1=1)

BEGIN;FETCHNEXTFROMpartitions

INTO@objectid,@indexid,@partitionnum,@frag;

IF@@FETCH_STATUS<0BREAK;

SELECT@objectname=QUOTENAME(o.name),@schemaname=QUOTENAME(s.name)

FROMsys.objectsASoJOINsys.schemasassONs.schema_id=o.schema_id

WHEREo.object_id=@objectid;

SELECT@indexname=QUOTENAME(name)

FROMsys.indexes

WHEREobject_id=@objectidANDindex_id=@indexid;

SELECT@partitioncount=count(*)FROMsys.partitions

WHEREobject_id=@objectidANDindex_id=@indexid;

--30isanarbitrarydecisionpointatwhichtoswitchbetweenreorganizingandrebuilding.

IF@frag<30.0

SET@command=N'ALTERINDEX'+@indexname+N'ON'+@schemaname+N'.'+@objectname+N'REORGANIZE';

IF@frag>=30.0

SET@command=N'ALTERINDEX'+@indexname+N'ON'+@schemaname+N'.'+@objectname+N'REBUILD';

IF@partitioncount>1

SET@command=@command+N'PARTITION='+CAST(@partitionnumASnvarchar(10));

EXEC(@command);

PRINTN'Executed:

'+@command;END;

--Closeanddeallocatethecursor.

CLOSEpartitions;

DEALLOCATEpartitions;

--Dropthetemporarytable.

DROPTABLE#work_to_do;

GO

--查看当前数据库索引的使用率

SELECT

object_name(object_id)astable_name,

(selectnamefromsys.indexes

whereobject_id=stats.object_id

andindex_id=stats.index_id)

asindex_name,*

FROMsys.dm_db_index_usage_stats

asstats

WHEREdatabase_id=DB_ID()orderbytable_name

--指定表的索引使用情况

declare@tableasnvarchar(100)

set@table='Table_1';

SELECT(selectnamefromsys.indexes

whereobject_id=stats.object_idandindex_id=stats.index_id)

asindex_name,*

FROMsys.dm_db_index_usage_statsasstats

whereobject_id=object_id(@table)

orderbyuser_seeks,user_scans,user_lookupsasc

最经常做重编译的存储过程

selecttop25sql_text.text,sql_handle,plan_generation_num,execution_count,

dbid,objectid

fromsys.dm_exec_query_statsa

crossapplysys.dm_exec_sql_text(sql_handle)assql_text

whereplan_generation_num>1

orderbyplan_generation_numdesc

sp_lock

selectOBJECT_NAME(objid)

dbccinputbuffer(spid)

select@@spid

kill58WITHSTATUSONLY

EXECsp_who'active'

查询系统中死锁的SQL语句

declare@spidint,@blint,

@intTransactionCountOnEntryint,

@intRowcountint,

@intCountPropertiesint,

@intCounterint

createtable#tmp_lock_who(

idintidentity(1,1),

spidsmallint,

blsmallint)

IF@@ERROR<>0print@@ERROR

insertinto#tmp_lock_who(spid,bl)select0,blocked

from(select*fromsysprocesseswhereblocked>0)a

wherenotexists(select*from(select*fromsysprocesses

whereblocked>0)b

wherea.blocked=spid)

unionselectspid,blockedfromsysprocesseswhereblocked>0

IF@@ERROR<>0print@@ERROR

--找到临时表的记录数

select@intCountProperties=Count(*),@intCounter=1

from#tmp_lock_who

IF@@ERROR<>0print@@ERROR

if@intCountProperties=0

select'现在没有阻塞和死锁信息'asmessage

--循环开始

while@intCounter<=@intCountProperties

begin

--取第一条记录

select@spid=spid,@bl=bl

from#tmp_lock_whowhereId=@intCounter

begin

if@spid=0

select'引起数据库死锁的是:

'+CAST(@blASVARCHAR(10))

+'进程号,其执行的SQL语法如下'

else

select'进程号SPID:

'+CAST(@spidASVARCHAR(10))+'被'

+'进程号SPID:

'+CAST(@blASVARCHAR(10))+'阻塞,其当前进程执行的SQL语法如下'

DBCCINPUTBUFFER(@bl)

end

--循环指针下移

set@intCounter=@intCounter+1

end

select*from#tmp_lock_who

droptable#tmp_lock_who

select@@lock_timeout

查看锁信息

select进程id=req_spid

数据库=db_name(rsc_dbid)

类型=casersc_typewhen1then'NULL资源(未使用)'

when2then'数据库'

when3then'文件'

when4then'索引'

when5then'表'

when6then'页'

when7then'键'

when8then'扩展盘区'

when9then'RID(行ID)'

when10then'应用程序'

end

rsc_objid,rsc_indid

frommaster..syslockinfo

select*fromsys.dm_tran_locks

SETSHOWPLAN_ALLON;SETSTATISTICSIOon;SETSTATISTICSTIMEon

-----------------------------------------------------

--列出最初锁住资源,导致一连串其他进程被锁住的起始源头

-----------------------------------------------------

IFEXISTS(SELECT*FROMmaster.sys.sysprocessesWHEREspid

IN(SELECTblockedFROMmaster.sys.sysprocesses))

--确定有进程被其他的进程锁住

SELECT

DISTINCT'进程ID'=STR(a.spid,4)

'进程ID状态'=CONVERT(CHAR(10),a.status)

'登入帐号'=SUBSTRING(SUSER_SNAME(sid),1,30)

'工作站名称'=CONVERT(CHAR(10),a.hostname)

'执行命令的用户'=CONVERT(CHAR(10),SUSER_NAME(a.uid))

'是否被锁住'=CONVERT(char(3),blocked)

'数据库名'=CONVERT(CHAR(10),DB_NAME(a.dbid))

'正在执行的命令'=CONVERT(CHAR(16),a.cmd)

'登录名'=a.loginame

'执行语句'=b.text

'等待型态'=a.waittype

FROMmaster..sysprocessesaCROSSAPPLYsys.dm_exec_sql_text(a.sql_handle)b

--列出锁住别人(在别的进程中blocked字段出现的值),但自己未被锁住(blocked=0)

WHEREspidIN(SELECTblockedFROMmaster.sys.sysprocesses)

ANDblocked=0

ELSE

SELECT'NoBlockedSession(s)'

--a.status=suspended,a.blocked(阻塞者id)

--DBCCINPUTBUFFER(阻塞者id);

--就可以看到语句了或者join

---------------------------------------------------

--经常出现的是,在sysprocesses视图中status是'sleeping',waittype字段是0x0000,打开事务数open_tran大于0,一般都是交易已经激活但迟迟没有结束,就可能是程序没有管理好交易管理

-----------------------------------------------------

selecta.*,b.text

frommaster.sys.sysprocessesa

CROSSAPPLYsys.dm_exec_sql_text(a.sql_handle)b

wherea.status='sleeping'anda.waittype=0x0000anda.open_tran>0

selectt1.resource_typeas[资源锁定类型]

db_name(resource_database_id)as[数据库名]

t1.resource_associated_entity_idas[锁定的对象]

t1.request_modeas[等待者需求的锁定类型]

t1.request_session_idas[等待者sid]

t2.wait_duration_msas[等待时间]

(selecttextfromsys.dm_exec_requestsasr

crossapplysys.dm_exec_sql_text(r.sql_handle)

wherer.session_id=t1.request_session_id)as[等待者要执行的批次]

(selectsubstring(qt.text,r.statement_start_offset/2+1,

(casewhenr.statement_end_offset=-1

thendatalength(qt.text)

elser.statement_end_offsetend-r.statement_start_offset)/2+1)

fromsys.dm_exec_requestsasr

crossapplysys.dm_exec_sql_text(r.sql_handle)asqt

wherer.session_id=t1.request_session_id)as[等待者正要执行的语法]

t2.blocking_session_idas

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 自然景观

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1