mysql 大數據表 添加欄位 無法成功 求解?

最近遇到的一個問題,需要在一張將近1000萬數據量的表中添加加一個欄位,但是直接添加會導致mysql 奔潰,請問有什麼好的方法可以解決?


最近遇到的一個問題,需要在一張將近1000萬數據量的表中添加加一個欄位,但是直接添加會導致mysql 奔潰,請問有什麼好的方法可以解決?

回答:

1.別在業務高峰期做此事情,選擇夜深人靜的時候吧;

2.你的伺服器IO能力糟糕,猜測的話為RAID5,以及內存也估計使用不足了,增加點SWAP;

3. 若是採用主備高可用模式,可以先備機執行,再切換服務的模式,再執行;

4.SESSION級別的臨時表值加大點;

5.若MyISAM存儲引擎,可以考慮一模一樣的表結構及名稱增加好欄位,然後找個無業務訪問

的時候,直接覆蓋*.frm文件,再執行optimize local table ;-- 此方法慎用。


提供一個思路:

1.備份數據;

2.新建一張表,表結構跟以前的表類似,只是包含新添加的欄位,且該欄位為空;

3.把舊錶的數據導入到新表;

4.刪除舊錶。

原因:插入數據帶來的資源消耗很多時候比維護表結構帶來的開銷小。


我一般是這麼處理的

1 一定要在業務低峰期做

2 採用在線ddl工具,比如pt-osg

3 如果第二步還不行,並且有從庫的話,先在從庫做好,再來個主從切換


其實有別的方法可以解決類似問題,主要看你新加的欄位是什麼類型。

舉個栗子,最近我們也發生了類似的情況,需要在表裡增加一個狀態欄位。DBA死活不給我加欄位,於是找了一個之前已經有的狀態做按位運算。雖然代碼改起來很蛋疼,但是問題解決了。

說白了就是拿原來的欄位拿來做擴展,比如用一個varchar欄位改成text然後用這個欄位做json。

野路子多的是


使用pt-online-schema-change 工具,可以在線修改表結構,可以不鎖表,詳細用法去percona官網下載和使用文檔


我的一個2.8億條資料庫表,增加一個欄位,跑了一晚上,都沒有跑完,我依然停掉了,崩潰!

+-----+------+-----------+-------------+---------+-------+-------------------+----------------------------------------------------------------------------------------------+

| Id | User | Host | db | Command | Time | State | Info |

+-----+------+-----------+-------------+---------+-------+-------------------+----------------------------------------------------------------------------------------------+

| 230 | root | localhost | s6sdk201601 | Query | 60297 | copy to tmp table | ALTER TABLE `csdk_app_behavior` ADD `theday` INT(11) NOT NULL DEFAULT 0 AFTER `createtime` |

+-----+------+-----------+-------------+---------+-------+-------------------+----------------------------------------------------------------------------------------------+

這是伺服器cpu信息

09:22:41 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle

09:22:42 AM all 16.33 0.00 3.06 80.61 0.00 0.00 0.00 0.00 0.00

09:22:42 AM 0 16.33 0.00 3.06 80.61 0.00 0.00 0.00 0.00 0.00


試試


1. 增大內存;

2. 調節php.ini參數值;(上官網查各個參數意義)

個人猜測,僅供參考。


推薦閱讀:

如何優化一條 order by 的 SQL 語句?
全球MySQL資料庫淪為新一輪勒索軟體攻擊目標
MySQL · 性能優化 · MySQL常見SQL錯誤用法

TAG:資料庫 | MySQL | 大數據 |