Location for InnoDB tablespace in MySQL 5.6.6_MySQL

php中文网
发布: 2016-06-01 13:12:55
原创
1086人浏览过

there is one new feature in mysql 5.6 that didn’t get the attention it deserved (at least from me;-)) : “data directory” for innodb tables.

This is implemented sinceMySQL 5.6.6and can be used only at the creation of the table. It’s not possible to change the DATA DIRECTORY with an ALTER for a normal table(but it’s in some case with partitioned ones as you will see below). If you do so, the option will be justignored:

mysql> CREATE TABLE `sales_figures` (-> `region_id` int(11) DEFAULT NULL,-> `sales_date` date DEFAULT NULL,-> `amount` int(11) DEFAULT NULL-> ) ENGINE=InnoDB DEFAULT CHARSET=latin1-> DATA DIRECTORY = '/tb1/';Query OK, 0 rows affected (0.11 sec)mysql> alter table sales_figures engine=innodb data directory='/tb2/';Query OK, 0 rows affected, 1 warning (0.21 sec)Records: 0Duplicates: 0Warnings: 1mysql> show warnings;+---------+------+---------------------------------+| Level | Code | Message |+---------+------+---------------------------------+| Warning | 1618 |option ignored |+---------+------+---------------------------------+
登录后复制

mysql>CREATETABLE`sales_figures`(

    ->  `region_id`int(11)DEFAULTNULL,

    ->  `sales_date`dateDEFAULTNULL,

    ->  `amount`int(11)DEFAULTNULL

    ->)ENGINE=InnoDBDEFAULTCHARSET=latin1

    ->DATADIRECTORY='/tb1/';

QueryOK,0rowsaffected(0.11sec)

mysql>altertablesales_figuresengine=innodbdatadirectory='/tb2/';

QueryOK,0rowsaffected,1warning(0.21sec)

Records:0  Duplicates:0  Warnings:1

mysql>showwarnings;

+---------+------+---------------------------------+

|Level  |Code|Message                        |

+---------+------+---------------------------------+

|Warning|1618|  optionignored|

+---------+------+---------------------------------+

You can read more information in the MySQL Manual:Specifying the Location of a Tablespace.

So it’s now possible if for example you use SSD or FusionIO disks to have the large log or archived table to cheaper disks as you won’t require fast random access for those table and then save some expensive diskspace.

The syntax is very simple:

mysql> CREATE TABLE `sales_figures` (`region_id` int(11) DEFAULT NULL,`sales_date` date DEFAULT NULL,`amount` int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1 DATA DIRECTORY='/tmp/tb1/'mysql> select @@datadir;+-----------------+| @@datadir |+-----------------+| /var/lib/mysql/ |+-----------------+
登录后复制

mysql>CREATETABLE`sales_figures`(

  `region_id`int(11)DEFAULTNULL,

  `sales_date`dateDEFAULTNULL,

  `amount`int(11)DEFAULTNULL

)ENGINE=InnoDBDEFAULTCHARSET=latin1DATADIRECTORY='/tmp/tb1/'

mysql>select@@datadir;

+-----------------+

|@@datadir      |

腾讯云AI代码助手
腾讯云AI代码助手

基于混元代码大模型的AI辅助编码工具

腾讯云AI代码助手 205
查看详情 腾讯云AI代码助手

+-----------------+

|/var/lib/mysql/|

+-----------------+

And in fact if we check on the filesystem:
<br> # ls -lh /var/lib/mysql/fred/<br> total 20K<br> -rw-r--r-- 1 mysql mysql 65 May 23 22:30 db.opt<br> -rw-r--r-- 1 mysql mysql 8.5K May 23 22:30 sales_figures.frm<br> -rw-r--r-- 1 mysql mysql 31 May 23 22:30 sales_figures.isl<br>
Not the new file.isl(referred as a link to the RemoteDatafile in the source code)that contains the location of the tablespace:
<br> [root@imac2 tmp]# cat /var/lib/mysql/fred/sales_figures.isl<br> /tmp/tb1/fred/sales_figures.ibd<br>
And indeed the tablespace is there:
<br> [root@imac2 tmp]# ls -lh /tmp/tb1/fred/<br> total 96K<br> -rw-r--r-- 1 mysql mysql 96K May 23 22:30 sales_figures.ibd<br>

This is really great ! And something even nicer, it finally works withpartitioning too(before that was only possible for MyISAM tables):

mysql> CREATE TABLE sales_figures (region_id INT, sales_date DATE, amount INT)PARTITION BY LIST (region_id) ( PARTITION US_DATA VALUES IN(100,200,300) DATA DIRECTORY = '/tmp/tb1', PARTITION EU_DATA VALUES IN(400,500) DATA DIRECTORY = '/tmp/tb2/');
登录后复制

mysql>CREATETABLEsales_figures(region_idINT,sales_dateDATE,amountINT)

PARTITIONBYLIST(region_id)(    

  PARTITIONUS_DATAVALUESIN(100,200,300)DATADIRECTORY='/tmp/tb1',    

  PARTITIONEU_DATAVALUESIN(400,500)DATADIRECTORY='/tmp/tb2/'

);
<br> [root@imac2 mysql]# ls -l /tmp/tb1/fred/sales_figures#P#US_DATA.ibd<br> -rw-rw---- 1 mysql mysql 98304 May 23 16:19 /tmp/tb1/fred/sales_figures#P#US_DATA.ibd

[root@imac2 mysql]# ls -l /tmp/tb2/fred/sales_figures#P#EU_DATA.ibd
-rw-rw—- 1 mysql mysql 98304 May 23 16:19 /tmp/tb2/fred/sales_figures#P#EU_DATA.ibd

So now you can have some partitions on fast disks and some on slower disks. This is great for historical partitioning.

For example you have a tableorderspartitioned by years as follow:

create table orders (id int, purchased DATE)partition by range (YEAR(purchased)) ( partition pre2012 values less than (2012) DATA DIRECTORY '/hdd/', partition pre2013 values less than (2013) DATA DIRECTORY '/hdd/', partition pre2014 values less than (2014) DATA DIRECTORY '/hdd/', partition current values less than MAXVALUE DATA DIRECTORY '/ssd/');
登录后复制

createtableorders(idint,purchasedDATE)

  partitionbyrange(YEAR(purchased))(

    partitionpre2012valueslessthan(2012)DATADIRECTORY'/hdd/',

    partitionpre2013valueslessthan(2013)DATADIRECTORY'/hdd/',

    partitionpre2014valueslessthan(2014)DATADIRECTORY'/hdd/',

    partitioncurrentvalueslessthanMAXVALUEDATADIRECTORY'/ssd/'

  );

Only the partition handling the orders for the current year is on SSD.
At the end of the year, you can recreate a new partition and move all the data for 2014 on slower disks:

mysql> ALTER TABLE orders REORGANIZE PARTITION `current` INTO ( partition pre2015 values less than (2015) DATA DIRECTORY '/hdd/', partition current values less than MAXVALUE DATA DIRECTORY '/ssd');
登录后复制

mysql>ALTERTABLEordersREORGANIZEPARTITION`current`INTO(

      partitionpre2015valueslessthan(2015)DATADIRECTORY'/hdd/',

      partitioncurrentvalueslessthanMAXVALUEDATADIRECTORY'/ssd');

Notice that XtraBackup is also aware of these tablespaces on different locations and is able to deal with them.

There is currently only one issue is that with –copy-back, you need to have the full path created for the tablespaces not in the MySQL data directory.

So in the example above I had to create /tmp/tb1/fred and /tmp/tb2/fred before being able to runinnobackupex –copy-back
(seebug 1322658).

I hope now that this important feature got some more visibility as it deserves it.

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号