亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mysql中pt-osc工具怎么用

發布時間:2021-11-06 09:46:56 來源:億速云 閱讀:263 作者:小新 欄目:MySQL數據庫

這篇文章將為大家詳細講解有關mysql中pt-osc工具怎么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

使用方法:
pt-online-schema-change h=*,u=* p=**,P=* ,D=enk,t=my1 --alter"add is_sign_1 int(11) unsigned NOT NULL DEFAULT '0'"--drop-old-table [--sleep10]

pt-online-schema-change在線更改表結構的實現核心有如下幾個過程:

(注:在跟改過程中涉及到三個表:原表、tmp_table即作為原表導數據的臨時表,old_table在最后rename 原表的結果表)


1、
CREATE TABLE `$db`.`$tmp_tbl` LIKE`$db`.`$tbl`" 
新建tmp_table,表結構同原表


2、
在tmp_table上更改表結構為需要的表結構


3、
在原表上建立三個觸發器,如下:


(1)CREATETRIGGER mk_osc_del AFTER DELETE ON $table " "FOR EACH ROW " 


"DELETE IGNORE FROM $new_table ""WHERE$new_table.$chunk_column = OLD.$chunk_column";


(2)CREATETRIGGER mk_osc_ins AFTER INSERT ON $table " "FOR EACH ROW "


"REPLACEINTO $new_table ($columns) " 
"VALUES($new_values)";


(3)CREATETRIGGER mk_osc_upd AFTER UPDATE ON $table " "FOR EACH ROW "


"REPLACE INTO $new_table ($columns) ""VALUES ($new_values)";



我們可以看到這三個觸發器分別對應于INSERT、UPDATE、DELETE三種操作,


(1)
mk_osc_del,DELETE操作,我們注意到DELETEIGNORE,當新有數據時,我們才進行操作,也就是說,當在后續導入過程中,如果刪除的這個數據還未導入到新表,那么我們可以不在新表執行操作,因為在以后的導入過程中,原表中改行數據已經被刪除,已經沒有數據,那么他也就不會導入到新表中;


(2)
mk_osc_ins,INSERT操作,所有的INSERT INTO全部轉換為REPLACEINTO,為了確保數據的一致性,當有新數據插入到原表時,如果觸發器還未把原表數據未同步到新表,這條數據已經被導入到新表了,那么我們就可以利用replaceinto進行覆蓋,這樣數據也是一致的


(3)
mk_osc_upd
UPDATE操作,所有的UPDATE也轉換為REPLACEINTO,因為當跟新的數據的行還未同步到新表時,新表是不存在這條記錄的,那么我們就只能插入該條數據,如果已經同步到新表了,那么也可以進行覆蓋插入,所有數據與原表也是一致的;


我們也能看出上述的精髓也就這這幾條replaceinto操作,正是因為這幾條replaceinto才能保證數據的一致性


4、
拷貝原表數據到臨時表中,在腳本中使用如下語句


INSERT IGNORE INTO $to_table ($columns) "
"SELECT $columns FROM $from_table ""WHERE ($chunks->[$chunkno])",我們能看到他是通過一些查詢(基本為主鍵、唯一鍵值)分批把數據導入到新的表中,在導入前,我們能通過參數--chunk-size對每次導入行數進行控制,已減少對原表的鎖定時間,并且在導入時,我們能通過—sleep參數控制,在每個chunk導入后與下一次chunk導入開始前sleep一會,sleep時間越長,對于磁盤IO的沖擊就越小


5、
Rename 原表到old表中,在把臨時表Rename為原表,


"RENAME TABLE `$db`.`$tmp_tbl`TO `$db`.`$tbl`"; 在rename過程,其實我們還是會導致寫入讀取堵塞的,所以從嚴格意思上說,我們的OSC也不是對線上環境沒有一點影響,但由于rename操作只是一個修改名字的過程,也只會修改一些表的信息,基本是瞬間結束,故對線上影響不太大


6、
清理以上過程中的不再使用的數據,如OLD表




以上即為整個Percona OSC的過程,我們看到精華部分就觸發器那一塊,不過還有很多細節我未介紹,如:外鍵、記錄binlog(默認情況是不記錄binlog的)等等,由于環境的復雜性,此工具還是有很多風險,如以下幾個方面問題或者需要規避的一些問題:


1、
此工具不是原子操作,如果某一點失敗,不僅僅會留下很多中間過程的垃圾文件,而這些文件很難完全清理,并且如果有這些文件存在,那么就不能在次執行OSC操作;


2、
在執行時,盡量避免有這個表的批量更新、鎖表、優化表的操作,我們能想象的到,如果有鎖表、優化表那么OSC是否還能正常執行?


3、
如果存在主從結構,那么盡量在從庫先執行,因為如果在主庫執行完畢后在到從庫執行,我們能想象,主庫字段多同步到從庫,會不會有問題呢?


4、
必須是單一列的主鍵或者單一唯一鍵,這樣我們在insert select *from分片時,是不是能更好的處理量呢?


5、
不要有外鍵,盡管腳本經過嚴格測試,但是是否還有bug,也未知,表的外鍵是不是會帶來更多的問題呢?


6、
在執行之前,我們是不是要對磁盤容量進行評估呢?因為OSC會使用表的一倍以上空間。

關于“mysql中pt-osc工具怎么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阳江市| 建阳市| 泽州县| 乌兰察布市| 林州市| 临清市| 栾川县| 齐河县| 内丘县| 资阳市| 沾化县| 延庆县| 延安市| 太仆寺旗| 米泉市| 蓬安县| 长兴县| 天门市| 宁河县| 桃源县| 丰台区| 大石桥市| 昌宁县| 舒兰市| 济源市| 伽师县| 兴安盟| 大丰市| 苏州市| 商河县| 石屏县| 四川省| 长沙市| 浦城县| 海淀区| 元谋县| 兴国县| 资溪县| 东至县| 正镶白旗| 拉萨市|