mysql 大數據表 添加欄位 無法成功 求解?
02-01
最近遇到的一個問題,需要在一張將近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 %idle09:22:42 AM all 16.33 0.00 3.06 80.61 0.00 0.00 0.00 0.00 0.0009: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錯誤用法