程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> 由於文件組 ‘DEFAULT’ 中的磁盤空間不足,無法為數據庫 ‘TEMPDB’ 分配新頁

由於文件組 ‘DEFAULT’ 中的磁盤空間不足,無法為數據庫 ‘TEMPDB’ 分配新頁

編輯:關於MYSQL數據庫

       今天接到一個朋友的問題,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

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved