當前位置:首頁 » 編程語言 » sql收縮工作原理
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql收縮工作原理

發布時間: 2023-02-26 08:10:12

sql資料庫中日誌收縮、截斷等等是什麼

如:shgzts為資料庫名
mp transaction shgzts with no_log --截斷日誌
backup log shgzts with no_log --備份日誌
dbcc shrinkdatabase(shgzts,truncateonly) --資料庫收縮

Ⅱ 資料庫為什麼要進行收縮,怎樣收縮收縮能否達到效果

資料庫使用很長時間以後,會產生大量的數據,既占空間又影響訪問速度,所以進行資料庫收縮。
收縮過程:
收縮前一定要做好備份。
把不用的數據刪除。
刪除完成後數據文件還不會變小。這時你得進企業管理器選擇你要收縮的資料庫,
所有任務中有個收縮資料庫,然後選文件,進去之後有個資料庫文件,後有個下拉菜單,先選擇日誌文件,(以LOG結尾),點收縮文件致...MB後面有個最小多少,輸入那個值,點確定,完成後再進來,選擇資料庫文件,步驟同上。
重啟電腦,重新分配內存。

Ⅲ SQL SERVER如何收縮資料庫

工具/材料

SQL SERVER 2008

  • 01

    首先打開SQL SERVER的管理工具,找到要操作的資料庫,如下圖所示,右鍵單擊選擇屬性

  • 02

    然後在彈出的資料庫屬性信息界面中來查看一下可用空間,一般都是根據可用空間的大小來判斷是否需要對資料庫進行收縮的,如下圖所示

  • 03

    然後我們在資料庫屬性頁中選擇」選項」頁面,如下圖所示,這個頁麵包括了自動收縮的選項設置

  • 04

    在選項頁面的右側找到自動欄信息,如下圖所示,將自動收縮選項設置為TRUE。一旦將自動收縮設置為TRUE,資料庫就會自動監控可用空間的大小進行數據收縮。

  • 05

    另外還可以在資料庫中進行手動收縮設置,如下圖所示,先選擇資料庫選項的收縮

  • 06

    在彈出的資料庫收縮界面中,我們將收縮比進行設置,大家根據自己的實際需要設置即可

  • 07

    另外你也可以選擇收縮資料庫文件的選項,如下圖所示,可以選擇相應的收縮類型,我這里選擇的是釋放未使用空間的選項,大家根據自己情況進行選擇

Ⅳ SQLServer資料庫收縮相關知識

SQL Server 資料庫採取預先分配空間的方法來建立資料庫的數據文件或者日誌文件,比如數據文件的空間分配了300MB,而實際上只佔用了20MB空間,這樣就會造成磁碟存儲空間的浪費。可以通過資料庫收縮技術對資料庫中的每個文件進行收縮,刪除已經分配但沒有使用的頁。從而節省伺服器的存儲的成本。

官方解釋:收縮數據文件通過將數據頁從文件末尾移動到更靠近文件開頭的未佔用的空間來恢復空間。在文件末尾創建足夠的可用空間後,可以取消對文件末尾的數據頁的分配並將它們返回給文件系統。

收縮後的資料庫不能小於資料庫最初創建時指定的大小。 或是上一次使用文件大小更改操作(如 DBCC SHRINKFILE)設置的顯式大小。

比如:如果資料庫最初創建時的大小為 10 MB,後來增長到 100 MB,則該資料庫最小隻能收縮到 10 MB,即使已經刪除資料庫的所有數據也是如此。

不能在備份資料庫時收縮資料庫。 反之,也不能在資料庫執行收縮操作時備份資料庫。

介紹:收縮指定資料庫中的數據文件大小。

語法格式:

參數說明:

介紹:收縮當前資料庫的指定數據或日誌文件的大小,或通過將數據從指定的文件移動到相同文件組中的其他文件來清空文件,以允許從資料庫中刪除該文件。文件大小可以收縮到比創建該文件時所指定的大小更小。這樣會將最小文件大小重置為新值。

語法格式:

參數說明:

例如,如果創建一個10MB 的文件,然後在文件仍然為空的時候將文件收縮為2 MB,默認文件大小將設置為2 MB。這只適用於永遠不會包含數據的空文件。

另附SqlServer常見問題解答

1)管理器不會主動刷新,需要手工刷新一下才能看到最新狀態(性能方面的考慮)
2)很少情況下,恢復進程被掛起了。這個時候假設你要恢復並且回到可訪問狀態,要執行:
RESTORE database dbname with recovery
這使得恢復過程能完全結束。
3)如果你要不斷恢復後面的日誌文件,的確需要使資料庫處於「正在還原狀態」,
這通常是執行下面命令:
RESTORE database dbname with norecovery

原來SQL Server對伺服器內存的使用策略是用多少內存就佔用多少內存,只用在伺服器內存不足時,才會釋放一點佔用的內存,所以SQL Server 伺服器內存往往會佔用很高。我們可以通過DBCC MemoryStatus來查看內存狀態。

SQL SERVER運行時會執行兩種緩存:

1. 數據緩存:執行個查詢語句,SQL SERVER會將相關的數據頁(SQL SERVER操作的數據都是以頁為單位的)載入到內存中來, 下一次如果再次請求此頁的數據的時候,就無需讀取磁碟了,大大提高了速度。

2.執行命令緩存:在執行存儲過程,自定函數時,SQL SERVER需要先二進制編譯再運行,編譯後的結果也會緩存起來, 再次調用時就無需再次編譯。

可以調用以下幾個DBCC管理命令來清理這些緩存:

但是,這幾個命令雖然會清除掉現有緩存,為新的緩存騰地方,但是Sql server並不會因此釋放掉已經佔用的內存。SQL SERVER並沒有提供任何命令允許我們釋放不用到的內存。因此我們只能通過動態調整SQL SERVER可用的物理內存設置來強迫它釋放內存。

解決SQLSERVER內存佔用過高的方法:

1、清除所有緩存DBCC DROPLEANBUFFERS

2、調整SQLSERVER可使用的最大伺服器內存。

在SQL管理器,右擊實例名稱

在屬性實例屬性裡面找到內存選項

把最大內存改成合適的內存,確定後內存就會被強制釋放,然後重啟實例。再看看任務管理器,內存使用率就降下來啦。

1、查看連接對象

USE master

GO

--如果要指定資料庫就把注釋去掉

SELECT * FROM sys.[sysprocesses] WHERE [spid]>50 --AND DB_NAME([dbid])='gposdb'

當前連接對象有67個其中『WINAME』的主機名,『jTDS』的進程名不屬於已知常用軟體,找到這台主機並解決連接問題。在360流量防火牆中查看有哪個軟體連接了伺服器IP,除之。

2、然後使用下面語句看一下各項指標是否正常,是否有阻塞,正常情況下搜索結果應該為空。

SELECT TOP 10

[session_id],

[request_id],

[start_time] AS '開始時間',

[status] AS '狀態',

[command] AS '命令',

dest.[text] AS 'sql語句',

DB_NAME([database_id]) AS '資料庫名',

[blocking_session_id] AS '正在阻塞其他會話的會話ID',

[wait_type] AS '等待資源類型',

[wait_time] AS '等待時間',

[wait_resource] AS '等待的資源',

[reads] AS '物理讀次數',

[writes] AS '寫次數',

[logical_reads] AS '邏輯讀次數',

[row_count] AS '返回結果行數'

FROM sys.[dm_exec_requests] AS der

CROSS APPLY

sys.[dm_exec_sql_text](der.[sql_handle]) AS dest

WHERE [session_id]>50 AND DB_NAME(der.[database_id])='gposdb'

ORDER BY [cpu_time] DESC

查看是哪些SQL語句佔用較大可以使用下面代碼

--在SSMS里選擇以文本格式顯示結果

SELECT TOP 10

dest.[text] AS 'sql語句'

FROM sys.[dm_exec_requests] AS der

CROSS APPLY

sys.[dm_exec_sql_text](der.[sql_handle]) AS dest

WHERE [session_id]>50

ORDER BY [cpu_time] DESC

3、如果SQLSERVER存在要等待的資源,那麼執行下面語句就會顯示出會話中有多少個worker在等待

SELECT TOP 10

[session_id],

[request_id],

[start_time] AS '開始時間',

[status] AS '狀態',

[command] AS '命令',

dest.[text] AS 'sql語句',

DB_NAME([database_id]) AS '資料庫名',

[blocking_session_id] AS '正在阻塞其他會話的會話ID',

der.[wait_type] AS '等待資源類型',

[wait_time] AS '等待時間',

[wait_resource] AS '等待的資源',

[dows].[waiting_tasks_count] AS '當前正在進行等待的任務數',

[reads] AS '物理讀次數',

[writes] AS '寫次數',

[logical_reads] AS '邏輯讀次數',

[row_count] AS '返回結果行數'

FROM sys.[dm_exec_requests] AS der

INNER JOIN [sys].[dm_os_wait_stats] AS dows

ON der.[wait_type]=[dows].[wait_type]

CROSS APPLY

sys.[dm_exec_sql_text](der.[sql_handle]) AS dest

WHERE [session_id]>50

ORDER BY [cpu_time] DESC;

4、查詢CPU佔用最高的SQL語句

SELECT TOP 10

total_worker_time/execution_count AS avg_cpu_cost, plan_handle,

execution_count,

(SELECT SUBSTRING(text, statement_start_offset/2 + 1,

(CASE WHEN statement_end_offset = -1

THEN LEN(CONVERT(nvarchar(max), text)) * 2

ELSE statement_end_offset

END - statement_start_offset)/2)

FROM sys.dm_exec_sql_text(sql_handle)) AS query_text

FROM sys.dm_exec_query_stats

ORDER BY [avg_cpu_cost] DESC;

5、索引缺失查詢

SELECT

DatabaseName = DB_NAME(database_id)

,[Number Indexes Missing] = count(*)

FROM sys.dm_db_missing_index_details

GROUP BY DB_NAME(database_id)

ORDER BY 2 DESC;

SELECT TOP 10

[Total Cost] = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0)

, avg_user_impact

, TableName = statement

, [EqualityUsage] = equality_columns

, [InequalityUsage] = inequality_columns

, [Include Cloumns] = included_columns

FROM sys.dm_db_missing_index_groups g

INNER JOIN sys.dm_db_missing_index_group_stats s

ON s.group_handle = g.index_group_handle

INNER JOIN sys.dm_db_missing_index_details d

ON d.index_handle = g.index_handle

ORDER BY [Total Cost] DESC;

找到索引缺失的表,根據查詢結果中的關鍵次逐一建立索引。

Ⅳ sql server 2008 r2如何收縮資料庫和文件

1、右擊資料庫選擇,打開Files窗口

2、Files窗口,File type 選擇 Log,單擊OK完成日誌收縮。

按以上方法操作沒有效果,原因是資料庫的恢復模式不是簡單模式,只需要將恢復模式改為簡單模式即可用以上操作來收縮日誌,方便又好用。

將資料庫恢復模式改為簡單模式方法:
1、右擊資料庫選擇屬性,彈出窗口如下圖,選擇Options選項,將 Recovery Model 改為 Simple 即可。

按如下方法操作也可收縮日誌:

1、當資料庫恢復模式為簡單時。使用dbcc shrinkfile (logfile_name,target_size)命令來完成。如

use mydb
dbcc shrinkfile (mydb_log,10) --將mydb_log收縮至10m

2、當資料庫恢復模式為完全時。可以先將資料庫模式改為簡單模式,再使用上述方法來進行。

use master
alter database mydb set recovery simple
dbcc shrinkfile (mydb_log,10) --將mydb_log收縮至10m

也可以直接備份事務日誌文件後再收縮:

use master
backup log mydb to disk='d:/dd.bak'
use mydb
dbcc shrinkfile (mydb_log,10) --將mydb_log收縮至10m;

3、通過分離資料庫,然後再刪除事務日誌文件,再附加mdf數據文件,也可以達到某種意義上的事務日誌收縮。

以下是有關日誌文摘

對於每一個資料庫來講,都需要至少一個事務日誌文件。事務日誌文件是整個資料庫的血液,如果沒有事務日誌的話,那麼將無法進行任何操作。
事務日誌有什麼東西?
事務日誌記錄著在相關資料庫上的操作,同時還存儲資料庫恢復(recovery)的相關信息。

事務日誌與資料庫恢復(recovery)是密切相關的,其實資料庫在啟動時,便會進行相關的恢復(recovery)操作,如下所示。當然,在資料庫還原時,也可以指定手工恢復(recovery).任何在資料庫上的改變,如果在事務日誌內被標記為已提交,並用一個LSN(LOG SEQUENCE NUMBER)來標識,同時相關改變就會體現在數據文件上,而被標記為未提交的改變將不會體現在數據文件上。

2010-01-12 18:31:48.72 spid7s Recovery is complete. This is an informationa message only. No user action is required.

事務日誌文件還存儲著資料庫需要回滾的相關信息。在SQL Server資料庫上,默認是隱式提交的,也就是說在查詢分析器裡面進行的每一個操作,在操作完成後,都是默認已經commit,但如果通過指定begin tran 和rollback tran的命令來標識事務時,rollback tran就需要使用事務日誌內的相關信息才可以回滾。當然,如果SQL Server遇到相關錯誤時,如死鎖,那麼也會產生一個內部回滾,這些都需要用到事務日誌文件。
為什麼要收縮事務日誌?

收縮日誌的原因有很多種,有些則是考慮空間不足,有些則是應用程序限制導致的,一般情況下,是不建議對事務日誌進行其他改變的,如需要控制事務日誌的大小,則可以通過安排事務日誌備份來解決。如果確定事務日誌包含將不再使用的未使用空間,則可以通過減少事務日誌的大小,以便回收過多空間。但這種情況對於一個DBA來講,應該要盡量避免。

僅當資料庫處於聯機狀態,而且至少一個虛擬日誌文件可用時,收縮才會發生。在某些情況下,直到下一個日誌截斷後,才能收縮日誌。

事務日誌收縮的原理:
每個事務日誌由多個虛擬日誌文件組成(virtual log file).虛擬日誌文件沒有固定的大小,也沒有固定的個數。在創建事務日誌文件或者擴展事務日誌文件時,SQL SERVER便會自動創建合適大小的虛擬日誌文件,DBA無法控制虛擬日誌文件的大小和個數。在擴展日誌文件後,虛擬文件的大小是現有日誌大小和新文件增量大小之和。因此,如果在創建資料庫時,對資料庫指定了比較小的初始大小,又指定了比較小的日誌增長量,隨著事務日誌的自動擴展,虛擬日誌文件個數會越來越多,從而影響了資料庫性能。因此,在創建資料庫時,盡量指定比較合適的初始事務日誌大小,同時指定合理的事務日誌增長量,這點可以參考數據文件的標准。如果大於10G或者更大的話,則指定固定的增長量,如果比較小,則指定按百分比的增長量來進行。

詳情參考
http://hi..com/lxiangshanyu/item/7057ce04081efae9fe240d64

Ⅵ SQL 資料庫收縮問題

SQL資料庫收縮一種是自動收縮:在資料庫屬性選項里,將自動收縮設置為True
另外一種是手動收縮:調節最大可用空間到合適的值根據具體的需求進行設置,一般設置為40%為宜。

Ⅶ sql server 「收縮資料庫文件"的原理不太懂

SQL 有兩個文件MDF 和一個LOG 文件。 MDF文件主要存的是主數據,收縮主要是把表與表、欄位與欄位之間的垃圾數據清理。 LOG 文件,你每執行一個查詢,都會產生,如果沒有LOG 則無法進行回滾。 如果你已經備份了完整的資料庫。MDF文件收縮可以根據推薦 LOG 給成0就行了。

滿意請採納

Ⅷ SQL Server 2000資料庫收縮

1、是不是我的資料庫現在收縮失敗了啊?
答:你的資料庫收縮還沒有完全失敗,但已經可以視為失敗,因為要做完收縮遙遙無期,需要的時間將十分漫長,具體原因見第三問。

2、大家有過對大型資料庫的收縮經驗嗎?時間怎麼這么久啊?
答:資料庫的收縮時間與資料庫大小是成正比的,資料庫越大,收縮時間越長。所以建議要定時進行資料庫收縮,每年一次或幾個月一次,依資料庫增長速度而定。

3、為什麼我按百分比收縮時總是不成功?和盤符所剩空間有關系么?
答:不論是按百分比收縮還是按空間大小進行收縮,都要求資料庫所在磁碟預留一定的空間,最好在15%以上。在資料庫進行收縮時,系統將把這部分預留空間作為緩沖區,用來保存和整理資料庫中的數據,然後再把整理過的數據寫回資料庫。像你說的這種情況,數據文件大小為598G,可用空間為9M,基本無法進行有效的資料庫收縮。建議你把資料庫文件解掛後,復制到750G以上的大容量硬碟中,重新附加資料庫後再進行收縮。

4、資料庫收縮的簡單原理是什麼啊?和盤符所剩空間有關系么?
答:資料庫收縮的簡單原理有兩條,一是清理日誌,因為日誌記錄的是資料庫的歷史操作,在一段時間後,如果沒有保存價值可以清除;二是清理空白空間,這種空間是刪除數據表(一般是臨時表)後造成的,數據表刪除後,資料庫空間不會自動縮小,所以數據文件就會越來越大。和盤符所剩空間的關系,第三問已經回答了。