看看我的数据库文件的存放位置
[root@pacteralinux ~]# cd /mnt/resource/mysqldate/ [root@pacteralinux mysqldate]# ll -h total 173M -rw-rw----. 1 mysql mysql 56 Nov 25 17:17 auto.cnf -rw-rw----. 1 mysql mysql 76M Dec 24 17:02 ibdata1 -rw-rw----. 1 mysql mysql 48M Dec 24 17:02 ib_logfile0 -rw-rw----. 1 mysql mysql 48M Nov 26 13:39 ib_logfile1 drwx------. 2 mysql mysql 4.0K Nov 26 13:41 mysql drwx------. 2 mysql mysql 20K Nov 26 17:00 mysqldb srwxrwxrwx. 1 mysql mysql 0 Dec 24 17:02 mysql.sock -rw-rw----. 1 mysql root 499K Dec 25 14:42 pacteralinux.err -rw-rw----. 1 mysql mysql 6 Dec 24 17:02 pacteralinux.pid drwx------. 2 mysql mysql 4.0K Nov 26 13:41 performance_schema drwx------. 2 mysql mysql 4.0K Nov 26 13:41 test drwx------. 2 mysql mysql 4.0K Dec 9 16:49 weixindemo [root@pacteralinux mysqldate]#
其中这三个文件我一直很迷惑
-rw-rw----. 1 mysql mysql 76M Dec 24 17:02 ibdata1 -rw-rw----. 1 mysql mysql 48M Dec 24 17:02 ib_logfile0 -rw-rw----. 1 mysql mysql 48M Nov 26 13:39 ib_logfile1
再看这些文件(部分)
[root@pacteralinux mysqldb]# ll -h total 3.6G -rw-rw----. 1 mysql mysql 11K Nov 26 16:47 chen_fundnetvalue_bak.frm -rw-rw----. 1 mysql mysql 62K Nov 26 16:47 chen_fundnetvalue_bak.MYD -rw-rw----. 1 mysql mysql 4.0K Nov 26 16:47 chen_fundnetvalue_bak.MYI -rw-rw----. 1 mysql mysql 11K Nov 26 16:47 chen_fundnetvalue.frm -rw-rw----. 1 mysql mysql 834K Nov 26 16:47 chen_fundnetvalue.MYD -rw-rw----. 1 mysql mysql 18K Nov 26 16:47 chen_fundnetvalue.MYI -rw-rw----. 1 mysql mysql 8.4K Nov 26 16:47 codelist_bak.frm -rw-rw----. 1 mysql mysql 162 Nov 26 16:47 codelist_bak.MYD -rw-rw----. 1 mysql mysql 1.0K Nov 26 16:47 codelist_bak.MYI -rw-rw----. 1 mysql mysql 8.4K Nov 26 16:47 codelist.frm -rw-rw----. 1 mysql mysql 162 Nov 26 16:47 codelist.MYD -rw-rw----. 1 mysql mysql 1.0K Nov 26 16:47 codelist.MYI
. 前面是表名,每个表由frm MYD MYI三个后缀名组成,所有表都是!
在MySQL 中每一个数据库都会在定义好(或者默认)的数据目录下存在一个以数据库名字命名的文件夹,用来存放该数据库中各种表数据文件。不同的MySQL 存储引擎有各自不同的数据文件,存放位置也有区别。
多数存储引擎的数据文件都存放在和MyISAM 数据文件位置相同的目录下,但是每个数据文件的扩展名却各不一样。如MyISAM 用“.MYD”作为扩展名,Innodb 用“.ibd”,Archive 用“.arc”,CSV 用“.csv”,等等。
下面就来详细分析一下这些是什么文件!!!!!
与表相关的元数据(meta)信息都存放在“.frm”文件中,包括表结构的定义信息等。不论是什么存储引擎,每一个表都会有一个以表名命名的“.frm”文件。所有的“.frm”文件都存放在所属数据库的文件夹下面。(innodb,myisam)
“.MYD”文件是MyISAM 存储引擎专用,存放MyISAM 表的数据。每一个MyISAM 表都会有一个“.MYD”文件与之对应,同样存放于所属数据库的文件夹下,和“.frm”文件在一起。
“.MYI”文件也是专属于MyISAM存储引擎的,主要存放MyISAM表的索引相关信息。对于MyISAM存储来说,可以被cache 的内容主要就是来源于“.MYI”文件中。每一个MyISAM表对应一个“.MYI”文件,存放于位置和“.frm”以及“.MYD”一样。
MyISAM 存储引擎的表在数据库中,每一个表都被存放为三个以表名命名的物理文件(frm,myd,myi)。 每个表都有且仅有这样三个文件做为MyISAM 存储类型的表的存储,也就是说不管这个表有多少个索引,都是存放在同一个.MYI 文件中。
这个在开始里看的比较清楚。
这两种文件都是存放Innodb 数据的文件,之所以有两种文件来存放Innodb 的数据(包括索引),是因为Innodb 的数据存储方式能够通过配置来决定是使用共享表空间存放存储数据,还是独享表空间存放存储数据。独享表空间存储方式使用“.ibd”文件来存放数据,且每个表一个“.ibd”文件,文件存放在和MyISAM数据相同的位置。
如果选用共享存储表空间来存放数据,则会使用ibdata 文件来存放,所有表共同使用一个(或者多个,可自行配置)ibdata 文件。ibdata 文件可以通过innodb_data_home_dir 和innodb_data_file_path两个参数共同配置组成, innodb_data_home_dir 配置数据存放的总目录, 而innodb_data_file_path 配置每一个文件的名称。当然,也可以不配innodb_data_home_dir而直接在innodb_data_file_path参数配置的时候使用绝对路径来完成配置。
mysql> showvariables like 'innodb_data%';
+-----------------------+------------------------+
|Variable_name | Value |
+-----------------------+------------------------+
|innodb_data_file_path | ibdata1:10M:autoextend |
| innodb_data_home_dir | |
+-----------------------+------------------------+
2 rows in set(0.01 sec)
innodb_data_file_path中可以一次配置多个ibdata文件。文件可以是指定大小,也可以是自动扩展的,但是Innodb 限制了仅仅只有最后一个ibdata 文件能够配置成自动扩展类型。当我们需要添加新的ibdata 文件的时候,只能添加在innodb_data_file_path配置的最后,而且必须重启MySQL 才能完成ibdata 的添加工作。
ibdata文件瘦身法
MySql innodb如果是共享表空间,ibdata1文件越来越大,达到了30多个G,对一些没用的表进行清空:
truncate table xxx;
然后optimize table xxx; 没有效果
因为对共享表空间不起作用。
mysql ibdata1存放数据,索引等,是MYSQL的最主要的数据。
如果不把数据分开存放的话,这个文件的大小很容易就上了G,甚至几十G。对于某些应用来说,并不是太合适。因此要把此文件缩小。
无法自动收缩,必须数据导出,删除ibdata1,然后数据导入,比较麻烦,因此需要改为每个表单独的文件。
解决方法:数据文件单独存放(共享表空间如何改为每个表独立的表空间文件)。
步骤如下:
1)备份数据库
从命令行进入MySQL Server 5.0\bin
备份全部数据库,执行命令
D:\>mysqldump -q -umysql -ppassword --add-drop-table --all-databases > c:/all.sql
做完此步后,停止数据库服务。
2)找到my.ini或my.cnf文件
linux下执行 ./mysqld --verbose --help | grep -A 1 'Default options'
会有类似显示:
Default options are read from the following files in the given order:
/etc/my.cnf ~/.my.cnf /usr/local/service/mysql3306/etc/my.cnf
windows环境下可以:
mysqld --verbose --help > mysqlhelp.txt
notepad mysqlhelp.txt
在里面查找Default options,可以看到查找my.ini的顺序,以找到真实目录
3)修改mysql配置文件
打开my.ini或my.cnf文件
[mysqld]下增加下面配置
innodb_file_per_table=1
验证配置是否生效,可以重启mysql后,执行
show variables like '%per_table%'
看看innodb_file_per_table变量是否为ON
4)删除原数据文件
删除原来的ibdata1文件及日志文件ib_logfile*,删除data目录下的应用数据库文件夹(mysql文件夹不要删)
5)还原数据库
启动数据库服务
从命令行进入MySQL Server 5.0\bin
还原全部数据库,执行命令mysql -uusername -pyourpassword < c:/all.sql
经过以上几步后,可以看到新的ibdata1文件就只有几十M了,数据及索引都变成了针对单个表的小ibd文件了,它们在相应数据库的文件夹下面。
mysql data文件夹下的ibdata1 文件作用
这个文件超级大, 查了一下, 大概的作用如下
是储存的格式
INNODB类型数据状态下,
ibdata用来储存文件的数据
而库名的文件夹里面的那些表文件只是结构而已
由于mysql4.1默认试innodb,所以这个文件默认就存在了http://man.chinaunix.net/database/mysql/inonodb_zh/2.htm 这个链接试innodb的中文参考, innodb的东西可以在my.ini中设置
使用过MySQL的同学,刚开始接触最多的莫过于MyISAM表引擎了,这种引擎的数据库会分别创建三个文件:表结构、表索引、表数据空间。我们可以将某个数据库目录直接迁移到其他数据库也可以正常工作。
然而当你使用InnoDB的时候,一切都变了。InnoDB 默认会将所有的数据库InnoDB引擎的表数据存储在一个共享空间中:ibdata1,这样就感觉不爽,增删数据库的时候,ibdata1文件不会自动收缩,单个数据库的备份也将成为问题。通常只能将数据使用mysqldump 导出,然后再导入解决这个问题。
在MySQL的配置文件[mysqld]部分,增加innodb_file_per_table参数,可以修改InnoDB为独立表空间模式,每个数据库的每个表都会生成一个数据空间。
独立表空间
优点:
1.每个表都有自已独立的表空间。
2.每个表的数据和索引都会存在自已的表空间中。
3.可以实现单表在不同的数据库中移动。
4.空间可以回收(drop/truncate table方式操作表空间不能自动回收)
5.对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。
缺点:
单表增加比共享空间方式更大。
结论:
共享表空间在Insert操作上有一些优势,但在其它都没独立表空间表现好。
当启用独立表空间时,请合理调整一下 innodb_open_files 参数。
两个重要参数:
innodb_data_file_path
innodb_data_home_dir
这两个参数看参考文献的时候一直没有理解,先说明如下
我的my.cnf
#innodb_data_home_dir = /var/lib/mysql/ #innodb_data_file_path = ibdata1:10M:autoextend
为了在 MySQL-Max-3.23 中使用 InnoDB 表,你必须在配置文件‘my.cnf’中的 [mysqld]
区中详细指定配置参数。
作为最小设置,在 3.23 中你必须在 innodb_data_file_path
上指定数据文件名能及大小。
如果在‘my.cnf’中没有指定innodb_data_home_dir
,系统将在 MySQL 的 datadir
目录下创建数据文件。
如果将 innodb_data_home_dir
设为一个空串,那可以在 innodb_data_file_path
中给定一个绝对路径。
在 MySQL-4.0 中可以不设定 innodb_data_file_path
:MySQL-4.0 将默认地在 datadir
目录下建立一个 10 MB 大小自扩充(auto-extending)的文件‘ibdata1’(在MySQL-4.0.0 与 4.0.1 中数据文件的大小为 64 MB 并且是非自扩充的(not auto-extending))。
为了得到更好的性能你必须所示的例子明确地设定 InnoDB 启动参数。
从 3.23.50 版和 4.0.2 版开始,InnoDB 允许在 innodb_data_file_path
中设置的最一个数据文件描述为 auto-extending。 innodb_data_file_path
语法如下所示:
pathtodatafile:sizespecification;pathtodatafile:sizespec;... ...;pathtodatafile:sizespec[:autoextend[:max:sizespecification]]
如果用 autoextend 选项描述最后一个数据文件,当 InnoDB 用尽所有表自由空间后将会自动扩充最后一个数据文件,每次增量为 8 MB。示例:
innodb_data_home_dir = innodb_data_file_path = /ibdata/ibdata1:100M:autoextend
指定 InnoDB 只建立一个最初大小为 100 MB 并且当表空间被用尽时以 8MB 每块增加的数据文件。如果硬盘空间不足,可以再添加一个数据文件并将其放在其它的硬盘中。 举例来说:先检查硬盘空间的大小,设定 ibdata1 文件使它接近于硬盘空余空间大小并为 1024 * 1024 bytes (= 1 MB)的倍数, 将 ibdata1 明确地指定在 innodb_data_file_path
中。在此之后可以添加另一个数据文件:
innodb_data_home_dir = innodb_data_file_path = /ibdata/ibdata1:988M;/disk2/ibdata2:50M:autoextend注意:设定文件大小时一定要注意你的OS是否有最大文件尺寸为2GB的限制!InnoDB是不会注意你的OS文件尺寸限制的, 在一些文件系统中你可能要设定最大容量限制:
innodb_data_home_dir = innodb_data_file_path = /ibdata/ibdata1:100M:autoextend:max:2000M
一些例子详见原文http://man.chinaunix.net/database/mysql/inonodb_zh/2.htm
参考:
http://blog.okbase.net/haobao/archive/1213.html
http://blog.fens.me/mysql-ibdata1/
http://www.cnit618.com/html/fwdkf/data/2407.htm
http://heylinux.com/archives/2367.html
http://linux.chinaunix.net/techdoc/database/2009/04/28/1109193.shtml
http://linuxfun.me/?p=1263
mysql inbodb优化:http://linux.chinaunix.net/techdoc/database/2009/04/28/1109193.shtml