⑴ SQL資料庫如何壓縮
可以使用DBCC
SHRINKDATABASE
和DBCC
SHRINKFILE
命令來壓縮資料庫。
其中DBCC
SHRINKDATABASE
命令對資料庫進行壓縮,DBCC
SHRINKFILE
命令對資料庫中指定的文件進行壓縮。
DBCC
SHRINKDATABASE
命令語法如下:
DBCC
SHRINKDATABASE
(database_name
[,
target_percent]
[,
{NOTRUNCATE
|
TRUNCATEONLY}]
)
各參數說明如下:
target_percent:
指定將資料庫壓縮後,未使用的空間占資料庫大小的百分之幾。如果指定的百分比過大,超過了壓縮前未使用空間所佔的比例,則資料庫不會被壓縮。並且壓縮後的資料庫不能比資料庫初始設定的容量小。
NOTRUECATE:
將資料庫縮減後剩餘的空間保留在資料庫,中不返還給操作系統
,如果不選擇此選項,則剩餘的空間返還給操作系統。
TRUNCATEONLY
:
將資料庫縮減後剩餘的空間返還給操作系統。使用此命令時SQL
Server
將文件縮減到最後一個文件分配,區域但不移動任何數據文件。選擇此項後,target_percent
選項就無效了。
⑵ SQL資料庫如何壓縮
具體方法有3種。
方法一:
第一步:
backup
log
database_name
with
no_log
或者
backup
log
database_name
with
truncate_only
--
no_log和truncate_only是在這里是同義的,隨便執行哪一句都可以。
第二步:
1.收縮特定資料庫的所有數據和日誌文件,執行:
dbcc
shrinkdatabase
(database_name,[,target_percent])
--
database_name是要收縮的資料庫名稱;target_percent是資料庫收縮後的資料庫文件中所要的剩餘可用空間百分比。
2.收縮一次一個特定資料庫中的數據或日誌文件,執行
dbcc
shrinkfile(file_id,[,target_size])
--
file_id是要收縮的文件的標識
(id)
號,若要獲得文件
id,請使用
file_id
函數或在當前資料庫中搜索
sysfiles;target_size是用兆位元組表示的所要的文件大小(用整數表示)。如果沒有指定,dbcc
shrinkfile
將文件大小減少到默認文件大小。兩個dbcc都可以帶上參數notruncate或truncateonly,具體意思查看聯機幫助.
方法二:
第一步:
先備份整個資料庫以備不測
。
第二步:
備份結束後,在query
analyzer中執行如下的語句:
exec
sp_detach_db
yourdbname,true
--卸除這個db在mssql中的注冊信息
第三步:
到日誌的物理文件所在的目錄中去刪除該日誌文件或者將該日誌文件移出該目錄
第四步:
在query
analyzer中執行如下的語句:
exec
sp_attach_single_file_db
yourdbname,'
d:\mssql\data\yourdbname_data.mdf
'
--以單文件的方式注冊該db,如果成功則mssql將自動為這個db生成一個500k的日誌文件。
方法三:
1.
進入企業管理器,選中資料庫,比如demo
2.
所有任務->分離資料庫
3.
到資料庫文件的存放目錄,將muonline_log.ldf文件刪除,以防萬一,你可以拷出去
4.
企業管理器->附加資料庫,選muonline,這個時候你會看見日誌文件這項是一個叉,不要緊,繼續,此時資料庫就會提示你該資料庫無日誌是否創建一個新的,確定就是了。
5.
記得資料庫重新附加後用戶要重新設置一下。
如果以後,不想要它變大:
sql2000下使用:
在資料庫上點右鍵->屬性->選項->故障恢復-模型-選擇-簡單模型。
或用sql語句:
alter
database
資料庫名
set
recovery
simple
⑶ Sql 2008如何壓縮資料庫及日誌文件
首先將你要將壓縮的資料庫設置為簡單日誌模式(這個就不用說了吧),然後右擊你的資料庫名稱,選擇任務-收縮-文件,即可打開資料庫壓縮窗口,後面的你就會操作了,你可以壓縮到你想到的比例。
⑷ SQL Server 2000 中資料庫文件如何壓縮啊
你需要將日誌文件截斷後收縮
在查詢分析器里依次執行下面的語句就可以了,把「資料庫」替換成你實際的資料庫名
--首先截斷事務日誌
backup log 資料庫 with no_log
--收縮資料庫
dbcc shrinkdatabase('資料庫',0)
樓上的方法有風險,而且操作的時候資料庫是離線的。
⑸ SQLServer2008中的數據壓縮功能
SQL Server SP 為我們帶來了vardecimal功能 這項功能使得原來定長的decimal數據在數據文件中以可變長的格式存儲 據稱這項功能可以為典型的數據倉庫節省 %的空間 而SQL Server 在這一基礎上又進一步增強了數據壓縮功能 SQL Server 現在支持行壓縮和頁面壓縮兩種選項 數據壓縮選項可以在以下對象上啟用
未創建聚簇索引的表
創建聚簇索引的表
非聚簇索引(對表設置壓縮選項不會影響到該表上的非聚簇索引 因此聚簇索引的壓縮需要單獨設置)
索引視圖
分區表和分區索引中的單個分區
為什麼需要數據壓縮
首先可能需要討論的問題就是為什麼在存儲成本不斷降低的今天 微軟還要煞費苦心地在SQL Server中實現並且不斷改進數據壓縮技術呢?
盡管存儲成本已經不再是傳統意義上的首要考慮因素 但是這並不代表資料庫尺寸不是一個問題 因為資料庫尺寸除了會影響到存儲成本之外 還極大地關聯到管理成本和性能問題
首先我們來討論為什麼會有管理成本的問題?因為資料庫需要備份 資料庫的尺寸越大 那麼備份時間就會越長 當然另外一點就是消耗的備份硬體成本也會隨之提高(包括需要的備份介質成本和為了滿足備份窗口而需要更高級的備份設備帶來的采購成本) 還有一種管理成本就是資料庫的維護成本 例如我們經常需要完成的DBCC任務 資料庫尺寸越大 我們就需要更多的時間來完成這些任務
接著我們再看看性能問題 SQL Server在掃描磁碟讀取數據的時候都是按照數據頁為單位進行讀取的 因此如果一張數據頁中包含的數據行數越多 SQL Server在一次數據頁IO中獲得的數據就會越多 這樣也就帶來了性能的提升
最後考慮存儲的成本 按照原先SQL Server SP 中vardecimal的壓縮數據為例 %的空間節省也就意味著 %的存儲成本 而按照SQL Server 當前放出的測試數據 採用新的數據壓縮技術可以達到 X X的存儲率 再加上如果企業要考慮容災而增加的存儲空間 這樣節省的存儲硬體成本也將是想當可觀的
如何使用數據壓縮
SQL Server 中的壓縮選項可以在創建表或索引時通過Option進行設置 例如 CREATE TABLE TestTable (col int col varchar( )) WITH (DATA_PRESSION = ROW);
如果需要改變一個分區的壓縮選項 則可以用以下語句 ALTER TABLE TestTable REBUILD PARTITION = WITH (DATA PRESSION = PAGE);
如果需要為分區表的各個分區設置不同的壓縮選項 可以使用以下的語句 (SQL Server 可以對不同的分區使用不同的壓縮選項 這一點對於數據倉庫應用是非常重要的 因為數據倉庫的事實表通常都會有一個或數個熱分區 這些分區中的數據經常需要更新 為了避免數據壓縮給這些分區上的數據更新帶來額外的處理載荷 可以對這些分區關閉壓縮選項) CREATE TABLE PartitionedTable (col int col varchar( )) ON PS (col ) WITH ( DATA_PRESSION = ROW ON PARTITIONS( ) DATA_PRESSION = PAGE ON PARTITION( TO ));
如果是為某個索引設置壓縮選項的話 可以使用
CREATE INDEX IX_TestTable_Col ON TestTable (Col ) WITH (DATA_PRESSION = ROW);
如果是修改某個索引的壓縮選項 可以使用 ALTER INDEX IX_TestTable_Col ON TestTable REBUILD WITH (DATA_PRESSION = ROW);
SQL Server 同時還提供了一個名為sp_estimate_data_pression_savings存儲過程幫助DBA估計激活壓縮選項後對象尺寸
數據壓縮是怎樣工作的
對於行壓縮 SQL Server 採用以下三種方法來節省存儲空間
減少了與記錄相關聯的元數據開銷 此元數據為有關列 列長度和偏移量的信息 在某些情況下 元數據開銷可能大於舊的存儲格式
它對於數值類型(例如 integer decimal和float)和基於數值的類型(例如 datetime和money)使用可變長度存儲格式
它通過使用不存儲空字元的可變長度格式來存儲定長字元串
對於頁面壓縮 SQL Server 則是在一張數據頁面上依次採用
行壓縮
前綴壓縮
字典壓縮
配置數據壓縮功能需要注意的
盡管SQL Server 的數據壓縮功能非常有價值 但是仍然需要注意一些問題
數據壓縮功能僅在企業版和開發版中可用
數據壓縮可以讓一張數據頁存儲更多的數據行 但是並不能改變單行數據最長 位元組這一限制
在一張已經設置了數據壓縮的表上創建聚簇索引時 聚簇索引默認繼承原表上的壓縮選項
在未設置聚簇索引的表上設置頁面壓縮時 只有以下情況才會獲得頁面壓縮的實際效果
數據使用BULK INSERT語法添加到表中
數據使用INSERT INTO WITH (TABLOCK)語法添加到表中
執行帶有頁面壓縮選項的ALTER TABLE REBUILD命令
在未設置聚簇索引的表上更改壓縮選項 會導致該表上所有非聚簇索引都需要重建 因為這些非聚簇索引指向的數據行地址已經都發生了改變
在改變壓縮選項時所需要的臨時空間大小與創建索引是所需要的空間是一樣的 因此對於分區表 我們可以逐個分區設置壓縮選項來減少臨時空間的需求壓力
由於SQL Server 中數據壓縮技術其實是SQL Server SP 中vardecimal技術的一個超集 因此設置了數據壓縮後就沒有必要保留vardecimal了 當然SQL Server 為了保持向後兼容性 在當前版本中仍然保留了vardecimal 但是SQL Server 的下一個版本及可能就會棄用vardecimal選項 因此做了這些設置的資料庫應該盡早改變到數據壓縮設置下
lishixin/Article/program/Oracle/201311/17483
⑹ 怎樣壓縮MSSQL資料庫
資料庫在使用一段時間後,時常會出現因數據刪除而造成資料庫中空閑空間太多的情況,這時就需要減少分配給資料庫文件和事務日誌文件的磁碟空間,以免浪費磁碟空間。當資料庫中沒有數據時,可以修改資料庫文件屬性直接改變其佔用空間,但當資料庫中有數據時,這樣做會破壞資料庫中的數據,因此需要使用壓縮的方式來縮減資料庫空間。可以在資料庫屬性選項中選擇「Auto shrink」選項,讓系統自動壓縮資料庫,也可以用人工的方法來壓縮。人工壓縮資料庫有以下兩種方式:
1、用Enterprise Manager 壓縮資料庫
在Enterprise Manager 中在所要壓縮的資料庫上單擊右鍵,從快捷菜單中的「所有任務(All Tasks)」中選擇「Shrink Database(壓縮資料庫)」選項
、用Transact-SQL 命令壓縮資料庫
可以使用DBCC SHRINKDATABASE 和DBCC SHRINKFILE 命令來壓縮資料庫。其中DBCC SHRINKDATABASE 命令對資料庫進行壓縮,DBCC SHRINKFILE 命令對資料庫中指定的文件進行壓縮。
(1) DBCC SHRINKDATABASE
DBCC SHRINKDATABASE 命令語法如下:
DBCC SHRINKDATABASE (database_name [, target_percent]
[, {NOTRUNCATE | TRUNCATEONLY}] )
各參數說明如下:
target_percent 指定將資料庫壓縮後,未使用的空間占資料庫大小的百分之幾。如果指定的百分比過大,超過了壓縮前未使用空間所佔的比例,則資料庫不會被壓縮。並且壓縮後的資料庫不能比資料庫初始設定的容量小。
NOTRUECATE
將資料庫縮減後剩餘的空間保留在資料庫,中不返還給操作系統。如果不選擇此選項,則剩餘的空間返還給操作系統。
TRUNCATEONLY
將資料庫縮減後剩餘的空間返還給操作系統。使用此命令時SQL Server 將文件縮減到最後一個文件分配,區域但不移動任何數據文件。選擇此項後,target_percent 選項就無效了。
壓縮資料庫mytest 的未使用空間為資料庫大小的20%。
dbcc shrinkdatabase (mytest, 20)
運行結果如下:
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
(2) DBCC SHRINKFILE
DBCC SHRINKFILE 命令壓縮當前資料庫中的文件。其語法如下:
DBCC SHRINKFILE ( {file_name | file_id }
{ [, target_size] |
[, {EMPTYFILE | NOTRUNCATE | TRUNCATEONLY}] } )
各參數說明如下:
file_id
指定要壓縮的文件的鑒別號(Identification number, 即ID)。文件的ID 號可以通過 FILE_ID()函數或如本章前面所講述的Sp_helpdb 系統存儲過程來得到。
target_size
指定文件壓縮後的大小。以MB 為單位。如果不指定此選項,SQL Server 就會盡最大可能地縮減文件。
EMPTYFILE
指明此文件不再使用,將移動所有在此文件中的數據到同一文件組中的其它文件中去。執行帶此參數的命令後,此文件就可以用ALTER DATABASE 命令來刪除了。
其餘參數NOTRUNCATE 和TRUNCATEONLY 與DBCC SHRINKDATABASE 命令中的含義相同。
例6-15: 壓縮資料庫mydb 中的資料庫文件mydb_data2 的大小到1MB。 use mydb dbcc shrinkfile (mydb_data2, 1)
⑺ MS SQL2000資料庫太大了 如何壓縮
--壓縮日誌及資料庫文件大小 /*--特別注意 請按步驟進行,未進行前面的步驟,請不要做後面的步驟 否則可能損壞你的資料庫. 一般不建議做第4,6兩步 第4步不安全,有可能損壞資料庫或丟失數據 第6步如果日誌達到上限,則以後的資料庫處理會失敗,在清理日誌後才能恢復. --*/ --下面的所有庫名都指你要處理的資料庫的庫名 1.清空日誌 DUMP TRANSACTION 庫名 WITH NO_LOG 2.截斷事務日誌: BACKUP LOG 庫名 WITH NO_LOG 3.收縮資料庫文件(如果不壓縮,資料庫的文件不會減小 企業管理器--右鍵你要壓縮的資料庫--所有任務--收縮資料庫--收縮文件 --選擇日誌文件--在收縮方式里選擇收縮至XXM,這里會給出一個允許收縮到的最小M數,直接輸入這個數,確定就可以了 --選擇數據文件--在收縮方式里選擇收縮至XXM,這里會給出一個允許收縮到的最小M數,直接輸入這個數,確定就可以了 也可以用SQL語句來完成 --收縮資料庫 DBCC SHRINKDATABASE(庫名) --收縮指定數據文件,1是文件號,可以通過這個語句查詢到:select * from sysfiles DBCC SHRINKFILE(1) 4.為了最大化的縮小日誌文件(如果是sql 7.0,這步只能在查詢分析器中進行) a.分離資料庫: 企業管理器--伺服器--資料庫--右鍵--分離資料庫 b.在我的電腦中刪除LOG文件 c.附加資料庫: 企業管理器--伺服器--資料庫--右鍵--附加資料庫 此法將生成新的LOG,大小隻有500多K 或用代碼: 下面的示例分離 pubs,然後將 pubs 中的一個文件附加到當前伺服器。 a.分離 EXEC sp_detach_db @dbname = '庫名' b.刪除日誌文件 c.再附加 EXEC sp_attach_single_file_db @dbname = '庫名', @physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\庫名.mdf' 5.為了以後能自動收縮,做如下設置: 企業管理器--伺服器--右鍵資料庫--屬性--選項--選擇"自動收縮" --SQL語句設置方式: EXEC sp_dboption '庫名', 'autoshrink', 'TRUE' 6.如果想以後不讓它日誌增長得太大 企業管理器--伺服器--右鍵資料庫--屬性--事務日誌 --將文件增長限制為xM(x是你允許的最大數據文件大小) --SQL語句的設置方式: alter database 庫名 modify file(name=邏輯文件名,maxsize=20)
⑻ 如何壓縮SQL Server 2005指定資料庫文件和日誌的大小
您好,很高興為您解答。
下面有兩個SQL語句可以達到在SQL Server 2005/2008壓縮指定資料庫文件和日誌的大小的效果:
1、DBCC SHRINKDATABASE (Transact-SQL)
收縮指定資料庫中的數據文件和日誌文件的大小。
語法
DBCC SHRINKDATABASE
( 'database_name' | database_id | 0
[ ,target_percent ]
[ , { NOTRUNCATE | TRUNCATEONLY } ]
)
[ WITH NO_INFOMSGS ]
參數
'database_name' | database_id | 0 要收縮的資料庫的名稱或 ID。如果指定 0,則使用當前資料庫。
target_percent 資料庫收縮後的資料庫文件中所需的剩餘可用空間百分比。
NOTRUNCATE 通過將已分配的頁從文件末尾移動到文件前面的未分配頁來壓縮數據文件中的數據。target_percent 是可選參數。 文件末尾的可用空間不會返回給操作系統,文件的物理大小也不會更改。因此,指定 NOTRUNCATE 時,資料庫看起來未收縮。 NOTRUNCATE 只適用於數據文件。日誌文件不受影響。
TRUNCATEONLY 將文件末尾的所有可用空間釋放給操作系統,但不在文件內部執行任何頁移動。數據文件只收縮到最近分配的區。如果與 TRUNCATEONLY 一起指定,將忽略 target_percent。 TRUNCATEONLY 只適用於數據文件。日誌文件不受影響。
WITH NO_INFOMSGS 取消嚴重級別從 0 到 10 的所有信息性消息。
結果集
列名 說明
DbId 資料庫引擎試圖收縮的文件的資料庫標識號。
FileId 資料庫引擎嘗試收縮的文件的文件標識號。
CurrentSize 文件當前佔用的 8 KB 頁數。
MinimumSize 文件最低可以佔用的 8 KB 頁數。這與文件的最小大小或最初創建時的大小相對應。
UsedPages 文件當前使用的 8 KB 頁數。
EstimatedPages 資料庫引擎估計文件能夠收縮到的 8 KB 頁數。
備注
若要收縮特定資料庫的所有數據和日誌文件,請執行 DBCC SHRINKDATABASE 命令。若要一次收縮一個特定資料庫中的一個數據或日誌文件,請執行 DBCC SHRINKFILE 命令。
若要查看資料庫中當前的可用(未分配)空間量,請運行 sp_spaceused。
可在進程中的任一點停止 DBCC SHRINKDATABASE 操作,任何已完成的工作都將保留。
收縮後的資料庫不能小於資料庫的最小大小。最小大小是在資料庫最初創建時指定的大小,或是使用文件大小更改操作(如 DBCC SHIRNKFILE 或 ALTER DATABASE)顯式設置的最後大小。例如,如果資料庫最初創建時的大小為 10 MB,後來增長到 100 MB,則該資料庫最小隻能收縮到 10 MB,即使已經刪除資料庫的所有數據也是如此。
運行 DBCC SHRINKDATABASE 而不指定 NOTRUNCATE 選項或 TRUNCATEONLY 選項等價於帶 NOTRUNCATE 運行 DBCC SHRINKDATABASE 操作,然後再帶 TRUNCATEONLY 運行 DBCC SHRINKDATABASE 操作。
要收縮的資料庫不必在單用戶模式下;其他的用戶仍可以在資料庫收縮時對其進行工作。這也包括系統資料庫。
不能在備份資料庫時收縮資料庫。反之,也不能在資料庫執行收縮操作時備份資料庫。
DBCC SHRINKDATABASE 的工作原理
DBCC SHRINKDATABASE 以每個文件為單位對數據文件進行收縮。然而,DBCC SHRINKDATABASE 在對日誌文件進行收縮時,它將視為所有的日誌文件都存在於一個連續的日誌池中。文件始終從末尾開始收縮。
假設名為 mydb 的資料庫有一個數據文件和兩個日誌文件。數據文件和日誌文件分別是 10 MB,並且數據文件包含 6 MB 數據。
Microsoft SQL Server 2005 資料庫引擎對每個文件計算一個目標大小。這就是文件將要收縮到的大小。將 target_percent 與 DBCC SHRINKDATABASE 一起指定時,資料庫引擎計算的目標大小是收縮後文件中的 target_percent 可用空間大小。例如,如果在收縮 mydb 時將 target_percent 指定為 25,則資料庫引擎將此文件的目標大小計算為 8 MB(6 MB 數據加上 2 MB 可用空間)。因此,資料庫引擎將任何數據從數據文件的後 2 MB 中移動到數據文件前 8 MB 的可用空間中,然後對該文件進行收縮。
假設 mydb 的數據文件包含 7 MB 的數據。將 target_percent 指定為 30,以允許將此數據文件收縮到可用空間為 30%。但是,將 target_percent 指定為 40 卻不會收縮數據文件,因為資料庫引擎收縮文件的目標大小不能小於數據當前佔用空間大小。您還可以用另一種方法來考慮此問題:所要求的 40% 可用空間加上整個數據文件大小的 70%(10 MB 中的 7 MB),超過了 100%。因為所要求的可用百分比加上數據文件佔用的當前百分比大於 100%(多出 10%),所以任何大於 30 的 target_size 都不會收縮此數據文件。
對於日誌文件,資料庫引擎使用 target_percent 來計算整個日誌的目標大小;因此,target_percent 是收縮操作後日誌中的可用空間大小。之後,整個日誌的目標大小轉換為每個日誌文件的目標大小。
DBCC SHRINKDATABASE 嘗試立即將每個物理日誌文件收縮到其目標大小。如果虛擬日誌中的所有邏輯日誌部分都沒有超出日誌文件的目標大小,則該文件將成功截斷,DBCC SHRINKDATABASE 完成且不顯示任何消息。但是,如果部分邏輯日誌位於超出目標大小的虛擬日誌中,則資料庫引擎將釋放盡可能多的空間,並發出一條信息性消息。該消息說明需要執行哪些操作來將邏輯日誌移出位於文件末尾的虛擬日誌。執行該操作以後,DBCC SHRINKDATABASE 可用於釋放剩餘空間。有關詳細信息,請參閱收縮事務日誌。
因為日誌文件只能收縮到虛擬日誌文件邊界,所以不可能將日誌文件收縮到比虛擬日誌文件更小(即使現在沒有使用該文件)。虛擬日誌文件的大小在創建或擴展這些日誌文件時由資料庫引擎動態選擇。有關虛擬日誌文件的詳細信息,請參閱事務日誌物理體系結構。
許可權
要求具有 sysadmin 固定伺服器角色或 db_owner 固定資料庫角色的成員身份。、
示例
A. 收縮資料庫並指定可用空間的百分比
以下示例將減小 UserDB 用戶資料庫中數據文件和日誌文件的大小,以便在資料庫中留出 10% 的可用空間。
DBCC SHRINKDATABASE (UserDB, 10);
GO
B. 截斷資料庫
以下示例使 AdventureWorks 示例資料庫中的數據文件收縮到最後分配的區。
DBCC SHRINKDATABASE (AdventureWorks, TRUNCATEONLY);
請參考:http://msdn.microsoft.com/zh-cn/vs2008/ms190488(SQL.90).aspx
2、DBCC SHRINKFILE (Transact-SQL)
收縮當前資料庫的指定數據或日誌文件的大小,或通過將數據從指定的文件移動到相同文件組中的其他文件來清空文件,以允許從資料庫中刪除該文件。文件大小可以收縮到比創建該文件時所指定的大小更小。這樣會將最小文件大小重置為新值。
語法
DBCC SHRINKFILE ( { 'file_name' | file_id } { [ , EMPTYFILE ] | [ [ , target_size ] [ , { NOTRUNCATE | TRUNCATEONLY } ] ] } ) [ WITH NO_INFOMSGS ]
參數
' file_name '
要收縮的文件的邏輯名稱。
file_id
要收縮的文件的標識 (ID) 號。若要獲得文件 ID,請使用 FILE_IDEX 系統函數,或查詢當前資料庫中的 sys.database_files 目錄視圖。
target_size
用兆位元組表示的文件大小(用整數表示)。如果未指定,則 DBCC SHRINKFILE 將文件大小減少到默認文件大小。默認大小是創建文件時指定的大小,或者是使用 ALTER DATABASE 所設置的最後大小。
如果指定了 target_size,則 DBCC SHRINKFILE 嘗試將文件收縮到指定大小。將要釋放的文件部分中的已使用頁重新定位到保留的文件部分中的可用空間。例如,如果數據文件為 10 MB,則 target_size 為 8 的 DBCC SHRINKFILE 操作會將文件最後 2 MB 中所有的已使用頁重新分配到文件前 8 MB 中的任何未分配頁中。DBCC SHRINKFILE 不會將文件收縮到小於存儲文件中的數據所需要的大小。例如,如果使用 10 MB 數據文件中的 7 MB,則帶有 target_size 為 6 的 DBCC SHRINKFILE 語句只能將該文件收縮到 7 MB,而不能收縮到 6 MB。
EMPTYFILE
將指定文件中的所有數據遷移到同一文件組中的其他文件。由於資料庫引擎不再允許將數據放在空文件內,因此可以使用 ALTER DATABASE 語句來刪除該文件。
NOTRUNCATE
在指定或不指定 target_percent 的情況下,將已分配的頁從數據文件的末尾移動到該文件前面的未分配頁。文件末尾的可用空間不會返回給操作系統,文件的物理大小也不會更改。因此,指定 NOTRUNCATE 時,文件看起來未收縮。
NOTRUNCATE 只適用於數據文件。日誌文件不受影響。
TRUNCATEONLY
將文件末尾的所有可用空間釋放給操作系統,但不在文件內部執行任何頁移動。數據文件只收縮到最後分配的區。
如果隨 TRUNCATEONLY 指定了 target_size,則會忽略該參數。
TRUNCATEONLY 只適用於數據文件。
WITH NO_INFOMSGS
取消顯示所有信息性消息。
結果集
列名 說明
DbId 資料庫引擎試圖收縮的文件的資料庫標識號。
FileId 資料庫引擎試圖收縮的文件的文件標識號。
CurrentSize 文件當前佔用的 8 KB 頁數。
MinimumSize 文件最低可以佔用的 8 KB 頁數。這與文件的最小大小或最初創建時的大小相對應。
UsedPages 文件當前使用的 8 KB 頁數。
EstimatedPages 資料庫引擎估計文件能夠收縮到的 8 KB 頁數。
收縮日誌文件
對於日誌文件,SQL Server 2005 資料庫引擎使用 target_size 來計算整個日誌的目標大小;因此,target_size 是收縮操作後日誌中的可用空間大小。之後,整個日誌的目標大小轉換為每個日誌文件的目標大小。DBCC SHRINKFILE 嘗試立即將每個物理日誌文件收縮到其目標大小。但是,如果部分邏輯日誌位於超出目標大小的虛擬日誌中,則資料庫引擎將釋放盡可能多的空間,並發出一條信息性消息。該消息說明需要執行哪些操作來將邏輯日誌移出位於文件末尾的虛擬日誌。執行這些操作以後,DBCC SHRINKFILE 可用於釋放剩餘空間。
如果文件不收縮
如果收縮操作運行時未出現錯誤,但文件大小看起來沒有發生更改,則請執行下列操作之一以驗證文件是否有足夠的可用空間可供刪除:
運行以下查詢。
SELECT name ,size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS AvailableSpaceInMB
FROM sys.database_files;
許可權
要求具有 sysadmin 固定伺服器角色或 db_owner 固定資料庫角色的成員身份。
示例
A. 將數據文件收縮到指定的目標大小
以下示例將 UserDB 用戶資料庫中名為 DataFile1 的數據文件的大小收縮到 7MB。
USE UserDB;
GO
DBCC SHRINKFILE (DataFile1, 7);
GO
B. 將日誌文件收縮到指定的目標大小
以下示例將 AdventureWorks 資料庫中的日誌文件收縮到 1 MB。若要允許 DBCC SHRINKFILE 命令收縮文件,首先需要通過將資料庫恢復模式設置為 SIMPLE 來截斷該文件。
USE AdventureWorks;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE AdventureWorks
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (AdventureWorks_Log, 1);
GO
-- Reset the database recovery model.
ALTER DATABASE AdventureWorks
SET RECOVERY FULL;
GO
C. 截斷數據文件
以下示例將截斷 AdventureWorks 資料庫中的主數據文件。需要查詢 sys.database_files 目錄視圖以獲得數據文件的 file_id。
USE AdventureWorks;
GO
SELECT file_id, name
FROM sys.database_files;
GO
DBCC SHRINKFILE (1, TRUNCATEONLY);
D. 清空文件
以下示例演示了清空文件以便從資料庫中將其刪除的步驟。針對此示例,首先創建一個數據文件,並假設該文件包含數據。
USE AdventureWorks;
GO
-- Create a data file and assume it contains data.
ALTER DATABASE AdventureWorks
ADD FILE (
NAME = Test1data,
FILENAME = 'C:\t1data.ndf',
SIZE = 5MB
);
GO
-- Empty the data file.
DBCC SHRINKFILE (Test1data, EMPTYFILE);
GO
-- Remove the data file from the database.
ALTER DATABASE AdventureWorks
REMOVE FILE Test1data;
GO
如若滿意,請點擊右側【採納答案】,如若還有問題,請點擊【追問】
希望我的回答對您有所幫助,望採納!
~ O(∩_∩)O~
⑼ SQL 主數據文件怎麼壓縮
把SQL數據停了之後,到SQL數據文件夾下壓縮就行了,
或者是另外一種,SQL管理器里右鏈資料庫,有壓縮功能。
⑽ 如何壓縮SQL Server 2005指定資料庫文件和日誌的大小
下面有兩個SQL語句可以達到在SQL Server 2005/2008壓縮指定資料庫文件和日誌的大小的效果:
1、DBCC SHRINKDATABASE (Transact-SQL)
收縮指定資料庫中的數據文件和日誌文件的大小。
語法
DBCC SHRINKDATABASE
( 'database_name' | database_id | 0
[ ,target_percent ]
[ , { NOTRUNCATE | TRUNCATEONLY } ]
)
[ WITH NO_INFOMSGS ]
參數
'database_name' | database_id | 0 要收縮的資料庫的名稱或 ID。如果指定 0,則使用當前資料庫。
target_percent 資料庫收縮後的資料庫文件中所需的剩餘可用空間百分比。
NOTRUNCATE 通過將已分配的頁從文件末尾移動到文件前面的未分配頁來壓縮數據文件中的數據。target_percent 是可選參數。 文件末尾的可用空間不會返回給操作系統,文件的物理大小也不會更改。因此,指定 NOTRUNCATE 時,資料庫看起來未收縮。 NOTRUNCATE 只適用於數據文件。日誌文件不受影響。
TRUNCATEONLY 將文件末尾的所有可用空間釋放給操作系統,但不在文件內部執行任何頁移動。數據文件只收縮到最近分配的區。如果與 TRUNCATEONLY 一起指定,將忽略 target_percent。 TRUNCATEONLY 只適用於數據文件。日誌文件不受影響。
WITH NO_INFOMSGS 取消嚴重級別從 0 到 10 的所有信息性消息。
結果集
列名 說明
DbId 資料庫引擎試圖收縮的文件的資料庫標識號。
FileId 資料庫引擎嘗試收縮的文件的文件標識號。
CurrentSize 文件當前佔用的 8 KB 頁數。
MinimumSize 文件最低可以佔用的 8 KB 頁數。這與文件的最小大小或最初創建時的大小相對應。
UsedPages 文件當前使用的 8 KB 頁數。
EstimatedPages 資料庫引擎估計文件能夠收縮到的 8 KB 頁數。
備注
若要收縮特定資料庫的所有數據和日誌文件,請執行 DBCC SHRINKDATABASE 命令。若要一次收縮一個特定資料庫中的一個數據或日誌文件,請執行 DBCC SHRINKFILE 命令。
若要查看資料庫中當前的可用(未分配)空間量,請運行 sp_spaceused。
可在進程中的任一點停止 DBCC SHRINKDATABASE 操作,任何已完成的工作都將保留。
收縮後的資料庫不能小於資料庫的最小大小。最小大小是在資料庫最初創建時指定的大小,或是使用文件大小更改操作(如 DBCC SHIRNKFILE 或 ALTER DATABASE)顯式設置的最後大小。例如,如果資料庫最初創建時的大小為 10 MB,後來增長到 100 MB,則該資料庫最小隻能收縮到 10 MB,即使已經刪除資料庫的所有數據也是如此。
運行 DBCC SHRINKDATABASE 而不指定 NOTRUNCATE 選項或 TRUNCATEONLY 選項等價於帶 NOTRUNCATE 運行 DBCC SHRINKDATABASE 操作,然後再帶 TRUNCATEONLY 運行 DBCC SHRINKDATABASE 操作。
要收縮的資料庫不必在單用戶模式下;其他的用戶仍可以在資料庫收縮時對其進行工作。這也包括系統資料庫。
不能在備份資料庫時收縮資料庫。反之,也不能在資料庫執行收縮操作時備份資料庫。
DBCC SHRINKDATABASE 的工作原理
DBCC SHRINKDATABASE 以每個文件為單位對數據文件進行收縮。然而,DBCC SHRINKDATABASE 在對日誌文件進行收縮時,它將視為所有的日誌文件都存在於一個連續的日誌池中。文件始終從末尾開始收縮。
假設名為 mydb 的資料庫有一個數據文件和兩個日誌文件。數據文件和日誌文件分別是 10 MB,並且數據文件包含 6 MB 數據。
Microsoft SQL Server 2005 資料庫引擎對每個文件計算一個目標大小。這就是文件將要收縮到的大小。將 target_percent 與 DBCC SHRINKDATABASE 一起指定時,資料庫引擎計算的目標大小是收縮後文件中的 target_percent 可用空間大小。例如,如果在收縮 mydb 時將 target_percent 指定為 25,則資料庫引擎將此文件的目標大小計算為 8 MB(6 MB 數據加上 2 MB 可用空間)。因此,資料庫引擎將任何數據從數據文件的後 2 MB 中移動到數據文件前 8 MB 的可用空間中,然後對該文件進行收縮。
假設 mydb 的數據文件包含 7 MB 的數據。將 target_percent 指定為 30,以允許將此數據文件收縮到可用空間為 30%。但是,將 target_percent 指定為 40 卻不會收縮數據文件,因為資料庫引擎收縮文件的目標大小不能小於數據當前佔用空間大小。您還可以用另一種方法來考慮此問題:所要求的 40% 可用空間加上整個數據文件大小的 70%(10 MB 中的 7 MB),超過了 100%。因為所要求的可用百分比加上數據文件佔用的當前百分比大於 100%(多出 10%),所以任何大於 30 的 target_size 都不會收縮此數據文件。
對於日誌文件,資料庫引擎使用 target_percent 來計算整個日誌的目標大小;因此,target_percent 是收縮操作後日誌中的可用空間大小。之後,整個日誌的目標大小轉換為每個日誌文件的目標大小。
DBCC SHRINKDATABASE 嘗試立即將每個物理日誌文件收縮到其目標大小。如果虛擬日誌中的所有邏輯日誌部分都沒有超出日誌文件的目標大小,則該文件將成功截斷,DBCC SHRINKDATABASE 完成且不顯示任何消息。但是,如果部分邏輯日誌位於超出目標大小的虛擬日誌中,則資料庫引擎將釋放盡可能多的空間,並發出一條信息性消息。該消息說明需要執行哪些操作來將邏輯日誌移出位於文件末尾的虛擬日誌。執行該操作以後,DBCC SHRINKDATABASE 可用於釋放剩餘空間。有關詳細信息,請參閱收縮事務日誌。
因為日誌文件只能收縮到虛擬日誌文件邊界,所以不可能將日誌文件收縮到比虛擬日誌文件更小(即使現在沒有使用該文件)。虛擬日誌文件的大小在創建或擴展這些日誌文件時由資料庫引擎動態選擇。有關虛擬日誌文件的詳細信息,請參閱事務日誌物理體系結構。