关于tempdb空间无法自动释放的问题!

atoon 2003-08-22 09:28:08
我们的应用采用c/s模式,已经使用了7年了,最近将客户端从6个增加到9个,开始使用时一切正常,25M的tempdb足够使用。
可最近遇到这样一种情况,使用sql server6.5时,tempdb不到一天时间就被添满,我无奈将其转移到一个新设备上,data扩至100M,但问题没有实质解决,两天也就把空间吃空了,而且越吃越快。
我检查了一下,sysobjects里全是临时存储过程,而且大多还是如:creat proc ##select c from table where name = 'xxxx';之类的单条查询,实在让人费解。

现在connect一般在34个左右,我重启客户端,临时存储过程只有少量减少,并不能全部释放,我只好频繁的重启sql server,才能重新得到空间。

请各位帮俺想个办法,不然我只好天天在单位值班,等待重启。
...全文
1223 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
atoon 2003-09-19
  • 打赏
  • 举报
回复
看来是odbc的原因,没想到造成问题的竟然是这种失误,值得反省

感谢大家帮助,结帖了
shizi_mhy 2003-09-16
  • 打赏
  • 举报
回复
mark
atoon 2003-09-16
  • 打赏
  • 举报
回复
对不起,最近忙了点别的事

我现在暂时采用了扩500M的tempdb(哈,没办法),一周一重启,凑合着用吧!

楼上两位关于odbc的说法,我尽快试试,我觉得差不多是这个原因,因为换机器时,odbc版本换了。

多谢!我将尽快结帖

yonghengdizhen 2003-08-31
  • 打赏
  • 举报
回复
看来是odbc选项设置的问题.
程序当然本身也需要优化.

“为准备好的 SQL 语句创建临时存储过程并放弃存储过程”复选框

当清除时,Microsoft(R) SQL Server(TM) 驱动程序不会创建支持 SQLPrepare ODBC 函数的存储过程。选定之后,SQL Server 驱动程序创建临时存储过程,以支持 SQLPrepare ODBC 函数。此复选框和它关联的选项只在连接早期版本 SQL Server 时才相关。

“只有当断开时”选项按钮

表示当调用 SQLDisconnect ODBC 函数时,放弃为 SQLPrepare 创建的临时存储过程。如果多次准备的是相同的 SQL 语句,就允许驱动程序重复使用存储过程,并缩减当应用程序运行时放弃与存储过程相关的系统开销。当应用程序不间断地运行了很久,或者当应用程序发出多个 SQLPrepare 调用时,选择此选项可导致建立临时存储过程。

“当断开时和连接时同样适用”选项按钮

表示为 SQLPrepare 创建的临时存储过程在下述情况下被放弃:当调用 SQLDisconnect 时、当为语句句柄调用 SQLFreeHandle 时,当在相同的语句句柄中为处理新的 SQL 语句而调用 SQLPrepareor 或 SQLExecDirect 时,或当调用目录函数时。因为临时存储过程是在应用程序运行时放弃的,因此会产生系统开销,但这防止了运行时间较长的应用程序建立临时存储过程。
xlch_csdn 2003-08-28
  • 打赏
  • 举报
回复
标记一下
Yang_ 2003-08-28
  • 打赏
  • 举报
回复
我的那个存储过程在这里不合适,改不了的,ODBC用局部的临时存储过程,只有创建这个存储过程的连接可以删除。


Yang_ 2003-08-28
  • 打赏
  • 举报
回复
应该是odbc没有及时删除临时存储过程的原因,odbc有一个“为预定义的SQL语句创建临时存储过程,并删除该存储过程”的选项,你在客户端改改这个选项试试。

看看新加的客户端的选象是不是和其他的不同。

lionstar 2003-08-28
  • 打赏
  • 举报
回复
建议使用dbcc checkdb 'tempdb' 试验一下
我个人感觉可能是SQL SERVER6.5的tempdb数据库数据文件页面分配错误,造成无法收缩。

开心就好!!!
atoon 2003-08-27
  • 打赏
  • 举报
回复
Yang_(扬帆破浪)
临时存储过程名如:#odbc#dlkfq123025_______00000000000001
名字长度全都相同,我用各种方法删除不掉

drop procedure #odbc#dlkfq123025_______00000000000001
提示:select permission denied on object "#odbc#dlkfq123025_______00000000000001",database tempdb,owner dlkfq
用sa 登陆也是一样


shaken 2003-08-27
  • 打赏
  • 举报
回复
中了什么木马??我好奇,想知道!!!
Yang_ 2003-08-26
  • 打赏
  • 举报
回复
给个6.5的存储过程暂时顶一下!

用法:挂在你自己的库,必要时运行exec del_tempProc,清除30分钟前建立的临时存储过程;也可以自己搞一个任务,每30分钟自动执行一次。

但是关键还是在找出原因,我估计是系统资源紧张+程序效率低



CREATE Procedure del_tempProc
AS

/******************************************************************************
** File:
** Name: del_tempProc
** Desc:
**
** Return values:
**
** Called by:
**
** Parameters:
** Input Output
** ---------- -----------
**
** Auth: Haiwer
** Date: 2003-8-26
*******************************************************************************
** Change History
*******************************************************************************
** Date: Author: Description:
** -------- -------- -------------------------------------------
**
*******************************************************************************/


set nocount on

declare @name varchar(30),
@crdate datetime

exec(' use tempdb
declare _cur_del_tempTable scroll cursor for
select name, crdate from sysobjects where name like ''##%'' and type = ''P''
for read only ')

open _cur_del_tempTable

fetch next from _cur_del_tempTable into @name, @crdate
while( @@fetch_status <> -1 )
begin
if( @@fetch_status <> -2 )
begin
if( datediff(minute,@crdate,getdate()) > 30 )
exec('set quoted_identifier on drop proc tempdb.."' + @name + '"' )
end
fetch next from _cur_del_tempTable into @name,@crdate
end
close _cur_del_tempTable
deallocate _cur_del_tempTable




GO
Yang_ 2003-08-26
  • 打赏
  • 举报
回复
1、临时存储过程和通过ODBC的访问方式有关,能不能修改程序?比如改成用ado访问。
2、客户端虽然只增加了3个,但是却是原来的1/2,按道理系统资源也应该增加1/2。
3、一共有多少内存?怎么分配的?6.5的tempdb是放在内存的。内存资源也许是关键。
4、库的数据空间和日志空间是否分开了?
5、索引应该定时重建
6、open objects 选项是限制同时打开的数据库对象数,这个参数占用内存不多,你不妨改成原来的3/2倍试试。
剑胆琴心 2003-08-26
  • 打赏
  • 举报
回复
程序的问题,还是当初负责人流程不清楚,造成的程序黑洞~`
atoon 2003-08-26
  • 打赏
  • 举报
回复
我的server是alphaSE 4000,nt4.0 server
工作站nt4.0 workstation,客户端通过odbc连接数据库

happydreamer(小黑-潜水中)

还是不行,不过通过重建索引,似乎吃空间的速度有所降低,看来索引是问题之一,但并非全部。

shaken(shaken) 所说的几点
所有机器安装了正版kill,最近杀过毒,确实有过蠕虫、木马,但已经杀掉了

网络我无法确定,因为确实存在少量丢包现象,但不应该造成这么大量的数据积压吧,我想主要的问题还是在数据库吧,因为以前系统都正常,扩坐席之后也正常运行了两个星期,而且我也无法组织大规模的网络测试,
其它也能确保无问题
不知,“按照你说的现象,有可能进入死锁了”是指?sp_who并未发现

Yang_(扬帆破浪)
我认为open object扩再大,还是会被用尽,tempdb中sysobjects的记录轻易就会累积到上万条,而且不断增加。本数据库客户端通过odbc连接数据库,纯通过mis系统访问
Yang_ 2003-08-26
  • 打赏
  • 举报
回复
关于:
〉〉sysobjects里全是临时存储过程,而且大多还是如:creat proc ##select c from
〉〉table where name = 'xxxx';之类的单条查询,实在让人费解。

这个语句是建立临时存储过程的,是不是你用一些odbc的客户端直接访问数据库?比如excel等?
Yang_ 2003-08-26
  • 打赏
  • 举报
回复
从提示看,你的问题关键是服务器配置参数“OPEN OBJECTS ”太小的问题。

你打开企业管理器,在服务器名点右键,选Configure,选Configuration,把“OPEN OBJECTS ”稍微改大一些。

增加客户端可能相关还有些参数需要修改,6.5比较麻烦。

Yang_ 2003-08-26
  • 打赏
  • 举报
回复
什么时候换的服务器,会不会和换服务器有关?
Yang_ 2003-08-26
  • 打赏
  • 举报
回复
如果服务器不作他用,分给数据库的内存还可以再多些。

查看锁的情况,查看在报错的时候主要使用的功能,看看这部分功能的效率问题

查看procedure cache参数,一般设置在35左右合适,你的用存储过程比较多(用odbc访问),可以适当改大一些,不要超过60。

atoon 2003-08-26
  • 打赏
  • 举报
回复
qwbyxw(随缘)
8M一会儿就没了,现在关键在于tempdb不清理以往记录

Yang_(扬帆破浪)
共192M,分给数据库128M
原先的机器64M的pc 服务器一样正常好用,现在实质已算升级了

用户实际参加录入的只增加了一两个,不应该有太大影响吧,conection我定义了100

存储过程我试试,谢谢

qwbyxw 2003-08-26
  • 打赏
  • 举报
回复
1.根据应用需求分配合适的空间给tempdb数据文件,这样可避免tempdb数据库频繁增长,初始默认大小为8MB。

2.用户数据库还得进行及时的维护:备份数据文件,备份日志文件,甚至裁剪不需要的日志内容;
这也需要根据实际情况确定其周期,这也有助于tempdb数据库的自我调整。
我们试过,当一个用户数据库不能进行正常的维护的时候,tempdb数据库将不停的增长。

希望对你的问题有帮助?
加载更多回复(16)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧