MYSQL 将数据存入不同的磁盘

本文介绍了如何在InnoDB和MyISAM引擎中管理数据文件位置,包括InnoDB的`innodb_file_per_table`配置,MyISAM使用符号链接和`datadir`指定文件位置的方法,以及注意事项。
摘要由CSDN通过智能技术生成

为了提高IO性能,可以将不同的文件放在不同的磁盘。这里只说明InnoDB,MyISAM的修改方式。

1.环境

OS: CentOS 6.5 x64

MYSQL: 5.6 for Linux (x86_64)

2.InnoDB

InnoDB指定数据文件的位置

mysql> SHOW VARIABLES LIKE 'innodb_file_per_table';    #先检查一下配置变量
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)

如果innodb_file_per_table值为OFF,可以动态修改:

set global innodb_file_per_table=1;

CREATE TABLE temp3
(empno smallint(4) not null,
 ename varchar(10),
 job varchar(9),
 mgr smallint(4),
 hiredate date,
 sal float(7, 2),
 comm float(7, 2),
 deptno tinyint(2)
) engine=innodb charset=utf8 data directory='/u01/mysql/temp/';

[root@test1 temp]# pwd
/u01/mysql/temp
[root@test1 temp]# ls
temp2.MYD  temp2.MYI  temp.MYD  temp.MYI  test     #由于表在test库下,所以在指定的目录里产生了个test目录
[root@test1 temp]# cd test
[root@test1 test]# pwd
/u01/mysql/temp/test
[root@test1 test]# ll
total 96
-rw-rw---- 1 mysql mysql 98304 Jun 29 18:27 temp3.ibd     #数据文件在这

InnoDB的数据文件不能像MyISAM一样使用标签链接方式指定数据文件。

3.MyISAM

mysql> SHOW VARIABLES LIKE 'have_symlink';     #先检查一下配置变量
+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_symlink  | DISABLED |
+---------------+----------+
1 row in set (0.00 sec)

DISABLED 不可用,修改have_symlink变量,需要重启服务。

[root@test1 temp]# vi /etc/my.cnf

[mysqld]
basedir=/u01/mysql
datadir=/u01/mysql/data
socket=/u01/mysql/log/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=1     #需要配置成1
log-bin=mysql-bin
server-id=1

。。。

[root@test1 test]# /etc/init.d/mysql restart
Shutting down MySQL....                                    [  OK  ]
Starting MySQL...                                          [  OK  ]

mysql> SHOW VARIABLES LIKE 'have_symlink';     #再次检查,现在ok
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_symlink  | YES   |
+---------------+-------+
1 row in set (0.00 sec)

如果是新表,可以在创建的时候指定目录:

 
  1. CREATE TABLE temp

  2. (empno smallint(4) not null,

  3. ename varchar(10),

  4. job varchar(9),

  5. mgr smallint(4),

  6. hiredate date,

  7. sal float(7, 2),

  8. comm float(7, 2),

  9. deptno tinyint(2)

  10. ) engine=myisam data directory='/u01/mysql/temp' index directory='/u01/mysql/temp';</span>

这时在数据目录里看数据文件:

[root@test1 test]# pwd
/u01/mysql/data/test
[root@test1 test]# ll -rth
。。。
-rw-rw---- 1 mysql mysql 8.6K Jun 29 06:56 temp.frm
lrwxrwxrwx 1 mysql mysql   24 Jun 29 06:56 temp.MYI -> /u01/mysql/temp/temp.MYI
lrwxrwxrwx 1 mysql mysql   24 Jun 29 06:56 temp.MYD -> /u01/mysql/temp/temp.MYD
这里用/u01/mysql/temp/目录只是用了演示,生产环境应该将这两个文件放到别的磁盘上。

如果表已经存在,需要先停掉mysql,再ln:

[root@test1 test]# pwd
/u01/mysql/data/test
[root@test1 test]# ll temp2*     #已经存在temp2表
-rw-rw---- 1 mysql mysql 8780 Jun 29 09:10 temp2.frm
-rw-rw---- 1 mysql mysql  548 Jun 29 09:10 temp2.MYD
-rw-rw---- 1 mysql mysql 1024 Jun 29 09:10 temp2.MYI

[root@test1 test]# /etc/init.d/mysql stop     #停掉mysql
Shutting down MySQL...                                     [  OK  ]

[root@test1 test]# mv temp2.MYD ../../temp/     #移到别的目录

[root@test1 test]# mv temp2.MYI ../../temp/     #移到别的目录

[root@test1 test]# ln -s /u01/mysql/temp/temp2.MYD /u01/mysql/data/test/temp2.MYD

[root@test1 test]# ln -s /u01/mysql/temp/temp2.MYI /u01/mysql/data/test/temp2.MYI

[root@test1 test]# ll temp2*
-rw-rw---- 1 mysql mysql 8780 Jun 29 09:10 temp2.frm
lrwxrwxrwx 1 root  root    25 Jun 29 09:18 temp2.MYD -> /u01/mysql/temp/temp2.MYD
lrwxrwxrwx 1 root  root    25 Jun 29 09:19 temp2.MYI -> /u01/mysql/temp/temp2.MYI

[root@test1 test]# /etc/init.d/mysql start
Starting MySQL.                                            [  OK  ]

mysql> select * from temp2;
+-------+--------------+-----------+------+------------+---------+---------+--------+
| empno | ename        | job       | mgr  | hiredate   | sal     | comm    | deptno |
+-------+--------------+-----------+------+------------+---------+---------+--------+
|  7369 | 员工SMITH    | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
|  7499 | 员工ALLEN    | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
|  7521 | 员工WARD     | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7566 | 员工JONES    | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
|  7654 | 员工MARTIN   | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7698 | 员工BLAKE    | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
|  7782 | 员工CLARK    | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
|  7788 | 员工SCOTT    | ANALYST   | 7566 | 1982-10-09 | 3000.00 |    NULL |     20 |
|  7839 | 员工KING     | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
|  7844 | 员工TURNER   | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
|  7876 | 员工ADAMS    | CLERK     | 7788 | 1983-01-12 | 1100.00 |    NULL |     20 |
|  7900 | 员工JAMES    | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
|  7902 | 员工FORD     | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
|  7934 | 员工MILLER   | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
+-------+--------------+-----------+------+------------+---------+---------+--------+
14 rows in set (0.00 sec)

数据正常。

不管是InnoDB还是MyISAM,都不能使用alter table 修改数据文件所以位置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值