视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
由于文件组‘DEFAULT’中的磁盘空间不足,无法为数据库‘TEMPDB’分配新页
2020-11-09 13:41:19 责编:小采
文档


今天接到一个朋友的问题,sql server报由于文件组 DEFAULT 中的磁盘空间不足,无法为数据库 TEMPDB 分配新页,按照错误提示应该是tempdb空间不足,让其查看tempdb对应数据库文件大小为不到4g,查看其对应文件为自增长,硬盘空间还有40g多点,那应该没有问题

  今天接到一个朋友的问题,sql server报“由于文件组 ‘DEFAULT’ 中的磁盘空间不足,无法为数据库 ‘TEMPDB’ 分配新页”,按照错误提示应该是tempdb空间不足,让其查看tempdb对应数据库文件大小为不到4g,查看其对应文件为自增长,,硬盘空间还有40g多点,那应该没有问题。后来她说该文件所处位置的盘是fat32的,那问题确定是fat32最大支持文件大小是4g。解决办法:

  1、让tempdb中的文件恢复默认值,设置其最大值

  1)重启sql server服务,tempdb一般会自动变为初始化大小

  2)如果1)失败,使用下面语句

  dbcc shrinkfile (tempdev, 10)

  dbcc shrinkfile (templog, 10)

  2)然后设置tempdev和templog的最大大小为4000m

  2、添加数据文件和日志文件,并设置其最大值为4000m

  3、修改程序,从根源上解决问题

  分析产生该问题原因

  询问朋友后,原来是她对一个6kw的表和1kw的表进行关联,然后取得需要的数据插入到另一张表中,因为涉及的数据量非常大,所有导致tempdb数据库飞速增大,超过系统文件大小。导致文章开始的错误,光添加文件,对于这么大数据量的程序来说还是不能解决问题。应该在程序上去优化,而不是靠添加tempdb中文件的大小和数量来解决问题。

  添加程序的提交次数,而不是所有数据一次提交,放在一个事物中。

  我根据程序需求模拟的写了两种处理过程的方法

  模拟环境:

  --创建模拟表

  SELECT id,name INTO t_1 FROM sys.sysobjects;

  SELECT object_id id,name INTO t_2 FROM sys.columns;

  --创建跟踪表

  CREATE TABLE t_s (id int DEFAULT 0,date datetime DEFAULT getdate());

  INSERT INTO t_s VALUES(0,getdate());

  --创建需要插入数据表

  SELECT t1.name n1,

  t2.name n2,

  t1.id

  INTO test_1

  FROM t_1 t1,

  t_2 t2

  WHERE t1.id = t2.id

  AND 1=2;

  方法一:

  特点:1、优点执行效率比较高,无需排序和插入跟踪表

  2、缺点:不能查看程序执行进度,如果异常终止,必须重新执行

  create PROCEDURE [dbo].[INSERT_d_1]

  AS

  DECLARE @name1 varchar(4000)

  DECLARE @name2 varchar(4000)

  DECLARE @id int

  DECLARE c1 CURSOR

  FOR

  SELECT t1.name,

  t2.name,

  t1.id

  FROM t_1 t1,

  t_2 t2

  WHERE t1.id = t2.id

  ORDER BY

  t1.id

  open c1

  fetch next from c1 into @name1,@name2,@id

  WHILE @@fetch_status=0

  BEGIN

  INSERT INTO test_1 VALUES(@name1,@name2,@id)

  FETCH next FROM c1 INTO @name1,@name2,@id

  END

  CLOSE c1

  DEALLOCATE c1

  方法二:

  特点:1、可以跟踪程序的执行进度查询t_s表,如果异常终止可以写其他程序继续

  2、程序使用二重游标,执行效率比较低

  create PROCEDURE [dbo].[INSERT_d_2]

  AS

  DECLARE @name1 varchar(4000)

  DECLARE @name2 varchar(4000)

  DECLARE @id int

  DECLARE c1 CURSOR

  FOR

  SELECT t1.name,

  t1.id

  FROM t_1 t1

  ORDER BY t1.id

  open c1

  fetch next from c1 into @name1,@id

  WHILE @@fetch_status=0

  BEGIN

  --二重循环

  DECLARE c2 CURSOR FOR

  SELECT t2.name FROM t_2 t2 WHERE t2.id=@id

  OPEN c2

  FETCH next FROM c2 INTO @name2

  WHILE @@FETCH_STATUS=0

  BEGIN

  INSERT INTO test_1 VALUES(@name1,@name2,@id)

  UPDATE t_s SET id=@id,date=getdate()

  FETCH next FROM c2 INTO @name2

  END

  CLOSE c2

  DEALLOCATE c2

  FETCH next FROM c1 INTO @name1,@id

  END

  CLOSE c1

  DEALLOCATE c1

下载本文
显示全文
专题