系統表空間是變更緩衝區的儲存區域。如果資料表是在系統表空間中建立,而非單表表空間或一般表空間,它也可能包含資料表和索引資料。
系統表空間可以有一個或多個資料檔案。依預設,會在資料目錄中建立單一系統表空間資料檔案,名為 ibdata1
。系統表空間資料檔案的大小和數量由 innodb_data_file_path
啟動選項定義。如需設定資訊,請參閱系統表空間資料檔案設定。
本節的下列主題提供了關於系統表空間的其他資訊
本節說明如何增加或減少系統表空間的大小。
增加系統表空間的大小
增加系統表空間大小最簡單的方法是將其設定為自動擴展。若要執行此操作,請為 innodb_data_file_path
設定中的最後一個資料檔案指定 autoextend
屬性,然後重新啟動伺服器。例如
innodb_data_file_path=ibdata1:10M:autoextend
當指定 autoextend
屬性時,資料檔案會隨著需要空間而自動以 8MB 的增量增加大小。innodb_autoextend_increment
變數控制增量大小。
您也可以透過新增另一個資料檔案來增加系統表空間大小。若要執行此操作
停止 MySQL 伺服器。
如果
innodb_data_file_path
設定中的最後一個資料檔案定義了autoextend
屬性,請將其移除,並修改大小屬性以反映目前的資料檔案大小。若要判斷要指定適當的資料檔案大小,請檢查您的檔案系統以取得檔案大小,並將該值向下捨入至最接近的 MB 值,其中 1 MB 等於 1024 x 1024 個位元組。將新的資料檔案附加到
innodb_data_file_path
設定,可選擇性地指定autoextend
屬性。autoextend
屬性只能在innodb_data_file_path
設定中的最後一個資料檔案上指定。啟動 MySQL 伺服器。
例如,這個表空間有一個自動擴展的資料檔案
innodb_data_home_dir =
innodb_data_file_path = /ibdata/ibdata1:10M:autoextend
假設資料檔案隨著時間增長到 988MB。這是修改大小屬性以反映目前的資料檔案大小,並在指定新的 50MB 自動擴展資料檔案後的 innodb_data_file_path
設定
innodb_data_home_dir =
innodb_data_file_path = /ibdata/ibdata1:988M;/disk2/ibdata2:50M:autoextend
在新增資料檔案時,請勿指定現有的檔案名稱。當您啟動伺服器時,InnoDB
會建立並初始化新的資料檔案。
您無法透過變更大小屬性來增加現有系統表空間資料檔案的大小。例如,將 innodb_data_file_path
設定從 ibdata1:10M:autoextend
變更為 ibdata1:12M:autoextend
,在啟動伺服器時會產生以下錯誤
[ERROR] [MY-012263] [InnoDB] The Auto-extending innodb_system
data file './ibdata1' is of a different size 640 pages (rounded down to MB) than
specified in the .cnf file: initial 768 pages, max 0 (relevant if non-zero) pages!
此錯誤表示現有資料檔案大小 (以 InnoDB
頁面表示) 與組態檔中指定的資料檔案大小不同。如果您遇到此錯誤,請還原先前的 innodb_data_file_path
設定,並參考系統表空間調整大小的指示。
減少 InnoDB 系統表空間的大小
不支援減少現有系統表空間的大小。達成較小系統表空間的唯一選項是將您的資料從備份還原到使用所需系統表空間大小組態建立的新 MySQL 執行個體。
有關建立備份的資訊,請參閱 章節 17.18.1,「InnoDB 備份」。
有關為新系統表空間設定資料檔案的資訊。請參閱系統表空間資料檔案設定。
為了避免大型的系統表空間,請考慮對您的資料使用每個表格表空間或一般表空間。每個表格表空間是預設的表空間類型,並且在建立 InnoDB
表格時隱式使用。與系統表空間不同,當每個表格表空間被截斷或刪除時,它們會將磁碟空間返回給作業系統。如需更多資訊,請參閱章節 17.6.3.2,「每個表格表空間」。一般表空間是多表格表空間,也可以用作系統表空間的替代方案。請參閱章節 17.6.3.3,「一般表空間」。
原始磁碟分割區可以用作系統表空間資料檔案。此技術可在 Windows 以及一些 Linux 和 Unix 系統上啟用非緩衝 I/O,而不會產生檔案系統的額外負擔。請使用和不使用原始分割區執行測試,以驗證它們是否能改善您系統上的效能。
當使用原始磁碟分割區時,請確保執行 MySQL 伺服器的使用者 ID 具有該分割區的讀取和寫入權限。例如,如果以 mysql
使用者執行伺服器,則分割區必須可由 mysql
讀取和寫入。如果使用 --memlock
選項執行伺服器,則伺服器必須以 root
身份執行,因此分割區必須可由 root
讀取和寫入。
以下描述的程序涉及選項檔案修改。如需更多資訊,請參閱章節 6.2.2.2,「使用選項檔案」。
在 Linux 和 Unix 系統上配置原始磁碟分割區
若要為新的伺服器執行個體使用原始裝置,請先設定
innodb_data_file_path
並使用raw
關鍵字,來準備組態檔。例如[mysqld] innodb_data_home_dir= innodb_data_file_path=/dev/hdd1:3Graw;/dev/hdd2:2Graw
分割區的大小必須至少與您指定的大小一樣大。請注意,
InnoDB
中的 1MB 是 1024 × 1024 個位元組,而磁碟規格中的 1MB 通常是指 1,000,000 個位元組。然後,使用
--initialize
或--initialize-insecure
來首次初始化伺服器。InnoDB 會注意到raw
關鍵字並初始化新的分割區,然後停止伺服器。現在重新啟動伺服器。
InnoDB
現在允許進行變更。
在 Windows 上配置原始磁碟分割區
在 Windows 系統上,適用於 Linux 和 Unix 系統的相同步驟和隨附指南也適用,只是 Windows 上的 innodb_data_file_path
設定略有不同。例如
[mysqld]
innodb_data_home_dir=
innodb_data_file_path=//./D::10Graw
//./
對應於 Windows 用於存取實體磁碟機的 \\.\
語法。在上面的範例中,D:
是分割區的磁碟機代號。