Introduction
Transportable tablespace is a mechanism to copy and move large data very easily and efficiently between different MySQL instances.
Transportable tablespace is faster than any other mechanism, such as importing and exporting, because the files containing the actual data are just copied to the target location using traditional UNIX commands such as cp locally or scp between servers.
This tool fits very well in data migration processes in the following context:
- Moving data from a transactional database into a data warehouse database
- Moving data from a staging database into a data warehouse database
- Moving data from a data warehouse to a data mart
- Archiving historical data
- Moving data between data centers in different physical locations
- Moving data files to a new volume when the actual volume is full
In this article, I'll explain the required steps to move data tables using the transportable tablespace mechanism, so you can apply this walk-through in real world scenarios.
Demo
In this part of the article, we’re going to explain transportable tablespaces by executing a walk-through. In order to make the explanation simpler, we’re going to create two databases in the same server and move some data files between these databases.
Notice that this mechanism requires that the configuration parameter innodb_file_per_table be on.
The strategy for data migration using the transportable tablespace mechanism is:
- In the source database:
- Flush and lock the tables to be imported. FLUSH TABLE <table_name> FOR EXPORT
- Copy the .cfg and .idb files into a temporary location. Unix command cp
- Unlock the tables. UNLOCK <table_name>
- In the target database:
- Create the target table. CREATE TABLE <table_name>
- Discard the tablespace to remove .idb file. ALTER TABLE <table_name> DISCARD TABLESPACE
- Copy the .cfg and .idb files from the temporary location to the target database. UNIX command cp
- Import the tablespace. ALTER TABLE <table_name> IMPORT TABLESPACE
Let’s start by creating both source and target databases as shown in the listing 01.
mysql> CREATE DATABASE db_source; |
Listing 01
Now let’s create the table testing in the database db_source, and populate it with some data as shown in listing 02.
mysql> USE db_source; |
Listing 02
Now let’s create the table structure on the target database db_target with the same definition of the source one as shown in the listing 03.
mysql> USE db_target; |
Listing 03
Before copying the data files, we need to discard the tablespace of the table testing on the target database, so the new one can be imported as shown in the listing 04.
db_target> ALTER TABLE testing DISCARD TABLESPACE;
|
Listing 04
We can validate this step as shown in the listing 05.
$sudo ls -alh /var/lib/mysql/db_target |
Listing 05
Now let’s start the migration process from the database db_source as shown in the listing 06.
db_source> FLUSH TABLE testing FOR EXPORT;
|
Listing 06
At this moment, the table testing is read-only, so we can copy the underlying data files from the source database to the target database using the traditional UNIX command cp.
While the table testing is locked, we need to copy the .ibd and .cfg files. The .frm file does not need to be copied. In recent versions of MySQL we don’t need to copy the .cfg file in order for the table structure to be discovered.
Remember that the .cfg file contains the InnoDB data dictionary’; that is, the meta-data required to understand the data in the .ibd file. The .cfg file records how many columns, what data types, and what indexes exist.
We may need to execute the command cp as sudo because the MySQL data directory is only accessed by the user mysql as shown in the listing 07.
$ sudo cp /var/lib/mysql/db_source/testing.{ibd,cfg} /var/lib/mysql/db_target
|
Listing 07
Remember to change the ownership of the data files in the target database to the user mysql as shown in the listing 08. We can also verify that the new data files are copied correctly using the command ls.
$ sudo chown mysql:mysql -R /var/lib/mysql/db_target |
Listing 08
Once the data files are copied, then we can unlock the testing table in the db_source database to continue recording data on it as shown in the listing 09.
db_source> UNLOCK TABLES;
|
Listing 09
Now we’re ready to import the data files into the target database as shown in the listing 10.
db_target> ALTER TABLE testing IMPORT TABLESPACE;
|
Listing 10
Let’s verify that the migration process was successfully by printing the rows of the testing table in the target database as shown in the listing 11.
db_target> SELECT * FROM testing; |
Listing 11
Conclusion
In this article, I've explained the idea and benefits of the transportable tablespace mechanism in InnoDB as an alternative for moving large dataset between MySQL instances.
I’ve also illustrated the concept through a common real-world scenario. Now you can start using this amazing feature in your own database environment.
Start the discussion at forums.toadworld.com