mysql> select table_name from information_schema.tables where table_schema='mysql' and
engine='InnoDB';
+----------------------+
| table_name |
+----------------------+
| innodb_index_stats |
| innodb_table_stats |
| slave_master_info |
| slave_relay_log_info |
| slave_worker_info |
+----------------------+
关闭MySQL
删除所有InnoDB的数据文件和日志文件,包括*.ibd和ib_log文件,还有在MySQL库文件夹下的*.ibd文件
删除所有.frm的InnoDB表文件
在配置文件里配置新的表空间文件
启动MySQL
导入备份出的dump文件
关闭MySQL
通过innodb_log_file_size更改文件大小,通过innodb_log_files_in_group更改文件数量
my.cnf
innodb_log_file_size=30M
innodb_log_files_in_group=3
启动MySQL,看看iblogfile的数量和大小
InnoDB的单表数据文件表空间代表每个InnoDB表的数据和索引数据都存放在单独的.ibd数据文件中,每个.ibd数据文件代表独立的表空间。
此属性通过innodb_file_per_table配置。
此配置的主要优势:
当删除表或者truncate表的时候,意味着对磁盘空间可以回收。而共享表空间时删除一个表时空间不会释放而只是文件里有空闲空间
Truncate table命令要比共享表空间快
通过定义create table …data directory=绝对路径,可以将特定的表放在特定的磁盘或者存储空间
可以将单独的表物理拷贝到另外的MySQL实例中
此配置的劣势:
每个表都有未使用的空间,意味着磁盘空间有些浪费
启动单独表空间的方式如下:
[mysqld]
innodb_file_per_table=1
当设置innodb_file_per_table=0,所有创建的新表都会放置到共享表空间ibdata1里,除非在create table命令里显示的使用tablespace选项。
将已经存在于共享表空间的表修改为独立表空间的方法:
SET GLOBAL innodb_file_per_table=1;
ALTER TABLE table_name ENGINE=InnoDB;
通过命令create table … data directory=绝对路径可以将单表数据文件创建在另外的目录里。
在指定的绝对路径下,会创建数据库名相同的文件夹,里面含有此表的.ibd文件,同时在MySQL的默认数据文件下的数据库名文件夹下会创建table_name.isl文件包含了此表的路径,相当于link文件。
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) DATA DIRECTORY = '/alternative/directory';
Query OK, 0 rows affected (0.03 sec)
# MySQL creates a .ibd file for the new table in a subdirectory that corresponding
# to the database name
db_user@Ubuntu:~/alternative/directory/test# ls
t1.ibd
# MySQL creates a .isl file containing the path name for the table in a directory
# beneath the MySQL data directory
db_user@ubuntu:~/mysql/data/test$ ls
db.opt t1.frm t1.isl
单表迁移
不管是出于备份复制还是什么原因要将单表复制到另外的数据库实例下,可以使用传输表空间的方法
当数据库文件特别大100G的时候,导入导出特别慢,可以用单表的方式实现迁移
在原实例下创建表
mysql> use test;
mysql> CREATE TABLE t(c1 INT)engine=InnoDB;
在目标实例下创建表
mysql> use test;
mysql> CREATE TABLE t(c1 INT)engine=InnoDB;
在目标实例下将表的表空间属性去除
mysql> ALTER TABLE t DISCARD TABLESPACE;
此命令对有外键的表不支持,必须首先执行foreign_key_checks=0
在原实例下表加锁仅允许读操作,并生成.cfg元文件,防止写入数据
mysql> use test;
mysql> FLUSH TABLES t FOR EXPORT;
将.ibd和.cfg文件拷贝到目标实例的指定目录下
shell> scp /path/to/datadir/test/t.{ibd,cfg} destinationserver:/path/to/datadir/test
原实例下释放锁
mysql> use test;
mysql> UNLOCK TABLES;
目标实例下执行导入表空间操作
mysql> use test;
mysql> ALTER TABLE t IMPORT TABLESPACE;
默认情况下undo log是存储在系统表空间ibdata1里,我们也可以将其存放在一个或多个独立表空间下。
Innodb_undo_tablespaces参数定义了有多少个undo表空间,此参数只能在建立MySQL实例时被配置
innodb_undo_directory参数定义了undo表空间的存放路径
innodb_undo_logs参数定义了回滚段的数量