存放目錄:
用 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的讀鎖。