ubuntu 禁用透明大页_MySQL InnoDB 透明页压缩(Page Compression)
MySQL InnoDB支持數據壓縮,有兩種數據壓縮方式,第一種為表壓縮,通常也稱之為行格式壓縮,另外一種是頁壓縮(Page Compression),又叫做透明頁壓縮(Transparent Page Compression),是一種頁面級別的數據壓縮,頁壓縮對操作系統及文件系統有一定的要求。本文主要介紹頁壓縮的原理及使用方法。
頁壓縮只支持InnoDB獨立表空間:file-per-table
頁壓縮需要操作系統具有稀疏文件(sparse file)或者文件打孔技術(hole punching)的支持,目前支持這種功能的主流操作系統如下:
Windows NTFS
RHEL 7 內核 3.10.0-123 及更高版本
Ubuntu 14.0.4 LTS 內核 3.13 及更高版本
Ubuntu 12.0.4 LTS 內核 3.2 及更高版本
Debian?7 內核 3.2 及更高版本
1. 頁壓縮語法
在create table或者alter table時,加上 COMPRESSION? 子句,支持的壓縮算法主要有Zlib?和?LZ4。
開啟頁壓縮:
CREATE TABLE t1 (c1 INT) COMPRESSION=”zlib”;
ALTER TABLE t1 COMPRESSION=”zlib”;
OPTIMIZE TABLE t1;
禁用頁壓縮:
ALTER TABLE t1 COMPRESSION=”None”;
OPTIMIZE TABLE t1;
2. 頁壓縮原理
當一個頁被寫入磁盤時,InnoDB使用指定的壓縮算法對該頁進行壓縮,然后將壓縮后的數據寫入磁盤,此時打孔機制會將壓縮后的頁尾空閑塊進行釋放,以減少磁盤空間占用。如果壓縮失敗,則按照原樣寫入數據。
在Linux操作系統中,文件系統塊大小是打孔的單位尺寸,因此,頁壓縮后的數據必須小于等于InnoDB頁大小減去文件系統塊大小的值,才能使頁壓縮生效。舉個例子,InnoDB頁大小16K,文件系統塊大小4K,頁數據必須被壓縮到小于等于12K,才能使用打孔機制,減少磁盤空間占用。
在Windows操作系統中,稀疏文件基于NTFS文件系統壓縮功能實現,打孔單位尺寸為NTFS壓縮單元尺寸,這個尺寸是NTFS簇大小的16倍。NTFS簇大小與壓縮單元大小對應關系如下表:
NTFS簇大小
NTFS壓縮單元大小
512Bytes
8KB
1KB
16KB
2KB
32KB
4KB
64KB
同樣的,只有當壓縮后的數據小于等于InnoDB頁大小減去壓縮單元的大小時,才能使頁壓縮生效。默認的NTFS簇大小4KB,壓縮單元大小64KB,這就意味著NTFS默認配置下,無法使用頁壓縮。因此,如果要想頁壓縮在NTFS文件系統上生效,需要設置NTFS簇大小為512Bytes,此時壓縮單元大小為8KB,設置InnoDB頁大小為默認的16KB,或者更大的32KB、64KB,才能使頁壓縮生效。
3. 頁壓縮的元數據
系統表 INNODB_SYS_TABLESPACES 存儲了頁壓縮相關的元數據,其主要字段含義如下:
INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES
FS_BLOCK_SIZE:文件系統塊尺寸,打孔單元的大小。
FILE_SIZE:表示未壓縮文件的尺寸。
ALLOCATED_SIZE:在磁盤上分配的文件的實際尺寸。
使用頁壓縮功能后,ls命令顯示的大小是未壓縮的大小,而實際的大小使用du命令查看。
ls -l?tablespace_name.ibd,顯示FILE_SIZE大小
du –block-size=1?tablespace_name.ibd,顯示ALLOCATED_SIZE大小
4. 頁壓縮的限制和使用注意事項
如果文件系統塊大小或者壓縮單元大小乘以2大于innodb頁大小時,頁壓縮將自動失效。
共享表空間(系統表空間,臨時表空間,通用表空間)中的表不支持頁壓縮。
undo log 和 redo log 表空間不支持頁壓縮。
空間索引 R-tree 頁 不支持頁壓縮。
行格式壓縮過的表(ROW_FORMAT=COMPRESSED),不支持頁壓縮。
在InnoDB崩潰恢復過程中,更新的頁面將以未壓縮的形式寫出。
在一個不支持壓縮算法的服務器上加載頁壓縮后的表空間,會導致I/O錯誤。
使用一個較大的innodb頁大小,比如64KB,文件系統塊大小4KB,這樣的配置能夠提高壓縮效果,但是同時也會導致寫放大,需要更大的buffer pool,增加I/O消耗。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的ubuntu 禁用透明大页_MySQL InnoDB 透明页压缩(Page Compression)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 子主题function php,php
- 下一篇: linux启动mysql1820_lin