mysql數據庫文件簡介和應用

存放目錄:

用 whereis my.cnf 查看mysql配置文件的目錄,查看my.cnf的datadir參數可找到mysql數據庫文件的存放目錄。

本機存放的目錄爲/var/lib/mysql,進入該目錄可以看到以數據庫名命名的文件夾。文件夾裏便存放着該數據庫的所有數據庫文件。

 

數據庫文件簡介:

數據庫文件分爲 : mysql所建的數據庫文件、mysql所用引擎創建的數據庫文件。

.frm 保存與之同名的表的原數據信息,包含表結構定義等。與引擎無關。該文件可用來恢復或修改表結構。

MyISAM引擎的文件:

*.myd (表數據文件)  

*.myi (索引文件)

InnoDB引擎的文件:

ibdata1、ibdata2等:系統表空間文件,存儲InnoDB系統信息和用戶數據庫表數據和索引,所有表共用。

*.ibd文件:單表表空間文件,每個表使用一個表空間文件(file per table),存放用戶數據庫表數據和索引。

b_logfile1、ib_logfile2 :日誌文件,日誌文件大小在my.cnf文件中配置:innodb_log_file_size  = 256M  innodb_log_files_in_group = 2

 

Innodb存儲引擎可以使用共享表空間獨立表空間

1.獨立表空間: 爲每個表建立一個.ibd文件用來存儲數據,這樣,mysql就將innodb表的數據存入各自對應的.ibd文件中,但結構等信息還是會寫入ibdata。

        將innodb_file_per_table加到配置文件中,便可使用獨立表空間。

2.共享表空間: 將innodb_file_per_table關閉之後,建立innoDB表時只生成.frm文件,數據和索引都保存在共享表空間ibdata1中。這樣的缺點是拷貝時必須拷貝整個大文件,

                      而且刪除表後容易產生碎片。

                      ibdata1的大小在my.cnf文件中配置:innodb_data_file_path = ibdata1:10G:autoextend:max:500M

 

應用:

一、恢復物理備份:

1.MyISAM引擎的表可以簡單的複製每個表的.frm,.MYI,.MYD文件到新數據庫對應的文件夾中即可。

2.Innodb引擎的表,一直沒有通過拷貝數據庫文件而成功恢復過。有待日後再補充。

二、通過修改.frm來加快alter table操作的速度:

altertable操作速度慢,以表test爲例:

mysql> show create table test;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                      |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------+
| test  | CREATE TABLE `test` (
  `id` int(11) DEFAULT NULL,
  `name` char(1) DEFAULT '',
  `name1` char(1) DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from test;
+------+------
| id   | name |
+------+------
|    1 |      |  
|    3 |      |   
|    4 |      |    
+------+------
3 rows in set (0.00 sec)  

通過show profile來分析alter執行速度。

mysql> alter table test add column name1 char default "";
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql> show profile for query 8;
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000082 |
| checking permissions | 0.000010 |
| checking permissions | 0.000012 |
| init                 | 0.000054 |
| Opening tables       | 0.000023 |
| System lock          | 0.000011 |
| Table lock           | 0.000014 |
| setup                | 0.000033 |
| creating table       | 0.002701 |
| After create         | 0.000120 |
| copy to tmp table    | 0.000589 |
| rename result table  | 0.002465 |
| end                  | 0.000067 |
| query end            | 0.000012 |
| freeing items        | 0.000044 |
| cleaning up          | 0.000011 |
+----------------------+----------+
16 rows in set (0.00 sec)

從日誌可看出,這個alter實現的方法是:用新的結構創建一個空表,從舊錶中查出所有數據插入新表,然後刪除舊錶。

不過不是所有的alter操作都會引起表重建。比如alter column。 (alter table 允許使用alter column, modify column, change column語句修改列,這三種操作都是不一樣的,這個日後再詳細說)

alter column語句直接修改.frm文件而不涉及表數據,所以會快很多。

 

移除一個列的auto_increment屬性;增加、移除或更改ENum和set常量,是可以不用重建表的,這些就可以通過修改.frm文件直接來改變表結構。

方法如下:

1.創建一張相同結構的空表,並進行所需要的修改。

2.flush tables with read lock 來關閉所有正在使用的表,並禁止任何表被打開。

3.交換.frm文件

4.執行 unlock tables來釋放步驟2的讀鎖。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章