在開發時,常常遇到開始在設計數據庫時沒有評估好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