MySQL社区

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 8190|回复: 12
打印 上一主题 下一主题

关于innodb的partitioning的问题

[复制链接]
跳转到指定楼层
1#
发表于 2007-10-23 09:26:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
innodb的表空间设置如下:
innodb_data_file_path = /disk1/ibdata1:2000M;/disk2/ibdata2:2000M;/disk3/ibdata3:1000M:autoextend

有一个分区表A,结构如下
create table A(ID int,name char(8)) engine=innodb
PARTITION BY HASH(`ID`)(
    PARTITION p0
           DATA DIRECTORY = '/disk1/ibdata1',
    PARTITION p1
           DATA DIRECTORY = '/disk2/ibdata2'
);

另外有若干表B,C都是非分区表。

我的问题是:
1. 当在A中插入2万行数据后,如何知道数据文件ibdata1和ibdata2都使用了多少空间?
2. 表B,C的数据是放在数据文件ibdata3上了吗?
3. 当数据文件ibdata1满了以后,应该如何增加空间?

期待回复,谢谢大家!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享淘帖 顶 踩
2#
 楼主| 发表于 2007-10-23 14:01:01 | 只看该作者
谢谢mywander,我查一下
3#
 楼主| 发表于 2007-10-23 14:25:43 | 只看该作者
请问mywander,你指的系统表是information_schema中的PARTITIONS表吗?这个表中确实给出了每个分区的记录数,数据长度等信息,但是TABLESPACE_NAME这列一直是空的,怎样才能知道某个分区是在使用哪个数据文件呢?
4#
 楼主| 发表于 2007-10-23 16:53:12 | 只看该作者
又查询了一下Mysql手册12.1.10:有如下介绍
DATA DIRECTORY and INDEX DIRECTORY behave in the same way as in the CREATE TABLE statement's table_option clause as used for MyISAM tables.

如果我没有理解错的话,这个参数只能用于MyISAM而不能用于Innodb。
所以我个人的理解是Innodb分区的存放无法手工指定,各个分区是被自动分配在各个数据文件中的。

如果不对,希望大家指教!

看了一天的Mysql手册,头晕,先下了。
5#
发表于 2007-10-23 18:16:51 | 只看该作者
原帖由 edwin_chen 于 2007-10-23 16:53 发表
又查询了一下Mysql手册12.1.10:有如下介绍
DATA DIRECTORY and INDEX DIRECTORY behave in the same way as in the CREATE TABLE statement's table_option clause as used for MyISAM tables.

如果我没有 ...



先澄清一下,感觉不应该是这样(手册18.1.中有这样一句):
对于创建了分区的表,可以使用你的MySQL 服务器所支持的任何存储引擎;MySQL 分区引擎在一个单独的层中运行,并且可以和任何这样的层进行相互作用。在MySQL 5.1版中,同一个分区表的所有分区必须使用同一个存储引擎;例如,不能对一个分区使用MyISAM,而对另一个使用InnoDB。但是,这并不妨碍在同一个 MySQL 服务器中,甚至在同一个数据库中,对于不同的分区表使用不同的存储引擎。
6#
发表于 2007-10-23 18:28:15 | 只看该作者
原帖由 edwin_chen 于 2007-10-23 09:26 发表
innodb的表空间设置如下:
innodb_data_file_path = /disk1/ibdata1:2000M;/disk2/ibdata2:2000M;/disk3/ibdata3:1000M:autoextend

有一个分区表A,结构如下
create table A(ID int,name char(8)) engine ...
1. 当在A中插入2万行数据后,如何知道数据文件ibdata1和ibdata2都使用了多少空间?
2. 表B,C的数据是放在数据文件ibdata3上了吗?
3. 当数据文件ibdata1满了以后,应该如何增加空间?




然后来回答问题:
1、要想知道数据都分布在数据文件的那里,和分布的如何,比较难,要分不同的存储引擎具体分析。
2、当ibdata1不满的情况下,表B,C应该是在ibdata1中,而不在ibdata3中。
3、当ibdata1满了以后,是按照顺序写入ibdata2中,增加的空间大小由参数innodb_autoextend_increment来控制。
7#
 楼主| 发表于 2007-10-24 14:02:12 | 只看该作者
原帖由 kider 于 2007-10-23 18:16 发表

先澄清一下,感觉不应该是这样(手册18.1.中有这样一句):
对于创建了分区的表,可以使用你的MySQL 服务器所支持的任何存储引擎;MySQL 分区引擎在一个单独的层中运行,并且可以和任何这样的层进行相互 ...


非常感谢kider的回复,不过我认为18.1中的这句话只是说明mysql分区对于大多数数据引擎都是支持的,但没有说明对于象innodb这样支持表空间概念的数据引擎是否能够在分区的时候明确的指明数据文件的问题。(也就是是否支持DATA DIRECTORY 这个参数的问题)

另外我认为你的说明中似乎有个错误“当ibdata1满了以后,是按照顺序写入ibdata2中,增加的空间大小由参数innodb_autoextend_increment来控制。”,
你可以看到我声明的innodb的表空间设置如下:
innodb_data_file_path = /disk1/ibdata1:2000M;/disk2/ibdata2:2000M;/disk3/ibdata3:1000M:autoextend
如果没有分区的话,当ibdata1满了以后,是按照顺序写入ibdata2中,但是ibdata2我已经明确的指明了大小,因此不受参数innodb_autoextend_increment的影响,它只是会在ibdata3满了以后,ibdata3自动增长的时候起作用。不知我的理解对否?

而我在3这个问题上的关注点是:如果分区p0是在ibdata1上,p1在ibdata2上的话,如果ibdata1满了,要怎么办?
呵呵,说的有点混乱了,按照我现在的认识,innodb似乎是自动管理表空间分配的,问题3的前提似乎不能成立啊,头晕了。。。

无论如何再此感谢kider,简化我的问题是如下:

我的目的是希望一个innodb的表的2个分区,分别在2个不同的磁盘上。如何能够做到这点呢?

谢谢!!!

[ 本帖最后由 edwin_chen 于 2007-10-24 14:07 编辑 ]
8#
发表于 2007-10-31 12:14:40 | 只看该作者
innodb_autoextend_increment的影响,它只是会在ibdata3满了以后,ibdata3自动增长的时候起作用,你的理解是正确的。

-->我的目的是希望一个innodb的表的2个分区,分别在2个不同的磁盘上。如何能够做到这点呢?
好问题,需要Partition Table来解决了,我深入研究一下再来探讨或那位高人给点指点^_^...
9#
 楼主| 发表于 2009-10-20 18:58:59 | 只看该作者
本帖最后由 edwin_chen 于 2009-10-20 19:00 编辑

回来看旧帖,补充一下自己的认识
问题:“我的目的是希望一个innodb的表的2个分区,分别在2个不同的磁盘上”

Innodb可以在独立表空间方式下达到目的,方法如下:
1.。在my.cnf中加入innodb_file_per_table并重启Mysql
2.  创建分区表例如

  1. CREATE TABLE users (
  2.     uid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  3.     name VARCHAR(30) NOT NULL DEFAULT '',
  4.     email VARCHAR(30) NOT NULL DEFAULT ''
  5. )
  6. ENGINE=INNODB
  7. PARTITION BY RANGE (uid) (
  8.     PARTITION p0 VALUES LESS THAN (100)
  9.     DATA DIRECTORY = '/sda3/mysql'
  10.     INDEX DIRECTORY = '/sda3/mysql',

  11.     PARTITION p1 VALUES LESS THAN (200)
  12.     DATA DIRECTORY = '/sda3/mysql'
  13.     INDEX DIRECTORY = '/sda3/mysql',

  14.     PARTITION p2 VALUES LESS THAN (300)
  15.     DATA DIRECTORY = '/sdb3/mysql'
  16.     INDEX DIRECTORY = '/sdb3/mysql',

  17.     PARTITION p3 VALUES LESS THAN MAXVALUE    DATA DIRECTORY = '/data6/data'
  18.     INDEX DIRECTORY = '/sdb3/mysql'
  19. );
复制代码
3.停止Mysql。这时在data目录下会有多个ibd文件(每个分区一个),将ibd文件move到不同的磁盘中,使用ln命令在原来的data目录下建上link。重启Mysql

这样就可以负载磁盘I/O到不同的磁盘了。
另外需要说明的是Innodb并不支持DATA DIRECTORY and INDEX DIRECTORY参数。
指定这2个参数不会报错,但是不起作用。关于这个问题可以参考
http://forums.mysql.com/read.php?106,155255,155255#msg-155255
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|申请友链|小黑屋|Archiver|手机版|MySQL社区 ( 京ICP备07012489号   
联系人:周生; 联系电话:13911732319

GMT+8, 2024-4-29 22:47 , Processed in 0.086815 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表