1. 背景mysql
* 在MYSQL中創建一張數據表,在其數據目錄對應的數據庫目錄下都有對應表的.frm文件,.frm文件是用來保存每一個數據表的元數據(meta)信息,包括表結構的定義等,.frm文件跟數據庫存儲引擎無關,也就是任何存儲引擎的數據表都必須有.frm文件,命名方式爲數據表名.frm,如user.frm. .frm文件能夠用來在數據庫崩潰時恢復表結構。sql
* MySQL文件包括MySQL所建數據庫文件和MySQL所用引擎建立的數據庫文件。數據庫
* .frm 文件與操做系統和數據庫引擎無關,都有這麼個與表名同名文件。bash
* MyISAM引擎的文件:ide
* .myd 即 my data,表數據文件spa
* .myi 即my index,索引文件操作系統
* .log 日誌文件。日誌
* InnoDB引擎的文件:orm
* 採用表空間(tablespace)來管理數據,存儲表數據和索引,索引
* InnoDB數據庫文件(即InnoDB文件集,ib-file set)。
* ibdata一、ibdata2等:系統表空間文件,當未開啓innodb_file_per_table時,存儲InnoDB系統信息和用戶數據庫表數據和索引,全部表共用。
* .ibd文件:當開啓innodb_file_per_table時,單表表空間文件,每一個表使用一個表空間文件(file per table),存放用戶數據庫表數據和索引。
* 日誌文件: ib_logfile一、ib_logfile2。
* 指定的目錄必須是目錄的完整路徑名,而不是相對路徑。
2. MySQL 環境
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.7.18 MySQL Community Server (GPL) Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show variables like 'version'; +---------------+--------+ | Variable_name | Value | +---------------+--------+ | version | 5.7.18 | +---------------+--------+ 1 row in set (0.01 sec) mysql> show variables like 'datadir'; +---------------+-------------------+ | Variable_name | Value | +---------------+-------------------+ | datadir | /data/mysql_data/ | +---------------+-------------------+ 1 row in set (0.04 sec) mysql> show variables like 'innodb_file_per%'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_file_per_table | ON | +-----------------------+-------+ 1 row in set (0.02 sec)
3. MyISAM引擎指定表數據文件存放目錄例子
* 建立表數據文件存放目錄
[root@MySQL ~]# mkdir -v /test_myisam mkdir: created directory `/test_myisam'
* 查看mysqld 運行用戶
[root@MySQL ~]# ps aux | grep mysqld | grep -v grep root 1468 0.0 0.0 110400 1532 ? S 16:00 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql_data --pid-file=/data/mysql_data/MySQL.pid mysql 1614 0.2 4.9 1309380 194788 ? Sl 16:00 0:04 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql_data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql_data/error.log --pid-file=/data/mysql_data/MySQL.pid
* 修改目錄所屬用戶與組爲mysql運行用戶 [ 此步必須 ]
[root@MySQL ~]# chown -v mysql.mysql /test_myisam changed ownership of `/test_myisam' to mysql:mysql
* 建立表 test_myisam, 並指定數據文件與索引文件存放目錄
[ MyISAM引擎中表數據文件與索引文件分開存放,,須要分別指定 ]
CREATE TABLE test_myisam( -> id BIGINT PRIMARY KEY NOT NULL AUTO_INCREMENT, -> name VARCHAR(64) NOT NULL -> )ENGINE=MYISAM DATA DIRECTORY='/test_myisam' INDEX DIRECTORY='/test_myisam' DEFAULT CHARSET=utf8mb4;
* 查看錶數據文件與表結構文件
[ 能夠看到在MyISAM存儲引擎中,指定表數據目錄是經過軟連接方式實現 ]
mysql> select database(); +------------+ | database() | +------------+ | mytest | +------------+ 1 row in set (0.00 sec) mysql> system ls -l /data/mysql_data/mytest total 16 -rw-r----- 1 mysql mysql 67 Jul 5 16:30 db.opt -rw-r----- 1 mysql mysql 8586 Jul 5 16:37 test_myisam.frm lrwxrwxrwx 1 mysql mysql 28 Jul 5 16:37 test_myisam.MYD -> /test_myisam/test_myisam.MYD lrwxrwxrwx 1 mysql mysql 28 Jul 5 16:37 test_myisam.MYI -> /test_myisam/test_myisam.MYI mysql> system ls -l /test_myisam total 4 -rw-r----- 1 mysql mysql 0 Jul 5 16:37 test_myisam.MYD -rw-r----- 1 mysql mysql 1024 Jul 5 16:37 test_myisam.MYI
4. InnoDB引擎指定表數據文件存放目錄例子
* 建立表數據文件存放目錄
[root@MySQL ~]# mkdir -v /test_innodb mkdir: created directory `/test_innodb'
* 查看mysqld 運行用戶
[root@MySQL ~]# ps aux | grep mysqld | grep -v grep root 1468 0.0 0.0 110400 1532 ? S 16:00 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql_data --pid-file=/data/mysql_data/MySQL.pid mysql 1614 0.1 5.0 1309380 196576 ? Sl 16:00 0:04 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql_data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql_data/error.log --pid-file=/data/mysql_data/MySQL.pid
* 修改目錄所屬用戶與組爲mysql運行用戶 [ 此步必須 ]
[root@MySQL ~]# chown -v mysql.mysql /test_innodb changed ownership of `/test_innodb' to mysql:mysql
* 建立表 test_innodb, 並指定數據文件存放目錄
[ InnoDB 引擎中表數據文件與索引文件合併存放,,指定數據文件存放目錄便可 ]
mysql> CREATE TABLE test_innodb( -> id BIGINT PRIMARY KEY NOT NULL AUTO_INCREMENT, -> name VARCHAR(64) NOT NULL -> )ENGINE=INNODB DATA DIRECTORY='/test_innodb' DEFAULT CHARSET=utf8mb4; Query OK, 0 rows affected (0.06 sec)
* 查看錶數據文件
[ 能夠看到在InnoDB中會生成<table_name>.isl文件,此文件記錄表數據文件存放絕對路徑 ]
mysql> system ls -l /test_innodb total 4 drwxr-x--- 2 mysql mysql 4096 Jul 5 16:47 mytest mysql> system ls -l /test_innodb/mytest total 96 -rw-r----- 1 mysql mysql 98304 Jul 5 16:47 test_innodb.ibd mysql> select database(); +------------+ | database() | +------------+ | mytest | +------------+ 1 row in set (0.00 sec) mysql> system ls -l /data/mysql_data/mytest total 20 -rw-r----- 1 mysql mysql 67 Jul 5 16:30 db.opt -rw-r----- 1 mysql mysql 8586 Jul 5 16:47 test_innodb.frm -rw-r----- 1 mysql mysql 35 Jul 5 16:47 test_innodb.isl mysql> system cat /data/mysql_data/mytest/test_innodb.isl /test_innodb/mytest/test_innodb.ibd
5. 總結
以需求驅動技術,技術自己沒有優略之分,只有業務之分。