DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH
 

(mysql.info.gz) Multiple tablespaces

Info Catalog (mysql.info.gz) InnoDB and MySQL Replication (mysql.info.gz) Using InnoDB tables
 
 15.7.6 Using Per-Table Tablespaces
 ----------------------------------
 
 * CRITICAL BUG in 4.1 if you specify `innodb_file_per_table' in
 `my.cnf'! If you shut down `mysqld', then records may disappear from
 the secondary indexes of a table. See (Bug #7496) for more information
 and workarounds. This is fixed in 4.1.9, but another bug (Bug #8021)
 bit the Windows version in 4.1.9, and in the Windows version of 4.1.9
 you must put the line `innodb_flush_method=unbuffered' to your `my.cnf'
 or `my.ini' to get `mysqld' to work.
 
 Starting from MySQL 4.1.1, you can store each `InnoDB' table and its
 indexes into its own file. This feature is called "multiple tablespaces"
 because in effect each table has its own tablespace.
 
 Using multiple tablespaces can be beneficial to users who want to move
 specific tables to separate physical disks or who wish to restore
 backups of single tables quickly without interrupting the use of the
 remaining InnoDB tables.
 
 If you need to downgrade to 4.0, you have to take table dumps and
 re-create the whole `InnoDB' tablespace. If you have not created new
 `InnoDB' tables under MySQL 4.1.1 or later, and need to downgrade
 quickly, you can also do a direct downgrade to the MySQL 4.0.18 or
 later in the 4.0 series.  Before doing the direct downgrade to 4.0.x,
 you have to end all client connections to the `mysqld' server that is
 to be downgraded, and let it run the purge and insert buffer merge
 operations to completion, so that `SHOW INNODB STATUS' shows the main
 thread in the state `waiting for server activity'. Then you can shut
 down `mysqld' and start 4.0.18 or later in the 4.0 series.
 
 You can enable multiple tablespaces by adding a line to the `[mysqld]'
 section of `my.cnf':
 
      [mysqld]
      innodb_file_per_table
 
 After restarting the server, `InnoDB' will store each newly created
 table into its own file `TBL_NAME.ibd' in the database directory where
 the table belongs.  This is similar to what the `MyISAM' storage engine
 does, but `MyISAM' divides the table into a data file `TBL_NAME.MYD'
 and the index file `TBL_NAME.MYI'.  For `InnoDB', the data and the
 indexes are stored together in the `.ibd' file.  The `TBL_NAME.frm'
 file is still created as usual.
 
 If you remove the `innodb_file_per_table' line from `my.cnf' and
 restart the server, `InnoDB' creates tables inside the shared tablespace
 files again.
 
 `innodb_file_per_table' affects only table creation. If you start the
 server with this option, new tables are created using `.ibd' files, but
 you can still access tables that exist in the shared tablespace. If you
 remove the option, new tables are created in the shared tablespace, but
 you can still access any tables that were created using multiple
 tablespaces.
 
 `InnoDB' always needs the shared tablespace. The `.ibd' files are not
 sufficient for `InnoDB' to operate. The shared tablespace consists of
 the familiar `ibdata' files where `InnoDB' puts its internal data
 dictionary and undo logs.
 
 *You cannot freely move `.ibd' files around* between database
 directories the way you can with `MyISAM' table files. This is because
 the table definition is stored in the `InnoDB' shared tablespace, and
 also because `InnoDB' must preserve the consistency of transaction IDs
 and log sequence numbers.
 
 Within a given MySQL installation, you can move an `.ibd' file and the
 associated table from one database to another with the familiar `RENAME
 TABLE' statement:
 
      RENAME TABLE OLD_DB_NAME.TBL_NAME TO NEW_DB_NAME.TBL_NAME;
 
 If you have a "clean" backup of an `.ibd' file, you can restore it to
 the MySQL installation from which it originated as follows:
 
   1. Issue this `ALTER TABLE' statement:
 
           ALTER TABLE TBL_NAME DISCARD TABLESPACE;
 
      Caution: This deletes the current `.ibd' file.
 
   2. Put the backup `.ibd' file back in the proper database directory.
 
   3. Issue this `ALTER TABLE' statement:
 
           ALTER TABLE TBL_NAME IMPORT TABLESPACE;
 
 
 In this context, a "clean" `.ibd' file backup means:
 
    * There are no uncommitted modifications by transactions in the
      `.ibd' file.
 
    * There are no unmerged insert buffer entries in the `.ibd' file.
 
    * Purge has removed all delete-marked index records from the `.ibd'
      file.
 
    * `mysqld' has flushed all modified pages of the `.ibd' file from
      the buffer pool to the file.
 
 You can make such a clean backup `.ibd' file with the following method:
 
   1. Stop all activity from the `mysqld' server and commit all
      transactions.
 
   2. Wait until `SHOW INNODB STATUS' shows that there are no active
      transactions in the database, and the main thread status of
      `InnoDB' is `Waiting for server activity'. Then you can make a
      copy of the `.ibd' file.
 
 Another method for making a clean copy of an `.ibd' file is to use the
 commercial `InnoDB Hot Backup' tool:
 
   1. Use `InnoDB Hot Backup' to back up the `InnoDB' installation.
 
   2. Start a second `mysqld' server on the backup and let it clean up
      the `.ibd' files in the backup.
 
 It is in the TODO to also allow moving clean `.ibd' files to another
 MySQL installation. This requires resetting of transaction IDs and log
 sequence numbers in the `.ibd' file.
 
Info Catalog (mysql.info.gz) InnoDB and MySQL Replication (mysql.info.gz) Using InnoDB tables
automatically generated byinfo2html