RDS SQL Server空間不足問題
RDS SQL Server實(shí)例的空間使用率是日常需要重點(diǎn)關(guān)注的監(jiān)控項(xiàng)之一,實(shí)例的存儲(chǔ)空間不足,會(huì)導(dǎo)致嚴(yán)重后果,例如數(shù)據(jù)庫(kù)無法寫入、數(shù)據(jù)庫(kù)無法備份、存儲(chǔ)空間擴(kuò)容任務(wù)耗時(shí)過長(zhǎng)等。本文介紹如何查看空間使用情況以及排查空間問題。
查看空間使用情況
您可以在實(shí)例的基本信息頁(yè)面查看存儲(chǔ)空間使用情況,但是這里只展示當(dāng)前的空間使用總量,沒有展示各類數(shù)據(jù)分別占用的磁盤空間信息,也沒有空間使用的歷史信息。
您可以在控制臺(tái)的監(jiān)控與報(bào)警頁(yè)面,單擊舊版監(jiān)控頁(yè)簽內(nèi)的資源監(jiān)控,查看實(shí)例各類數(shù)據(jù)占用的磁盤空間信息和歷史變化曲線。
說明系統(tǒng)文件空間使用量包括系統(tǒng)數(shù)據(jù)庫(kù)master、msdb和model的所有數(shù)據(jù)文件和日志文件,以及一些系統(tǒng)文件(錯(cuò)誤日志、默認(rèn)跟蹤文件、系統(tǒng)擴(kuò)展事件文件等)。
您可以在控制臺(tái)的自治服務(wù) > 空間管理頁(yè)面,查看更詳細(xì)的空間使用情況,包括數(shù)據(jù)與日志的空間使用對(duì)比、空間使用的歷史變化趨勢(shì)、Top數(shù)據(jù)庫(kù)和Top表的空間分配明細(xì)等。更多信息,請(qǐng)參見空間管理。
說明實(shí)例不能是RDS SQL Server 2008 R2云盤版。
您也可以使用客戶端工具,例如SQL Server Management Studio,查看實(shí)例的空間使用信息。
常用的查看SQL Server數(shù)據(jù)庫(kù)空間使用信息的命令如下。
系統(tǒng)視圖或命令
說明
sp_helpdb
查看所有數(shù)據(jù)庫(kù)各自的總空間大小(數(shù)據(jù)文件與日志文件大小之和)。
sp_spaceused
查看當(dāng)前數(shù)據(jù)庫(kù)的名稱、已使用空間大小和未分配空間大小。
DBCC SQLPERF(LOGSPACE)
查看所有數(shù)據(jù)庫(kù)的各自日志文件總空間大小以及實(shí)際已使用日志空間大小。
DBCC SHOWFILESTATS
查看當(dāng)前數(shù)據(jù)庫(kù)的所有數(shù)據(jù)文件空間大小以及實(shí)際已使用數(shù)據(jù)空間大小。
select * from sys.master_files
查看所有數(shù)據(jù)庫(kù)各自的數(shù)據(jù)和日志文件的大小。
select * from sys.dm_db_log_space_usage
查看當(dāng)前數(shù)據(jù)庫(kù)的日志文件的總空間大小以及實(shí)際已使用日志空間大小。
說明僅適用于SQL Server 2012及以上版本。
select * from sys.dm_db_file_space_usage
查看當(dāng)前數(shù)據(jù)庫(kù)的數(shù)據(jù)文件的總空間大小以及實(shí)際已使用數(shù)據(jù)空間大小。
說明僅適用于SQL Server 2012及以上版本。
如果發(fā)現(xiàn)實(shí)例的空間使用率過高,首先應(yīng)該在RDS管理控制臺(tái)的監(jiān)控與報(bào)警頁(yè)面中檢查數(shù)據(jù)、日志、臨時(shí)文件、系統(tǒng)文件各部分的空間使用情況,確認(rèn)是哪種文件的空間增長(zhǎng)過快,并進(jìn)一步評(píng)估能否采取措施釋放空間或避免空間快速增長(zhǎng)。
詳細(xì)的分析與解決方案請(qǐng)參見下文。
回收和釋放數(shù)據(jù)空間
分析
數(shù)據(jù)空間的總大小(即所有數(shù)據(jù)文件大小總和)是由已分配(Allocated)空間和未分配(Unallocated)空間兩部分組成:
已分配空間包括已使用(Used)空間和未使用(Unused)空間,未使用空間只能分配給同一表或索引新增的記錄使用,其他數(shù)據(jù)庫(kù)對(duì)象無法直接使用。
未分配空間是由完全未分配的區(qū)(Extent)構(gòu)成的,每個(gè)區(qū)是連續(xù)的64 KB空間。未分配空間不和任何數(shù)據(jù)庫(kù)對(duì)象關(guān)聯(lián),這部分空間可以通過收縮文件的方式釋放。
解決方案
在數(shù)據(jù)量持續(xù)增長(zhǎng)的情況下,未分配空間通常很小,所以直接收縮文件效果很差,建議首先對(duì)已分配空間進(jìn)行優(yōu)化和回收,然后再考慮收縮文件。
數(shù)據(jù)空間的回收通常有如下幾種方式:
歸檔數(shù)據(jù)
刪除數(shù)據(jù)庫(kù)中不常用的數(shù)據(jù)(例如早期的歷史數(shù)據(jù)),或者根據(jù)需要遷移到其他數(shù)據(jù)庫(kù)實(shí)例中,或者以其他形式歸檔保存,通過直接減少數(shù)據(jù)量來降低已使用數(shù)據(jù)空間大小。
這種方式是控制數(shù)據(jù)空間增長(zhǎng)的有效手段,但是對(duì)數(shù)據(jù)庫(kù)對(duì)象結(jié)構(gòu)及相關(guān)應(yīng)用邏輯的設(shè)計(jì)有一定要求,需要應(yīng)用設(shè)計(jì)和開發(fā)人員的參與配合。
壓縮數(shù)據(jù)
SQL Server 2016及以上版本實(shí)例,或2016以下的企業(yè)版實(shí)例,內(nèi)置數(shù)據(jù)壓縮功能,您可以在單個(gè)表、索引或分區(qū)上開啟壓縮功能,包括行壓縮和頁(yè)壓縮。更多信息,請(qǐng)參見Data Compression。
數(shù)據(jù)壓縮比由表結(jié)構(gòu)、列的數(shù)據(jù)類型和數(shù)值分布情況等決定,跨度較大,例如從10%到90%。SQL Server中提供了一個(gè)專用的存儲(chǔ)過程sp_estimate_data_compression_savings可以幫助您快速評(píng)估在指定的表或索引上開啟壓縮可以節(jié)省多少數(shù)據(jù)存儲(chǔ)空間。
說明修改表或索引上的壓縮選項(xiàng)設(shè)置是DDL操作,大表執(zhí)行此類操作會(huì)造成長(zhǎng)時(shí)間鎖表,可能影響業(yè)務(wù),建議在業(yè)務(wù)低峰期修改。
RDS SQL Server企業(yè)版實(shí)例可以設(shè)置參數(shù)ONLINE為ON,然后執(zhí)行修改操作,基本不會(huì)影響正常業(yè)務(wù)。
數(shù)據(jù)壓縮會(huì)增加CPU開銷,因此需要根據(jù)實(shí)際業(yè)務(wù)情況進(jìn)行評(píng)估,建議只在大表上啟用數(shù)據(jù)壓縮。
整理索引碎片
索引碎片率較高會(huì)導(dǎo)致實(shí)際占用的數(shù)據(jù)存儲(chǔ)空間過大,因此對(duì)索引執(zhí)行碎片整理可以降低數(shù)據(jù)空間大小。
您可以在控制臺(tái)的自治服務(wù) > 性能優(yōu)化頁(yè)面,單擊索引使用率頁(yè)簽,可以查看各表的索引碎片率統(tǒng)計(jì)結(jié)果,并且自治服務(wù)會(huì)提供索引重建(Rebuild)或重組(Reorganize)建議。
重建(Rebuild)操作
優(yōu)化效果較好,對(duì)于碎片率高的情況執(zhí)行效率更高,默認(rèn)情況下執(zhí)行過程中會(huì)鎖表,企業(yè)版中可以設(shè)置參數(shù)ONLINE為ON避免長(zhǎng)時(shí)間鎖表。
重組(Reorganize)操作
對(duì)于碎片率較低的情況執(zhí)行效率更高,但優(yōu)化效果不如重建。
索引碎片率統(tǒng)計(jì)的是邏輯上相鄰的索引頁(yè)在物理位置上不一致的比例,和索引頁(yè)中的空閑空間比例不是一個(gè)概念,只是碎片率較高的索引大概率也是可回收空間比例較大的索引。
如果需要分析某個(gè)索引的頁(yè)內(nèi)平均空閑空間比例,可以使用SAMPLED或DETAILED模式查詢系統(tǒng)視圖sys.dm_db_index_physical_stats,然后參考結(jié)果集中avg_page_space_used_in_percent列的值。更多信息,請(qǐng)參見sys.dm_db_index_physical_stats (Transact-SQL)。
說明查詢過程會(huì)讀取大量索引頁(yè),可能影響數(shù)據(jù)庫(kù)性能,請(qǐng)?jiān)跇I(yè)務(wù)低峰期操作。
整理索引碎片只適用于更新頻率很低的歸檔數(shù)據(jù)表,如果有頻繁的插入和更新操作,索引碎片率會(huì)很快升高,而且重建或重組的過程中,會(huì)產(chǎn)生大量事務(wù)日志,導(dǎo)致日志空間的增加。
以上操作通常可以有效降低數(shù)據(jù)空間大小,但是如果實(shí)例空間仍然有壓力,可以執(zhí)行DBCC SHRINKFILE
命令收縮數(shù)據(jù)文件,將數(shù)據(jù)文件中未分配空間釋放給操作系統(tǒng)。
以上圖為例,一個(gè)區(qū)(Extent)的大小為64 KB,因此數(shù)據(jù)文件的總空間大小為104584 MB,已分配空間為82089 MB,即壓縮后數(shù)據(jù)文件空間的總大小不會(huì)低于82089 MB。要將該數(shù)據(jù)文件空間的總大小縮小到90000MB,可以執(zhí)行如下命令:
DBCC SHRINKFILE(1, 90000)
更多信息,請(qǐng)參見Shrink a Database和DBCC SHRINKFILE (Transact-SQL)。
回收日志空間
回收日志空間比較簡(jiǎn)單,使用DBCC SQLPERF(LOGSPACE)
命令或自治服務(wù)查看數(shù)據(jù)庫(kù)的日志文件空間中實(shí)際已使用部分的比例,如果已使用部分的比例較高,收縮日志文件幾乎沒有效果,可以查詢系統(tǒng)視圖sys.databases,通過log_reuse_wait和log_reuse_wait_desc列的輸出信息判斷空間為何無法回收。
log_reuse_wait和log_reuse_wait_desc的取值說明請(qǐng)參見sys.databases (Transact-SQL)。
絕大部分情況下,您不需要手動(dòng)對(duì)日志文件執(zhí)行收縮操作,每次自動(dòng)備份后都會(huì)收縮日志文件,如果確實(shí)需要盡快收縮日志文件大小,例如日志文件增長(zhǎng)導(dǎo)致實(shí)例可用存儲(chǔ)空間過低,且無法等到下一次的自動(dòng)備份開始,您可以在實(shí)例的備份恢復(fù)頁(yè)面單擊收縮事務(wù)日志,RDS會(huì)自動(dòng)備份所有的事務(wù)日志并收縮日志文件。
收縮事務(wù)日志需要等待日志備份完成,因此如果執(zhí)行該操作時(shí)數(shù)據(jù)庫(kù)中還有大量未備份過的日志,則需要等待較長(zhǎng)時(shí)間。
回收臨時(shí)文件空間
分析
臨時(shí)文件空間是指系統(tǒng)數(shù)據(jù)庫(kù)tempdb占用的空間大小。由于tempdb庫(kù)總是使用簡(jiǎn)單恢復(fù)模式,因此tempdb庫(kù)的日志文件通常很小,但是數(shù)據(jù)文件容易增長(zhǎng)地很快,例如創(chuàng)建大量臨時(shí)表、連接大表或排序等都可能導(dǎo)致tempdb庫(kù)數(shù)據(jù)文件空間增加。
解決方案
盡量從數(shù)據(jù)庫(kù)應(yīng)用層面規(guī)避,例如減少不必要的臨時(shí)表、大表連接查詢、避免大事務(wù)等。
在業(yè)務(wù)低峰期重啟RDS實(shí)例,重啟后tempdb庫(kù)占用的空間會(huì)恢復(fù)到實(shí)例創(chuàng)建時(shí)的大小。
回收系統(tǒng)文件空間
分析
系統(tǒng)文件空間是指系統(tǒng)數(shù)據(jù)庫(kù)master、msdb、model,以及系統(tǒng)目錄下的一些文件占用的空間大小。這些文件通常都很小,但是某些情況下占用的空間會(huì)很大,例如:
錯(cuò)誤日志較多,錯(cuò)誤日志文件大小增長(zhǎng)到幾 GB甚至更大。
嚴(yán)重異常時(shí)自動(dòng)產(chǎn)生的內(nèi)存轉(zhuǎn)儲(chǔ)(memory dump)文件。
解決方案
您無法直接獲知各類系統(tǒng)文件實(shí)際占用的空間大小。
擴(kuò)容存儲(chǔ)空間
如果RDS實(shí)例空間使用率過高,且參考上文后無法有效降低空間使用率,應(yīng)及時(shí)擴(kuò)容實(shí)例存儲(chǔ)空間。具體操作,請(qǐng)參見變更配置。