數據庫的表空間是用來存儲數據的邏輯空間,也是存儲數據的最大邏輯單元,其下還有段、區、頁等邏輯數據類型。表空間設計是為了提升更高的IOmysql 數據庫表不存在,不同處理數據的解耦,便于管理。
通過表空間來實現對數據文件的靈活控制。目前.0 版本,從原有的共享表空間,數據表空間分成如下5中表空間:
下面逐步了解一下。
1.
系統表空間:到目前為止的8.0.23保留下來的就是 的存儲區域。如果表在系統表空間創建的,而不是在file-per-table或表空間中創建的,那么它還包含表和索引數據。之前版本中,系統表空間包含數據字典。還包含緩沖區存儲區域。從MySQL 8.0.20開始 分離出來生成單獨的文件。
innodb_data_home_dir =/opt/data8.0/dbdata
innodb_data_file_path = ibdata1:16M;ibdata2:16M:autoextend
備注:屬性只能在h設置的最后一個數據文件中指定,對于系統表空間現有系統表空間的大小減少是不支持的。要實現更小的系統表空間,唯一的選擇是將數據從備份恢復。Mysql里刪除數據是不釋放空間的。
所以之前版本的系統表空間是非常大的。為了避免使用大的系統表空間,可使用每個表文件的表空間。File-per-table表空間是默認的表空間類型,在創建表時隱式使用。與系統表空間不同,在截斷或刪除在每個表文件表空間中創建的表之后,磁盤空間返回給操作系統。
2. File-per-table
獨立表空間包含單個表的數據和索引,并存儲在文件系統中自己的數據文件中。
#my.cnf配置
[mysqld]
innodb_file_per_table=ON
#命令行方式
mysql> SET GLOBAL innodb_file_per_table=ON;
mysql>CREATE TABLE city(
ID int
)ENGINE=Innodb TABLESPACE=innodb_file_per_table;
獨立表空間優勢:
缺點:
3.
通用表空間,通過理解 就是共享表空間的擴展,但只對于業務表。獨立于MySQL數據目錄的目錄中,可以在共享表空間,獨立表空間,通用表空間數據轉移??梢苑奖氵w移數據,特別是空間不夠的情況。
通用表空間的位置是不是隨意放的,只能在配置的目錄下。這個參數就是參數,注意read only屬性。
CREATE TABLESPACE tablespace_name
[ADD DATAFILE 'file_name']
[FILE_BLOCK_SIZE = value]
[ENGINE [=] engine_name]
備注:
1. 目前只能支持引擎。
2. 基于指定默認,無特殊需求不需要指定。
mysql默認頁大小是16kb,但啟動壓縮機制的時候,頁的大小是參數控制
配置f如下:
[mysqld]
innodb_directories=/opt/data8.0/tmpdata
mysql>use db4
mysql>CREATE TABLE ext_table(a INT PRIMARY KEY, b CHAR(4)) DATA DIRECTORY='/opt/data8.0/tmpdata';

底層生成的文件按照db名稱 之后 數據ibd文件
mysql>use db4
mysql>CREATE TABLESPACE ext_ts ADD DATAFILE '/opt/data8.0/tmpdata/ext_ts.ibd';
其他操作:
##查看表空間信息
SELECT a.NAME AS space_name, b.NAME AS table_name FROM INFORMATION_SCHEMA.INNODB_TABLESPACES a, INFORMATION_SCHEMA.INNODB_TABLES b WHERE a.SPACE=b.SPACE and a.SPACE_TYPE='General' ;
##從獨立表空間或系統表空間移動到 普通表空間,
ALTER TABLE tbl_name TABLESPACE [=] tablespace_name;
##從普通表空間或移動到系統表空間
ALTER TABLE tbl_name TABLESPACE [=] innodb_system;
##從系統表空間 或 普通表空間移動到 獨立表空間。
ALTER TABLE tbl_name TABLESPACE [=] innodb_file_per_table;
##普通表空間重命令
ALTER TABLESPACE s1 RENAME TO s2;
##刪除普通表空間,但必須把里邊的表移走。
DROP TABLESPACE ts1;
限制內容:
4.
使用會話臨時表空間和全局臨時表空間。
臨時表空間
當被配置為磁盤內部臨時表的存儲引擎時,會話臨時表空間存儲了用戶創建的臨時表和優化器創建的內部臨時表。(從MySQL 8.0.16開始mysql 數據庫表不存在,臨時表的存儲引擎是并且 指定。)
##配置方式
[mysqld]
innodb_temp_data_file_path=ibtmp1:12M:autoextend:max:10G
innodb_temp_tablespaces_dir=/opt/data8.0/temp
##查看大小
mysql> SELECT @@innodb_temp_data_file_path;
+------------------------------+
| @@innodb_temp_data_file_path |
+------------------------------+
| ibtmp1:12M:autoextend |
+------------------------------+
##查看臨時表空間
mysql> SELECT FILE_NAME, TABLESPACE_NAME, ENGINE, INITIAL_SIZE, TOTAL_EXTENTS*EXTENT_SIZE
AS TotalSizeBytes, DATA_FREE, MAXIMUM_SIZE
FROM INFORMATION_SCHEMA.FILES
WHERE TABLESPACE_NAME = 'innodb_temporary'\G
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_SESSION_TEMP_TABLESPACES;
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO;
5.Undo
Undo表空間包含Undo日志,它是Undo日志記錄的集合,其中包含關于如何撤銷事務對聚集索引記錄的信息。Undo日志段包含在回滾段中。ents變量定義了分配給每個undo表空間的回滾段的數量。
mysql> SHOW VARIABLES LIKE '%undo%';
+--------------------------+--------------------+
| Variable_name | Value |
+--------------------------+--------------------+
| innodb_max_undo_log_size | 1073741824 |
| innodb_undo_directory | /opt/data8.0/mysql |
| innodb_undo_log_encrypt | OFF |
| innodb_undo_log_truncate | ON |
| innodb_undo_tablespaces | 2 |
+--------------------------+--------------------+
備注:cate自動截斷undo表空間需要至少兩個活動的undo表空間,超過size變量定義的大小限制的undo表空間將會被截斷。
臨時表空間操作:
##創建表空間
mysql> CREATE UNDO TABLESPACE tablespace_name ADD DATAFILE 'file_name.ibu';
##查看表空間
mysql> SELECT TABLESPACE_NAME, FILE_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE LIKE 'UNDO LOG';
##刪除表空間
#撤銷表空間在被刪除之前必須為空。要清空undo表空間,必須首先將undo表空間標記為#inactive,
#這樣該表空間就不再用于為新事務分配回滾段。
mysql> ALTER UNDO TABLESPACE tablespace_name SET INACTIVE; #SET INACTIVE
mysql> DROP UNDO TABLESPACE tablespace_name;

##undo truncate查看
mysql> SELECT NAME, SUBSYSTEM, COMMENT FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE '%truncate%';
##undo運行情況
mysql> SHOW STATUS LIKE 'Innodb_undo_tablespaces%';
Undo表空間文件的性能影響
當undo表空間被截斷時,undo表空間中的回滾段將被去激活。其他undo表空間中的活動回滾段負責整個系統的負載,這可能會導致性能略有下降。性能下降的程度取決于以下幾個因素:
在MySQL 8.0.21之前,在undo表空間截斷操作期間會執行兩個刷新操作。
第一個刷新操作從緩沖池中刪除舊的undo表空間頁。
第二個刷新操作將新的撤銷表空間的初始頁寫入磁盤。
在一個繁忙的系統上,如果需要刪除大量頁面,第一次刷新操作可能會暫時影響系統性能。
從MySQL 8.0.21開始,這兩個刷新操作都被刪除。
最近最少使用時被動釋放,完整檢查點釋放。
在截斷操作期間,新的undo頁的初始頁將被重做記錄,而不是刷新到磁盤。
如日常運維中看見unc.log(該日志在e_dir下)文件,在截斷操作期間發生系統故障,臨時日志文件允許啟動進程識別被截斷的undo表空間,并繼續執行該操作。
6. 總結
1.從目前表空間的設計來看 引擎的表空間有 fiel-per-table, ,,其他的表空間有自己的格式支持。
2. 讓用戶靈活控制數據,進行 存儲空間,遷移的問題。
3. 提高處理性能。但對MySQL來說盡量少用臨時表少用
3.Data 從系統表空間分離之后 系統表空間比較單一只存有 。
分離這些表空間確實提高了文件控制的靈活度,但IO的壓力是肯定上去。目前MySQL的使用場景,很多瓶頸出在io上。拆分多文件,應該跟有效的處理好MySQL和IO之間交互問題。
“時間只是一人文字表述和理解,其實動的是地球?!?/p>
關于作者
崔虎龍:云和恩墨MySQL技術顧問,長期服務于金融、游戲、物流等行業的數據中心,設計數據存儲架構,并熟悉數據中心運營管理的流程及規范,自動化運維等。擅長MySQL、Redis、數據庫高可用設計和運維故障處理、備份恢復、升級遷移、性能優化。自學通過了MySQL OCP 5.6和MySQL OCP 5.7認證。2年多開發經驗,10年數據庫運維工作經驗,其中專職做MySQL工作8年;曾經擔任過項目經理、數據庫經理、數據倉庫架構師、MySQL技術專家、DBA等職務;涉及行業:金融(銀行、理財)、物流、游戲、醫療、重工業等。
墨天輪原文鏈接:(復制到瀏覽器中打開或者點擊“擴展鏈接”立即查看)