Spec-Zone .ru
спецификации, руководства, описания, API
|
To create a new InnoDB
table in a specific location outside the MySQL data
directory, use the DATA DIRECTORY =
clause of the absolute_path_to_directory
CREATE TABLE
statement. (Plan the location in advance, because you cannot use
this clause with the ALTER TABLE
statement.) The directory you specify could be on another storage
device with particular performance or capacity characteristics, such as a fast SSD or a
high-capacity HDD.
Within the destination directory, MySQL creates a subdirectory corresponding to the database name, and within
that a .ibd file for the new table. In
the database directory underneath the MySQL DATADIR
directory, MySQL creates a
file containing the path name for the table.
The .isl file is treated by MySQL like
a symbolic link. (Using actual symbolic links has never been
supported for table_name
.islInnoDB
tables.)
The following example shows how you might run a small development or test instance of MySQL on a laptop with a
primary hard drive that is 95% full, and place a new table EXTERNAL
on a different
storage device with more free space. The shell commands show the different paths to the LOCAL
table in its default location under the DATADIR
directory, and the EXTERNAL
table in the location you specified:
mysql> \! df -k .Filesystem 1024-blocks Used Available Capacity iused ifree %iused Mounted on/dev/disk0s2 244277768 231603532 12418236 95% 57964881 3104559 95% /mysql> use test;Database changedmysql> show variables like 'innodb_file_per_table';+-----------------------+-------+| Variable_name | Value |+-----------------------+-------+| innodb_file_per_table | ON |+-----------------------+-------+1 row in set (0.00 sec)mysql> \! pwd/usr/local/mysqlmysql> create table local (x int unsigned not null primary key);Query OK, 0 rows affected (0.03 sec)mysql> \! ls -l data/test/local.ibd-rw-rw---- 1 cirrus staff 98304 Nov 13 15:24 data/test/local.ibdmysql> create table external (x int unsigned not null primary key) data directory = '/volumes/external1/data';Query OK, 0 rows affected (0.03 sec)mysql> \! ls -l /volumes/external1/data/test/external.ibd-rwxrwxrwx 1 cirrus staff 98304 Nov 13 15:34 /volumes/external1/data/test/external.ibdmysql> select count(*) from local;+----------+| count(*) |+----------+| 0 |+----------+1 row in set (0.01 sec)mysql> select count(*) from external;+----------+| count(*) |+----------+| 0 |+----------+1 row in set (0.01 sec)
MySQL initially holds the .ibd
file open,
preventing you from dismounting the device, but might eventually close the table if the server is
busy. Be careful not to accidentally dismount the external device while MySQL is running, or to
start MySQL while the device is disconnected. Attempting to access a table when the associated .ibd
file is missing causes a serious error that requires a server
restart.
The server restart might fail if the .ibd
file is still not at the
expected path. In this case, manually remove the
file in the database
directory, and after restarting do a table_name
.islDROP TABLE
to delete the .frm
file and remove the information about the table from the data
dictionary.
Do not put MySQL tables on an NFS-mounted volume. NFS uses a message-passing protocol to write to files, which could cause data inconsistency if network messages are lost or received out of order.
If you use an LVM snapshot, file copy, or other file-based mechanism to back up
the .ibd
file, always use the FLUSH TABLES ... FOR EXPORT
statement first to make sure all
changes that were buffered in memory are flushed to disk before the backup
occurs.
The DATA DIRECTORY
clause is a supported
alternative to using symbolic links, which has always
been problematic and was never supported for individual InnoDB
tables.