Mysql的数据库名和表名是与文件系统的目录名和文件名对应的,默认情况下,创建的数据库和表都存放在参数datadir定义的目录下。这样如果不使用RAID或逻辑卷,所有的表都存放在一个磁盘设备上,无法发挥多磁盘并行读写的优势!在这种情况下,我们就可以利用操作系统的符号(symbolic Links)将不同数据库或表、索引指向不同的物理磁盘,从而达到分布磁盘I/O的目的。
(1)将一个数据库指向其他物理磁盘
其方法是先在目标磁盘上创建目录,然后再创建从mysql数据目录到目标目录的符号连接;
shell>mkdir /otherdisk/database/test
shell>ln -s /otherdisk/database/test /path/to/datadir
案例如下:
(一)创建文件
[root@SR3 test]# mkdir -p /disk1/database/qns
[root@SR3 test]# ln -s /mysqldata/qns/ /disk1/database/qns/
[root@SR3 test]# chown -R mysql:mysql /disk1/
(二) 创建表
mysql> use qns;
Database changed
mysql> create table qns(id int);
Query OK, 0 rows affected (0.03 sec)
mysql> show create table qns;
+-------+---------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------------------+
| qns | CREATE TABLE `qns` (
`id` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------------------------------------------+
1 row in set (0.02 sec)
(三)查看相关目录表是否生成
[root@SR3 qns]# ls
db.opt qns.frm qns.MYD qns.MYI
[root@SR3 qns]# pwd
/disk1/database/qns/qns
[root@SR3 qns]# ls -l
total 20
-rw-rw---- 1 mysql mysql 61 Dec 23 09:08 db.opt
-rw-rw---- 1 mysql mysql 8556 Dec 23 09:11 qns.frm
-rw-rw---- 1 mysql mysql 0 Dec 23 09:11 qns.MYD
-rw-rw---- 1 mysql mysql 1024 Dec 23 09:11 qns.MYI
(四)插入数据
mysql> insert into qns select * from qns;
Query OK, 1048576 rows affected (0.64 sec)
Records: 1048576 Duplicates: 0 Warnings: 0
mysql> select count(*) from qns;
+----------+
| count(*) |
+----------+
| 2097152 |
+----------+
1 row in set (0.02 sec
(五)查看存储空间的大小
[root@SR3 qns]# cd /mysqldata/qns
[root@SR3 qns]# du -sh *
4.0K db.opt
12K qns.frm
7.1M qns.MYD
4.0K qns.MYI
[root@SR3 qns]# du -sh *
4.0K db.opt
12K qns.frm
15M qns.MYD
4.0K qns.MYI
[root@SR3 qns]# cd /disk1/database/qns/qns
[root@SR3 qns]# du -sh *
4.0K db.opt
12K qns.frm
15M qns.MYD
4.0K qns.MYI
注:针对myisam的存储引擎表两边的存储空间都保持一样。
另外一个实例:
创建innodb存储引擎表
2)将MyISAM(其他存储引擎的表不支持)表的数据文件或索引文件指向其他物理磁盘
对于新建的表,可以通过在create table语句中增加data directory和index directory选项来完成,例如
mysql> create table tmp(id int primary key)
-> ENGINE = MyISAM
-> DATA DIRECTORY= '/disk2/data'
-> INDEX DIRECTORY='/disk3/data';
Query OK, 0 rows affected (0.10 sec)
查看表存储位置:
[root@SR3 data]# ls
tmp.MYD
[root@SR3 data]# cd /disk3/data/
[root@SR3 data]# ls
tmp.MYI
root@SR3 data]# cd /mysqldata/test
[root@SR3 test]# ls
ibdata1 test.frm test.MYD test.MYI tmp.frm tmp.MYD tmp.MYI
对于已有的表,可以先将其数据文件(.MYD)或索引文件(.MYI)转移到目标磁盘,然后再建立符号连接即可。需要说明的是表定义文件(.frm)必须位于Mysql数据文件目录下,不能用符号连接