在开发时,常常遇到开始在设计数据库时没有评估好mysql的数据结构,好比须要临时新增,修改等对mysql作一些DDL操做,如何数据量百万级别如下,直接操做mysql命令来修改表结构,问题不大,但当数据库已经上百万,千万,甚至上亿了,也没有分库分表,须要对这么大记录集的表进行修改,若是直接用mysql命令操做,势必会锁表时间太长,影响线上业务及时mysql操做使用,以下介绍一种方案解决在线修改大数据表而不影响在线业务的方法:mysql
环境版本: ubuntu 12, mysql 5.5sql
安装percona-toolkit工具:数据库
gpg --keyserver hkp://keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A
gpg -a --export CD2EFD2A | sudo apt-key add -
echo "deb http://repo.percona.com/apt `lsb_release -cs` main" >> /etc/apt/sources.list.d/percona.list
echo "deb-src http://repo.percona.com/apt `lsb_release -cs` main" >> /etc/apt/sources.list.d/percona.listubuntu
apt-get update
apt-get install percona-toolkit数据结构
安装percona-toolkit成功后,执行pt-online-schema-change命令,好比须要修改mysql表的字段类型:app
./pt-online-schema-change --user=root -h 192.168.0.2 -p root --alter="MODIFY COLUMN count int(11) UNSIGNED NOT NULL AFTER content" D=pt-demo,t=news --execute工具
若是能收到以下输出,说明执行成功了大数据
No slaves found. See --recursion-method if host sdk-dev-dbserver has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
analyze_table, 10, 1
copy_rows, 10, 0.25
create_triggers, 10, 1
drop_triggers, 10, 1
swap_tables, 10, 1
update_foreign_keys, 10, 1
Altering `pt-demo`.`news`...
Creating new table...
Created new table pt-demo._news_new OK.
Altering new table...
Altered `pt-demo`.`_news_new` OK.
2017-02-09T11:30:18 Creating triggers...
2017-02-09T11:30:18 Created triggers OK.
2017-02-09T11:30:18 Copying approximately 27906818 rows...
Copying `pt-demo`.`news`: 4% 09:51 remain
Copying `pt-demo`.`news`: 9% 09:40 remain
Copying `pt-demo`.`news`: 13% 09:36 remain
Copying `pt-demo`.`news`: 17% 09:15 remain
Copying `pt-demo`.`news`: 22% 08:50 remain
Copying `pt-demo`.`news`: 26% 08:16 remain
Copying `pt-demo`.`news`: 33% 06:50 remain
Copying `pt-demo`.`news`: 39% 06:05 remain
Copying `pt-demo`.`news`: 43% 05:45 remain
Copying `pt-demo`.`news`: 48% 05:23 remain
Copying `pt-demo`.`news`: 51% 05:07 remain
Copying `pt-demo`.`news`: 55% 04:44 remain
Copying `pt-demo`.`news`: 60% 04:18 remain
Copying `pt-demo`.`news`: 66% 03:34 remain
Copying `pt-demo`.`news`: 72% 02:49 remain
Copying `pt-demo`.`news`: 79% 02:02 remain
Copying `pt-demo`.`news`: 86% 01:19 remain
Copying `pt-demo`.`news`: 93% 00:37 remain
Copying `pt-demo`.`news`: 98% 00:07 remain
2017-02-09T11:40:54 Copied rows OK.
2017-02-09T11:40:54 Swapping tables...
2017-02-09T11:40:54 Swapped original and new tables OK.
2017-02-09T11:40:54 Dropping old table...
2017-02-09T11:40:55 Dropped old table `pt-demo`.`_news_old` OK.
2017-02-09T11:40:55 Dropping triggers...
2017-02-09T11:40:55 Dropped triggers OK.
Successfully altered `pt-demo`.`news`.spa
percona-toolkit工做原理是,1,先建立需修改字段后的临时表;2,把旧数据导入到临时表;3,建立了触发器,把在执行修改结构时对旧的表数据操做触发导入到临时表;4,把临时表命名成旧表名称。.net