如何在线修改千万,亿级别的mysql数据库表的结构方案

在开发时,常常遇到开始在设计数据库时没有评估好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

相关文章
相关标签/搜索