干貨分享:SQLSERVER使用裸設備
這篇文章也適合ORACLE DBA和MYSQL DBA 閱讀
裸設備適用于Linux和Windows
在ORACLE和MYSQL里也是支持裸設備的!!
介紹
大家看到這個標題一定是一頭霧水吧,裸設備??裸體的設備??太邪惡了o(∩_∩)o
裸設備:有人叫raw disk,也有人叫raw device
百度一下:
裸設備(raw device),也叫裸分區(原始分區),是一種沒有經過格式化,不被Unix通過文件系統來讀取的特殊字符設備。
它由應用程序負責對它進行讀寫操作。不經過文件系統的緩沖。
它是不被操作系統直接管理的設備。
這種設備少了操作系統這一層,I/O效率更高。不少數據庫都能通過使用裸設備作為存儲介質來提高I/O效率。
因為使用裸設備避免了再經過操作系統這一層,數據直接從Disk到數據庫進行傳輸,所以使用裸設備對于讀寫頻繁的數據庫應用來說,可以極大地提高數據庫系統的性能。
當然,這是以磁盤的 I/O 非常大,磁盤I/O已經稱為系統瓶頸的情況下才成立。
如果磁盤讀寫確實非常頻繁,以至于磁盤讀寫成為系統瓶頸的情況成立,那么采用裸設備確實可以大大提高性能
在宋沄劍的文章里《SQL Server數據庫損壞、檢測以及簡單的修復辦法》
在這個過程中,數據臟頁由內存寫入持久化的IO子系統,在此期間,按照IO子系統的不同,數據可能經過這幾層:
Windows(寫數據一定調用的是WINDOWS API)
Windows底層的中間層(殺毒軟件,磁盤加密系統)
RAID控制器(IO子系統做了RAID)
磁盤或SSD等持久化存儲器
其實如果使用了裸設備,數據是不需要經過I/O子系統的,直接寫入到文件中
根據MSDN說一下裸設備在SQLSERVER的限制
SQLSERVER2000支持數據庫創建在使用raw格式的分區。raw格式分區是一種沒有格式化的文件系統,就像FAT文件系統和NTFS文件系統。
在某些情況下,數據庫創建在raw格式的分區能產生重要的性能提升相對于NTFS或FAT文件系統。
然而,大多數情況下,還是建議使用NTFS或FAT分區來存放數據庫文件
當你把數據庫創建在raw分區下的時候,你不能指定數據庫數據文件的物理名字;你只能夠指定數據庫數據文件要存放的那個磁盤的驅動器號
如果你使用Windows2000服務器版,你可以掛載一個使用raw文件格式的驅動器。當你在一個空文件夾掛載一個本地驅動器的時候,
Windows2000會分配一個磁盤路徑,這樣會比只分配一個驅動器號好。
掛載驅動器不受26個盤符的限制(分區超過26個就不能再建立分區了),因此,你可以使用不受數量限制的raw分區。
下面有幾個限制是需要考慮的,當使用raw分區的時候
(1)每一個raw分區只能有一個數據庫數據文件。
(2)標準的文件操作,例如:復制文件,移動文件,刪除文件都不能在raw分區使用
(3)放在raw分區的數據庫文件都不能直接使用備份軟件備份,例如Acronis.True.Image.Echo.Enterprise.Server這些都不能用
但是SQLSERVER的完整數據庫備份、差異備份、日志備份,這些SQLSERVER的備份功能是可以正常使用的
(4)存放在raw分區上的數據文件都不能自動增長的。最好在創建數據庫文件的時候就指定數據庫文件的大小為raw分區的大小
或者當數據庫數據文件大小不夠再進數據的時候手動設置數據文件或日志文件的大小
CREATE DATABASE [test] ON PRIMARY ( NAME = N'test', FILENAME = N'f:',SIZE = 9024MB )
ALTER DATABASE [sss] MODIFY FILE(name=SSS_Data,size=2048)
ALTER DATABASE [sss] MODIFY FILE(name=SSS_Log,size=2048)
(5)一些文件系統服務,例如壞塊替換,磁盤整理是不能用的,對于raw分區
實驗
實驗環境:Windows2003 ;SQLSERVER2008R2
實際上,在Windows下裸設備實質就是沒有格式化的分區
先在虛擬機添加一個硬盤,大小是10GB
進行初始化
初始化之后不能格式化
新建一個簡單卷,記得不要格式化,分配一個盤符號就可以了
F盤是打不開的
--------------------------------------------------------------------------------------------------------------
創建數據庫
CREATE DATABASE [test] ON PRIMARY ( NAME = N'test', FILENAME = N'F:',SIZE = 9024MB ) LOG ON ( NAME = N'test_log', FILENAME = N'E:\test_log.ldf' ,SIZE = 2048000KB , FILEGROWTH = 10%) GO
創建數據庫的時候要注意
(1)每一個raw分區只能有一個數據庫數據文件。
(4)存放在raw分區上的數據文件都不能自動增長的。最好在創建數據庫文件的時候就指定數據庫文件的大小為raw分區的大小
如果你指定了物理路徑,那么就會報錯
消息 5133,級別 16,狀態 1,第 3 行 對文件 "F:\test.mdf" 的目錄查找失敗,出現操作系統錯誤 1005(此卷不包含可識別的文件系統。 請確定所有請求的文件系統驅動程序已加載,且此卷未損壞。)。 消息 1802,級別 16,狀態 1,第 3 行 CREATE DATABASE 失敗。無法創建列出的某些文件名。請查看相關錯誤。
測試
新建測試表
--建測試表 USE test GO CREATE TABLE testperf ( id INT IDENTITY(1, 1) PRIMARY KEY , NAME NVARCHAR(200) , timeon DATETIME )
插入測試
--插入數據 INSERT INTO testperf SELECT '你好',GETDATE()
查詢測試
--查詢數據 SELECT * FROM testperf
-------------------------------------------------------------------------------------------------------
新建一個數據庫進行對比
下面這個數據庫是建在E盤,分區格式是NTFS
CREATE DATABASE [testa] ON PRIMARY ( NAME = N'testa', FILENAME = N'E:\testa.Mdf',SIZE = 9024MB ) LOG ON ( NAME = N'testa_log', FILENAME = N'E:\testa_log.ldf' ,SIZE = 2048000KB , FILEGROWTH = 10%) GO
建測試表
--建測試表 USE testa GO CREATE TABLE testperf ( id INT IDENTITY(1, 1) PRIMARY KEY , NAME NVARCHAR(200) , timeon DATETIME )
插入測試
查詢測試
結論:可以看出使用裸設備速度上會比有文件系統的快一些,當然數據量比較少,測試機器配置不是很給力,上面的測試結果也只作為參考!!
使用裸設備的數據庫備份
使用裸設備的數據庫是可以正常備份的
使用下面的備份語句
BACKUP DATABASE [test] TO DISK = N'E:\test_fullbackup2014-4-10.bak' WITH NOFORMAT, NOINIT, NAME = N'test-完整 數據庫 備份', SKIP, NOREWIND, NOUNLOAD, STATS = 10, CHECKSUM GO
當然你也可以使用圖形界面來備份數據庫
數據庫還原,當你使用圖形界面來還原數據庫的時候,你會發現還原不了數據庫,報錯
將數據庫文件還原為窗口那里一般會顯示將數據庫中相應的數據文件還原到的物理路徑,但是因為裸設備是沒有物理路徑的
那么是不是使用裸設備的數據庫就不能還原呢???
實際上,要還原數據庫只能使用SQL語句來還原,而不能使用圖形界面
RESTORE DATABASE [test] FROM DISK = N'E:\test_fullbackup2014-4-10.bak' WITH FILE = 1, NOUNLOAD, STATS = 10 GO

已處理百分之 13。 已處理百分之 22。 已處理百分之 31。 已處理百分之 40。 已處理百分之 54。 已處理百分之 63。 已處理百分之 72。 已處理百分之 81。 已處理百分之 90。 已處理百分之 100。 已為數據庫 'test',文件 'test' (位于文件 1 上)處理了 176 頁。 已為數據庫 'test',文件 'test_log' (位于文件 1 上)處理了 2 頁。 RESTORE DATABASE 成功處理了 178 頁,花費 37.497 秒(0.037 MB/秒)。
總結
因為raw分區是不能夠打開的,所以運維團隊需要監控住在裸設備上的數據庫數據文件是否不夠空間,以免發生數據插入失敗的情況
這篇文章簡單介紹了一下裸設備,以及數據庫使用裸設備帶來的性能提升的簡單測試
最后說一句:無論是使用文件系統也好,裸設備也好,珍愛生命,記得備份!
相關文章:
Faster way to read the raw data on disk/drive
兩個機器通過裸設備映射RDM共享的仲裁盤,msdtc盤還有數據盤
如有不對的地方,歡迎大家拍磚o(∩_∩)o
文章列表