1. 程式人生 > >表空間及回收

表空間及回收

mysql 創建 term chang 初始化 永久 存儲 emp hang

一、 Innodb存儲引擎表中所有數據都是存儲在表空間中的,表空間又分為系統表空間,以ibdata1來命名,在數據安裝初始化時系統會創建一個ibdata1的表空間文件,它會存儲所有數據的信息以及回滾段(undo)的信息。在MySQL5.6以後,undo表空間可以通過參數單獨設置存儲位置了,可從ibdata1中獨立出來。Innodb_data_file_path負責定義系統表空間的路徑、初始化大小、自動化擴展策略。數據庫默認的自動擴展大小是64MB。

mysql> show variables like "%auto%";


+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
| autocommit | ON |
| automatic_sp_privileges | ON |
| innodb_autoextend_increment | 64 | 數據庫默認的自動擴展大小是64MB

| innodb_autoinc_lock_mode | 2 |
| innodb_stats_auto_recalc | ON |
| sql_auto_is_null | OFF |
+-----------------------------+-------+
8 rows in set (0.01 sec)

mysql> show variables like "%innodb_data%";
+-----------------------+-------------------------+
| Variable_name | Value |


+-----------------------+-------------------------+
| innodb_data_file_path | ibdata1:100M:autoextend | 建議把初始值調為1GB
| innodb_data_home_dir | |
+-----------------------+-------------------------+
2 rows in set (0.00 sec)

除了系統表空間,還有獨立表空間,設置參數innodb_file_per_table=1.獨立表空間文件存儲對應表的B+樹數據、索引和插入緩沖等信息,其余信息還存儲在默認表空間中。

mysql> show variables like "%innodb_file_per%";
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set (0.01 sec)

二、共享表空間和獨立表空間有什麽區別?

獨立表空間的每個表有自己的表空間,且可以實現表空間的轉移,回收表空間也方便。

使用alter table table_name engine=innodb或pt-online_schema_change命令即可,但有一個不好的地方在每個表下都有.frm和.ibd兩個文件描述符,如果單表增長過快也容易出現性能問題。

共享表空間的數據和文件放在一起方便管理。共享表空間無法在線回收空間,如果想回收,必須將全部Innodb表中的數據備份,刪除原表,然後再把數據導回到與原表結構一樣的新表中。特別是統計分析、日誌系統不太適合用共享表空間。

5.7之後增加了臨時表空間和通用表空間。

5.7把臨時表的數據從系統表空間中抽離出來,形成了自己的獨立表空間參數innodb_temp_data_file_path,且把臨時表的相關檢索信息保存在系統信息表的information_schema庫下的innodb_temp_table_info表中

通用表空間,就是把多個表放在同一個空間中,可以根據活躍度來劃分表,存放在不同的磁盤上,可以減少metadata的存儲開銷。目前生產中很少使用。

mysql> show variables like "%temp%";
+----------------------------+-----------------------+
| Variable_name | Value |
+----------------------------+-----------------------+
| avoid_temporal_upgrade | OFF |
| innodb_temp_data_file_path | ibtmp1:12M:autoextend |
| show_old_temporals | OFF |
+----------------------------+-----------------------+
3 rows in set (0.02 sec)

[root@zstedu data]# ll
total 726532
drwxr-x--- 2 mysql mysql 46 Jul 20 06:51 andyhsi
drwxr-x--- 2 mysql mysql 78 Jul 19 18:24 andyxi
-rw-r----- 1 mysql mysql 56 Jul 17 08:19 auto.cnf
drwxr-x--- 2 mysql mysql 332 Jul 17 13:12 employees
-rw-r----- 1 mysql mysql 1236 Jul 20 05:36 ib_buffer_pool
-rw-r----- 1 mysql mysql 104857600 Jul 20 06:51 ibdata1
-rw-r----- 1 mysql mysql 104857600 Jul 20 06:51 ib_logfile0
-rw-r----- 1 mysql mysql 104857600 Jul 17 13:14 ib_logfile1
-rw-r----- 1 mysql mysql 104857600 Jul 20 05:28 ib_logfile2
-rw-r----- 1 mysql mysql 12582912 Jul 20 05:36 ibtmp1 //臨時表空間

四、表空間回收

參考: https://blog.csdn.net/php521php/article/details/45112465

解決辦法:
方法1:

執行 OPTIMIZE TABLE 表名;

mysql>use mysql;

mysql>optimize table test.t1;

註意:
1.OPTIMIZE TABLE只對MyISAM, BDB和InnoDB表起作用;
2.OPTIMIZE TABLE會產生鎖,推薦在業務低峰時執行;
3.對於DDL頻繁的表,定期執行OPTIMIZE TABLE
方法2:
寫一SQL,創建新表,刪除舊表,新表重命名;
mysql>old_tables create new_table;
mysql>truncate table old_tables;

mysql>rename new_tables to old_tables.

方法3:執行ALTER TABLE t1 ENGINE = InnoDB;

原理就是:重建表!!!技術分享圖片

參考鏈接:http://dev.mysql.com/doc/refman/5.5/en/alter-table.html

關鍵描述:

技術分享圖片

情況2:刪除對應的表和數據,但是ibdata空間並未釋放
形成原因:
臨時解決辦法:
1.使用mysqldump備份數據庫,關閉mysql,
2.手動刪除ibdata,ib_logfile文件
3.恢復數據庫

永久解決辦法:

參考鏈接:http://blog.csdn.net/jacson_bai/article/details/45919403

1.使用獨立表空間
2.限制ibdata單個文件的大小

表空間及回收