每表文件表空間 - innodb_file_per_table

每表文件表空間

歷史上,InnoDB表存儲在 系統表空間中。這種整體方法針對的是專用于數據庫處理的計算機,該計算機具有經過精心計劃的數據增長,而分配給MySQL的任何磁盤存儲都不會出于其他目的。文件的每個表的表空間特征提供了一種更靈活的選擇,其中,每個InnoDB表被存儲在其自己的表空間的數據文件(.ibd文件)。此功能由innodb_file_per_table 配置選項控制 ,默認情況下已啟用。

好處
  • 截斷或刪除每個表文件表空間中存儲的表時,可以回收磁盤空間。截斷或刪除存儲在共享 系統表空間中的表會在系統表空間數據文件(ibdata文件內部創建可用空間,該空間只能用于新 InnoDB數據。

    同樣,ALTER TABLE對駐留在共享表空間中的表進行表復制操作會增加表空間使用的空間量。此類操作可能需要與表中的數據加索引一樣多的額外空間。表復制ALTER TABLE操作所需的額外空間 不會像每表文件表空間那樣釋放回操作系統。

  • TRUNCATE TABLE在每個表文件表空間中存儲的表上運行時, 該操作更快。

  • 您可以使用語法指定每個表的位置,以將特定表存儲在單獨的存儲設備上,以實現I / O優化,空間管理或備份目的 ,如第15.6.3.6節“在數據目錄之外創建表空間”所述”。 CREATE TABLE ... DATA DIRECTORY = absolute_path_to_directory

  • 您可以運行OPTIMIZE TABLE來壓縮或重新創建每表文件表空間。運行時OPTIMIZE TABLE, 僅使用存儲實際數據所需的空間InnoDB創建一個.ibd具有臨時名稱的新 文件。優化完成后,請InnoDB刪除舊.ibd文件,然后將其替換為新文件。如果先前的.ibd文件顯著增長,但是實際數據僅占其大小的一部分,則運行OPTIMIZE TABLE可以回收未使用的空間。

  • 您可以移動單個InnoDB表而不是整個數據庫。

  • 您可以將單個InnoDB表從一個MySQL實例復制到另一個(稱為可 傳輸表空間功能)。

  • 在每表文件表空間中創建的表支持與壓縮 和動態行格式關聯的功能 。

  • 您可以使用動態行格式為具有大表BLOBTEXT列的表啟用更有效的存儲 。

  • 每表文件表空間可以增加成功恢復的機會,并在發生損壞,無法重新啟動服務器或備份和二進制日志不可用時節省時間。

  • 您可以使用MySQL企業備份產品快速備份或還原單個表,而不會中斷其他InnoDB的使用。如果您的表需要較少的備份頻率或以不同的備份時間表進行備份,這將很有用。有關詳細信息,請參見進行部分備份。

  • 每表文件表空間在復制或備份表時便于按表狀態報告。

  • 您可以在文件系統級別監視表大小,而無需訪問MySQL。

  • 當通用的Linux文件系統不允許同時寫一個文件 innodb_flush_method設置為 O_DIRECT。因此,當結合使用每表文件表空間和時,可能會提高性能 innodb_flush_method。

  • 系統表空間存儲數據字典和撤消日志,并且其大小受InnoDB 表空間大小限制。請參見 第15.6.1.6節“ InnoDB表的限制”。對于每個表文件表空間,每個表都有自己的表空間,這為增長提供了空間。

潛在的缺點
  • 使用每表文件表空間,每個表可能具有未使用的空間,該空間只能由同一表的行使用。如果管理不當,可能會導致空間浪費。

  • fsync操作必須在每個打開的表上而不是單個文件上運行。因為fsync每個文件都有單獨的操作,所以不能將對多個表的寫操作合并為一個I / O操作。這可能需要 InnoDB執行更高數量的 fsync操作。

  • mysqld必須為每個表保留一個打開的文件句柄,如果每個表文件表空間中有多個表,則可能會影響性能。

  • 使用更多的文件描述符。

  • innodb_file_per_table在MySQL 5.6和更高版本中默認啟用。如果需要考慮與MySQL早期版本的向后兼容性,則可以考慮禁用它。

  • 如果越來越多的表正在增長,則可能會出現更多碎片,這可能會妨礙DROP TABLE表掃描性能。但是,在管理碎片時,將文件放在自己的表空間中可以提高性能。

  • 刪除每表文件表空間時,將掃描緩沖池,對于大小為數十GB的緩沖池,這可能需要花費幾秒鐘的時間。使用寬泛的內部鎖定執行掃描,這可能會延遲其他操作。系統表空間中的表不受影響。

  • innodb_autoextend_increment 變量定義增量大?。ㄒ訫B為單位),用于在自動擴展共享表空間文件已滿時擴展其大小,該 變量不適用于每表文件表空間文件,無論innodb_autoextend_increment 設置如何,該文件均會自動擴展 。初始擴展名不多,之后擴展名以4MB為增量。

啟用每表文件表空間

innodb_file_per_table 默認情況下啟用 該選項。

innodb_file_per_table在啟動時設置該 選項,請使用--innodb_file_per_table 命令行選項啟動服務器 ,或將此行添加到以下 [mysqld]部分 my.cnf

[mysqld]
innodb_file_per_table=1

您還可以innodb_file_per_table 在服務器運行時動態設置 

mysql> SET GLOBAL innodb_file_per_table=1;

innodb_file_per_table 啟用,可以存儲InnoDB在一個表 tbl_name.ibd 文件。MyISAM存儲引擎不同,存儲引擎具有 用于索引和數據的單獨 文件tbl_name.MYD和 tbl_name.MYI文件,InnoDB將數據和索引一起存儲在單個 .ibd文件中。

如果禁用 innodb_file_per_table啟動選項并重新啟動服務器,或者使用SET GLOBAL命令禁用服務器,請 InnoDB 在系統表空間內創建新表,除非已使用該CREATE TABLE ... TABLESPACE選項將表顯式放置在每表文件表空間或常規表空間中 。

InnoDB 無論每表文件設置如何, 您始終可以讀寫任何表。

要將表從系統表空間移至其自己的表空間,請更改 innodb_file_per_table設置并重建表:

mysql> SET GLOBAL innodb_file_per_table=1;
mysql> ALTER TABLE table_name ENGINE=InnoDB;

使用CREATE TABLE ... TABLESPACE或 ALTER TABLE ... TABLESPACE語法添加到系統表空間的表 不受此innodb_file_per_table設置的影響 。要將這些表從系統表空間移至每個表文件表空間,必須使用ALTER TABLE ... TABLESPACE語法將其顯式移動 。

注意

InnoDB始終需要系統表空間,因為它會將其內部數據字典放在其中 撤消日志。這些 .ibd文件不足以進行 InnoDB操作。

將表從系統表空間移到其自己的.ibd文件時,構成系統表空間的數據文件將保持相同大小。以前由表占用的空間可以重新用于新 InnoDB數據,但不能回收供操作系統使用。將大型 InnoDB表移出磁盤空間有限的系統表空間時,您可能更喜歡innodb_file_per_table使用mysqldump命令啟用 并重新創建整個實例 。如上所述,使用CREATE TABLE ... TABLESPACE或 ALTER TABLE ... TABLESPACE語法添加到系統表空間的表 不受 innodb_file_per_table 設置。這些表必須單獨移動。

業務熱線電話:(+86)021-52765253 021-61172807      上海哲濤網絡科技有限公司版權所有 © 2005-2023       滬ICP備06058430-1號

滬公網安備 31011302000898號

校睿寶,培訓機構學員管理軟件,教師工資計算軟件,消課管理軟件!

手機智慧課堂答題,短信答題,微信答題!

數據備份軟件,文件數據備份軟件,文件備份軟件,B/S架構備份軟件,分布式計算機備份軟件!

点广告流量赚钱吗 大智慧股票软件免费 急速赛车10 pk10赛车群 贵州快3走势图带连线 四川金7乐奖金设置 黑龙江11选5胆拖表 江苏7位数开奖结果查询 上海11选5结果走势图 五分彩定位胆万能公式 如何开户炒股