当系统本身有内存可以用的的时候,SQL Server 根据操作系统报告的物理内存加载动态增大和收缩其缓冲池(缓存)的大小。只要有足够的内存可用于防止内存页面交换(在 4 至 10 MB 之间),SQL Server 缓冲池就会继续增大。如果你想把sql的内存控制在某个数量,可以更改配置信息,
成都创新互联服务项目包括王屋网站建设、王屋网站制作、王屋网页制作以及王屋网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,王屋网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到王屋省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
1.打开企业管理器,展开服务器组。
2.单击该服务器,点击鼠标右键,单击属性菜单。
3.在弹出的对话框中单击内存选项卡。
可以看到SQLServer将动态配置内存的最大值修改为物理内存的最大值了
解决 SQL Server 耗尽内存的情况
如果碰到SQL Server服务造成内存不断扩展最终系统死机等情况,请按照以下方法解决。
原理:SQL Server 2000引入的动态内存分配机制,一般不能很好的回收内存,如果计算机一直不关闭,就会发生内存耗尽的可能。可以选择每周关机一次来避免,或者是按照下述方法来抑制内存的增长。
1、在服务器上开始—Microsoft SQL Server—企业管理器 中启动SQL企业管理器
2、启动以后打开右边的控制台树:控制台根目录\Microsoft SQL server\Sql Server组\(Local) 。
3、在(Local)节点上单击鼠标右键,选择"属性"菜单,可以看到一个 SQl Server属性(配置) 窗体
4、选择"内存"舌标,打开内存配置页面。将内存的最大值限定在一定的范围内,一般按照以下比例:
a) 如果仅仅用于数据库服务器,为总内存的80-90%
b) 如果兼任域服务器,一般为60-70%
c) 如果还兼任WEB服务器,建议最大为60%
5、设定完毕点击确定,然后重新启动SQl Server服务使之生效即可。
解决服务器的w3wp.exe进程占用cpu和内存过多的问题
解决CPU占用过多:
1、在IIS中对每个网站进行单独的应用程序池配置。即互相之间不影响。
2、设置应用程序池的CPU监视,不超过30%(一个程序池20个站),每分钟刷新,超过限制时关闭。
根据w3wp取得是哪一个应用程序池:
1、在任务管理器中增加显示pid字段。就可以看到占用内存或者cpu最高的进程pid
2、在命令提示符下运行iisapp -a。注意,第一次运行,会提示没有js支持,点击确定。然后再次运行就可以了。这样就可以看到pid对应的应用程序池。(iisapp实际上是存放在C:\windows\system32目录下的一个VBS脚本,全名为iisapp.vbs,如果你和我一样,也禁止了Vbs默认关联程序,那么就需要手动到该目录,先择打开方式,然后选“Microsoft (r) Windows Based Script. Host”来执行,就可以得到PID与应用程序池的对应关系。)
3、到iis中察看该应用程序池对应的网站,就ok了,做出上面的内存或CPU方面的限制,或检查程序有无死循环之类的问题。
解决内存占用过多,可以做以下配置:
1、在IIS中对每个网站进行单独的应用程序池配置。即互相之间不影响。
2、设置应用程序池的回收时间,去掉默认为1720,设置固定时间回收(在下列时间回收工作进程:00:01 06:01 12:01)。再设置当内存占用超过多少(如192M 10个站一个程序池时),就自动回收内存。
3、在性能中设置启用CPU监视
最大使用率 30%
刷新率 1分钟
操作:关闭
1、 要限制一个站点的CPU使用,必须将该站点设置为独立应用程序池,共用应用程序池是无法限制单个站点的。IIS独立应用程序池,就需要独立的进程,非常消耗内存。独立池越多,就有越多的W3WP进程。对于每个站点均要独立应用程序池的服务器,在一般的普通P43.0 2G内存 的普通服务器上,建议不要超过50个站点,最好30以内,不然服务器压力非常大。在配置上,我一般把资源消耗较大的网站独立一个池,一般普通BBS或者生成HTML的系统大概5个站一个池。普通网站以及一些企业站点均共用一个池。
2、根据wlmmc的经验,在服务器硬件允许的情况下,一般不要限制站点内存使用,这样能够保证网站运行,不会出现用户掉线情况。需要限制某站的最大虚拟内存不要小于64M,不然可能出现一些未知的错误。
3、这些都不是根本解决办法,它的根本问题是网站程序有问题,要解决根本问题还要从程序查起。根据本文开头提到的方法查到具体的应用程序池,找到使用此应用程序池的网站,解决网站程序存在的问题,如死循环之类。
4、除了w3wp.exe, 在调用数据库进行大量查询操作的时候,也会大量占用CPU资源,这是难免的(数据库方面的语句及结构优化不在本文讨论范围之内)。个人认为,只要不是CPU长时间占用100%, 一般在75%左右都是正常的。
没什么好怕的, 如果你的使用量太大, sqlserver会占用所有内存, 这是正常现象。
你唯一需要注意的是:
1. SqlServer服务器的cpu高不高?(看任务管理器)
2. 慢的SQL有哪些?
下面的sql可以帮你, 应该直接在服务器上查询:
SQL code?
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].Proc_DBA_GetSlowSQL') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].Proc_DBA_GetSlowSQL
GO
-- =============================================
-- Author: yenange
-- Create date: 2015-12-17
-- Description: 取得最近执行缓慢的SQL语句
-- =============================================
CREATE PROCEDURE dbo.Proc_DBA_GetSlowSQL
@topNum INT = 50 --取前多少条记录
,@lastExecutionTime DATETIME = NULL --最后执行时间, 默认为NULL. 为 NULL 则忽略此条件; 不为NULL 则取大于此参数之后执行的
,@excludeNight BIT=1 --是否 排除晚上的信息? 默认=1 排除。选择是=1,后面两参数才有意义
,@nightBegin CHAR(5)='22:00' --"晚上"开始时间点, 默认 22:00
,@nightEnd CHAR(5)='06:00' --"晚上"结束时间点, 默认 06:30
,@containSQL NVARCHAR(300)=NULL --语句中包含的SQL. 默认为NULL. 为NULL则忽略此条件; 不为NULL则取包含此参数的记录
AS
BEGIN
SET NOCOUNT ON
DECLARE @nightBegin_num INT
DECLARE @nightEnd_num INT
SET @nightBegin_num=CAST( replace(@nightBegin,':','') AS INT)
SET @nightEnd_num=CAST( replace(@nightEnd,':','') AS INT)
SET ROWCOUNT @topNum
SELECT
st.text AS SQL_Full --父级完整语句
,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset END
- qs.statement_start_offset)/2) + 1) as SQL_Part --统计对应的部分语句
, CAST( ((qs.total_elapsed_time / 1000000.0)/qs.execution_count) AS DECIMAL(28,2) ) AS [平均消耗秒数]
, CAST(qs.last_elapsed_time / 1000000.0 AS DECIMAL(28, 2)) AS [最后完成消耗秒数]
, qs.last_execution_time AS [最后执行时间]
, CAST(qs.min_elapsed_time / 1000000.0 AS DECIMAL(28, 2)) AS [最小消耗秒数]
, CAST(qs.max_elapsed_time / 1000000.0 AS DECIMAL(28, 2)) AS [最大消耗秒数]
, CAST(qs.total_elapsed_time / 1000000.0 AS DECIMAL(28, 2)) AS [总消耗秒数]
, (qs.execution_count) AS [总执行次数]
, creation_time AS [编译计划的时间]
, CAST(qs.last_worker_time / 1000000.0 AS DECIMAL(28, 2)) AS [最后完成占用CPU秒数]
, sql_handle,statement_start_offset,statement_end_offset
,plan_generation_num,plan_handle,creation_time
,last_execution_time,execution_count
,total_worker_time,last_worker_time,min_worker_time,max_worker_time
,total_physical_reads,last_physical_reads,min_physical_reads,max_physical_reads,total_logical_writes,last_logical_writes,min_logical_writes,max_logical_writes,total_logical_reads,last_logical_reads,min_logical_reads,max_logical_reads
,total_clr_time,last_clr_time,min_clr_time,max_clr_time
from sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
WHERE
--1. 最后执行时间
(@lastExecutionTime IS NULL OR qs.last_execution_time=@lastExecutionTime)
--2. 包含 SQL 条件
AND
(@containSQL IS NULL OR st.[text] LIKE '%'+@containSQL+'%')
AND
--3. 是否排除晚上
(
@excludeNight=0
OR
(
--2.1 开始大于结束 22:00-6:30 [ x =6:30(end) and x22:00(begin) ]
@nightBegin_num@nightEnd_num AND
(
CAST( replace(CONVERT(varchar(5),last_execution_time,108),':','') AS INT)=@nightEnd_num
AND
CAST( replace(CONVERT(varchar(5),last_execution_time,108),':','') AS INT)@nightBegin_num
)
)
OR
(
--2.2 开始小于结束 1:00-6:30 [ x=0:00 and x1:00 or x=6:30 and x24:00 ]
@nightBegin_num@nightEnd_num AND
(
(
CAST( replace(CONVERT(varchar(5),last_execution_time,108),':','') AS INT)=0
AND
CAST( replace(CONVERT(varchar(5),last_execution_time,108),':','') AS INT)@nightBegin_num
)
OR
(
CAST( replace(CONVERT(varchar(5),last_execution_time,108),':','') AS INT)=@nightEnd_num
AND
CAST( replace(CONVERT(varchar(5),last_execution_time,108),':','') AS INT)2400
)
)
)
)
ORDER BY qs.last_elapsed_time DESC
SET NOCOUNT OFF
SET ROWCOUNT 0
END
GO
EXEC sys.sp_addextendedproperty
@name=N'Version', @value=N'1.1' ,
@level0type=N'SCHEMA',@level0name=N'dbo',
@level1type=N'PROCEDURE',@level1name=N'Proc_DBA_GetSlowSQL'
在数据库管理(ssms)中,右击你的数据库,在属性中查看数据文件存放位置。看一看到底有没有mdf.
不论是mdf,ndf,ldf,这些扩展名都是可以自定义的。
若是真的缺少一个mdf文件,还没有备份的话,就得考虑从磁盘恢复mdf文件了(用第三方软件或找专业恢复人员)。