傳統的高可用架構是不能預防誤刪資料的,因為主庫的乙個 drop table 命令,會通過 binlog 傳給所有從庫和級聯從庫,進而導致整個集群的例項都會執行這個命令
a. 誤刪行:flashback 工具通過閃回把資料恢復回來-修改 binlog 的內容,拿回原庫重放,insert<->delete,update before<->after
delete 全表是很慢的,需要生成回滾日誌、寫 redo、寫 binlog。所以,從效能角度考慮,你應該優先考慮使用 truncate table 或者 drop table 命令
b. 誤刪庫 / 表: 全量備份,加增量日誌,用備份恢復出乙個臨時庫,從日誌備份裡面,取出全量備份時間點之後到誤刪之前的日誌,應用到臨時庫
用備份恢復出臨時例項之後,將這個臨時例項設定成線上備庫的從庫
把 mysqlbinlog 工具解析出的 binlog 檔案應用到臨時庫,還是把臨時庫接到備庫上,這兩個方案的共同點是:誤刪庫或者表後,恢復資料的思路主要就是通過備份,再加上應用 binlog 的方式
延遲復製備庫: 一般的主備複製結構存在的問題是,如果主庫上有個表被誤刪了,這個命令很快也會被發給所有從庫,進而導致所有從庫的資料表也都一起被誤刪了,複製的備庫是一種特殊的備庫,通過 change master to master_delay = n 命令,可以指定這個備庫持續保持跟主庫有 n 秒的延遲,縮短了整個資料恢復需要的時間
預防誤刪庫 / 表的方法: 賬號分離/操作規範
mysql 中有兩個 kill 命令:乙個是 kill query + 執行緒 id,表示終止這個執行緒中正在執行的語句;乙個是 kill connection + 執行緒 id,這裡 connection 可預設,表示斷開這個執行緒的連線,當然如果這個執行緒有語句正在執行,也是要先停止正在執行的語句的
kill 並不是馬上停止的意思,而是告訴執行執行緒說,這條語句已經不需要繼續執行了,可以開始「執行停止的邏輯了,當使用者執行 kill query thread_id_b 時,mysql 裡處理 kill 命令的執行緒做了兩件事:1. 把 session b 的執行狀態改成 thd::kill_query(將變數 killed 賦值為 thd::kill_query);2. 給 session b 的執行執行緒發乙個訊號
kill 無效的第一類情況,即:執行緒沒有執行到判斷執行緒狀態的邏輯。跟這種情況相同的,還有由於 io 壓力過大,讀寫 io 的函式一直無法返回,導致不能及時判斷執行緒的狀態
另一類情況是,終止邏輯耗時較長,大事務,大查詢,回滾日誌或臨時檔案清理等長耗時操作
mysql 是停等協議,所以這個執行緒執行的語句還沒有返回的時候,再往這個連線裡面繼續發命令也是沒有用的。實際上,執行 ctrl+c 的時候,是 mysql 客戶端另外啟動乙個連線,然後傳送乙個 kill query 命令
客戶端查詢,對大表做全表掃瞄,是邊讀邊發的,資料是儲存在主鍵索引上的,所以直接掃瞄表 t 的主鍵索引,服務端並不儲存完整的結果集,不斷取,放入net_buffer,滿了通過網絡卡傳送,迴圈
如果你在自己負責維護的 mysql 裡看到很多個執行緒都處於「sending to client」這個狀態,表示伺服器端的網路棧寫滿了,就意味著你要讓業務開發同學優化查詢結果,並評估這麼多的返回結果是否合理
buffer pool 對查詢的加速效果,依賴於乙個重要的指標,即:記憶體命中率,show engine innodb status 結果中,檢視乙個系統當前的 bp 命中率,show engine innodb status ,可以看到「buffer pool hit rate」字樣,顯示的就是當前的命中率
innodb 記憶體管理用的是最近最少使用 (least recently used, lru) 演算法的改進版,按照 5:3 的比例把整個 lru 鍊錶分成了 young 區域和 old 區域,在掃瞄這個大表的過程中,雖然也用到了 buffer pool,但是對 young 區域完全沒有影響,從而保證了 buffer pool 響應正常業務的查詢命中率
學習記錄 MySQL實戰45講 16 20
extra 這個欄位中的 using filesort 表示的就是需要排序,mysql 會給每個執行緒分配一塊記憶體用於排序,稱為 sort buffer select city,name,age from t where city 杭州 order by name limit 1000 從普通索引...
學習記錄 MySQL實戰45講 27 29
一主多從,一般用於讀寫分離,主庫負責所有的寫入和一部分讀,其他的讀請求則由從庫分擔,a 和 a 互為主備 主備切換 基於位點的主備切換,從庫需要change master到主庫並提供對應的檔名和日誌偏移量,等待新主庫 a 把中轉日誌 relay log 全部同步完成 在 a 上執行 show mas...
實戰mysql45講 MySQL實戰45講
作者簡介 林曉斌,網名 丁奇 前阿里資深技術專家,曾負責阿里雲rds核心開發團隊和運維團隊,並推動了alisql分支開源。作為活躍的mysql社群貢獻者,丁奇專注於資料儲存系統 mysql原始碼研究和改進 mysql效能優化和功能改進,熱衷於解決mysql疑難問題。課程亮點 你將獲得 前阿里資深技術...