pt-online-schema-change
is a CLI script and part of Percona-toolkit by Percona.
It’s one of the most efficient tools for performing large MySQL table migrations, minimizing DB downtime.
Here’s a rough outline of the performed operations:
- create empty
a_table_new
duplicatinga_table
's stucture - alter empty
a_table_new
as specified(performs structure migration) - add data-copy-trigger to
a_table
so any new data gets copied toa_table_new
- copy actual records from
a_table
toa_table_new
- swap
a_table
witha_table_new
by performing an atomic rename
So a_table_new
becomes a_table
with altered structure and all the data.
Example usage
On a table with 5M rows.
$ pt-online-schema-change --execute --ask-pass --user=admin --chunk-time=1 --nodrop-old-table --alter "add column foo int(11) default null" D=an_app_staging,t=foo_records,h=localhost
Enter MySQL password:
Altering `an_app_staging`.`foo_records`...
Creating new table...
Created new table an_app_staging._foo_records_new OK.
Altering new table...
Altered `an_app_staging`.`_foo_records_new` OK.
Creating triggers...
Created triggers OK.
Copying approximately 5413020 rows...
Copying `an_app_staging`.`foo_records`: 9% 04:36 remain
Copying `an_app_staging`.`foo_records`: 20% 03:59 remain
Copying `an_app_staging`.`foo_records`: 27% 03:55 remain
Copying `an_app_staging`.`foo_records`: 36% 03:25 remain
Copying `an_app_staging`.`foo_records`: 46% 02:53 remain
Copying `an_app_staging`.`foo_records`: 54% 02:27 remain
Copying `an_app_staging`.`foo_records`: 62% 02:05 remain
Copying `an_app_staging`.`foo_records`: 71% 01:37 remain
Copying `an_app_staging`.`foo_records`: 80% 01:07 remain
Copying `an_app_staging`.`foo_records`: 91% 00:28 remain
Copied rows OK.
Swapping tables...
Swapped original and new tables OK.
Dropping triggers...
Dropped triggers OK.
Successfully altered `an_app_staging`.`foo_records`.
Migration took ~5 minutes.
Notice: it may take a while until the tool starts showing progress, as querying information_schema
takes a long time.
Use show processlist
to see what it’s doing.
Percona-toolking
Percona-toolkit contains many useful tools.
Watch Bill Karwin’s percona-toolkit presentation
Installing on OSX
$ brew install percona-toolkit
$ pt-find
Got an error:
Cannot connect to MySQL because the Perl DBD::mysql module is not installed or not found. Run 'perl -MDBD::mysql' to see the directories that Perl searches for DBD::mysql. If DBD::mysql is not installed, try:
Debian/Ubuntu apt-get install libdbd-mysql-perl
RHEL/CentOS yum install perl-DBD-MySQL
OpenSolaris pgk install pkg:/SUNWapu13dbd-mysql
Then tried building DBD::mysql
module with:
$ ARCHFLAGS="-arch x86_64" PATH=/usr/local/mysql/bin/:$PATH cpan DBD::mysql
failed.
This worked:
$ cd ~/.cpan/build/DBD-mysql-4.021-obe4Nm/
$ ARCHFLAGS='-arch x86_64' perl Makefile.PL --testuser='root'
$ make && make install
Great success!