MySQL更新最佳實踐:
更新的原因 :
1、 舊版本的BUG
2、 舊版本的安全問題
3、 在新版中受益的地方(新特性,可擴充性,性能等)
4、 資料庫支援受限
繼續保留使用舊版本的原因:
1、 app處在一種隔離的網絡狀态,更新成本高
2、 app已不在有新的功能更新
3、 app活躍度下降已不在上升
4、 platform 中的硬體或者os 沒有發生變化等
哪些情況版本更新危險性大:
1、 主版本的變化,比如5.1到5.5的更新
2、 MySQL to Percona or mariadb的更新
3、 一次性跳過太多的副版本号,比如從5.1.20 到 5.1.61
4、 從原來的開發版本更新到其他更高的穩定版或開發版
5、 跳過一個或多個主版本号如: 4.1到5.5 而不是從5.1到5.5
更新需要考慮的問題:
1、 資料、資料類型(是否相容)
在磁盤上存儲的格式,MySQL資料類型的變化,
排序方面的變化;
Timestamp類型是否自動更新時間
新的一些限制;哪些是保留字;統計資訊的改變等
2、 Queries(reads and writes)
文法的變化;警告或錯誤等提示消息
查詢使用方式所帶來的結果是否與原先版本的結果一緻。
在函數等其他查詢中哪些是不确定的query
3、 性能和可擴充性
Query執行時間,query執行計劃,在可擴充和locking方面的性能
4、 複制方面的變化
在一定壓力負載下,複制的一些情況,在err_log中是否有報警或錯誤消息;
是否存在“data drift” 造成主從資料不一緻?性能是否有波動等?
5、 資源的使用
記憶體的使用情況,是減少了還是增多啦?
6、 進階的新特性
更多的新特點前提是 是否犧牲了其他的特性
對 存儲程式、plugin、觸發器、events、視圖 這些方面看看是否收到影響!
是直接更新還是使用複制的方式更新?
對于小的系統來說是直接進行更新,這樣會造成當機或造成其他的危險,使用LVM進行快照的話,可以很快的進行rollback。
對于使用shards 的環境:挨個對mysql進行更新 将危險降到最低;
使用replication 方式的更新方式是值得推薦的(将新版本server做slave,最後在切換)。
在Cloud 中進行更新:
建立一個“clone”的 updated server,直接進行測試;
更新過程中所涉及到其他的問題:
在更新MySQL的時候,是否還要更新硬體?OS?應用程式? 配置檔案如何修改等?
如果單單進行MySQL更新的話,可以用很多時間進行測試;
還有更新其他元件的話,出現問題話,還要查詢是否是其他元件的問題,這樣做危險系數直線上升。
對存在複制架構的情況,進行更新:
1、 對于 MM雙主的情況,先對不活躍的master進行更新;
對shard 環境的資料庫,你可以走個捷徑:
就是不需要對所有的MySQL進行測試, 先更新一個shard,并進行監控,等确認後,在批量更新其他的shard,在進行整體的測試。
更新的具體過程:
1、 先閱讀新版本改進的地方,及新特性
2、 對新版本設定QA環節,列出哪些特性,及改進是需要使用并改變的。
3、 調整MySQL配置檔案;移去過時的參數,對某些參數進行改進(比如:在5.5. 中 storage_engine=Innodb; innodb_file_format=Barracuda;例如某些相容性的需求:在5.5 中 Read-Comitted 在 statement replication環境下是不起作用的。)
4、 遷移資料:
Mysqldump and import back; 最保險的方式,是整個的移動資料,但也最慢,這樣對于跳過很多版本的資料庫更新方式,是很有幫助的。
然後執行 MySQL_upgrade 會檢查table 的相容性并嘗試進行修複;并且更新system table
5、 對資料進行校驗
比較原先備份檔案和更新後的備份檔案的差别
Checksum table(pt-table_checksum工具的使用)
6、 如果不打算停掉業務,可使用replication的方式
使用 pt-table-checksum 進行同步資料check
在slave上檢查錯誤日志或警告。
必要的情況下在進行一次復原,即replication old-new- 來100%确定。
大部分情況下, 采用複制的方式,從5.0-5.5 還是有效果的。
Replication new-new 這樣做的目的是 檢查是否還有額外的安全或其他錯誤;更新的事後驗證。
7、 驗證複制的性能:
測量slave catch up 的速度。檢視thread利用情況。
8、 從線上擷取真實的查詢:
可以打開general_log 或 slow log(long_query_time=0)
或使用tcpdump抓包,pt-query_digest 解包分析
截取部分資料:
Pt-query_digest --sample 5 –print --no-report queries.log > samples.log
9、 檢查query
單connection測試:對這些 samples.log 運作 pt-upgrade
高并發測試: 運作pt-log-player 兩次,第一次熱機,第二次才是真正的運作。
Look at pt-query_digest report on full query log is good to check in both cases
10、進行壓力測試: full application load testing
本文轉自 位鵬飛 51CTO部落格,原文連結:http://blog.51cto.com/weipengfei/1183247,如需轉載請自行聯系原作者