熱修改 MySQL 數據庫 pt-online-schema-change 的使用詳解


由於周五公司團建的關系所以此篇推遲了抱歉。

首先不得不在該篇里面梳理一個數據庫熱增加刪除字段表的工具 pt-online-schema-change 這個工具在前面我的博文 《關於utf8mb4的學習了解筆記》里面有提到過,他是一個 online 的 ddl (data definition language) 工具。由於 MySQL 的ddl 語句在執行的時候會鎖表,在數據量大的情況下鎖表就會嚴重影響正常的數據寫入。

既然都說到這里了,也總結一下我在網上查到的 innodb 在 ddl 的時候所執行的操作:

1. 按照原始表 (original_table) 的表結構和 ddl 語句,新建一個不可見的臨時表 (temporary_table)

2. 在原表上面加上 WRITE LOCK 阻塞所有的更新操作 (insert、delete、update等操作)

3. 執行 insert into tmp_table select * from original_table

4. rename original_table 和 tmp_table 最后 drop original_table

5. 最后釋放掉 write lock

「來自 2018 年的補充:目前 MySQL 自己也提供了 onlineddl 的工具,在數據量不大的時候還是非常好用的,直接指定 inplace 也可以輕松達到不鎖表加字段的效果」。

 

通過以上的步驟我們可以很容易的發現,這樣操作在表鎖定的情況是只能查詢,不能寫入。為了解決這個問題所以 percona 公司推出了一個不會阻塞的工具 pt-online-schema-change。

這里不得不再次介紹一下 pt-online-schema-change 是怎么做到在不阻塞寫入的情況下改動數據庫的:

1. 首先創建一個和你要執行的 alter 操作的表一樣的空的表結構。

2. 執行我們賦予的表結構的修改,然后 copy 原表中的數據到新表里面。

3. 在原表上創建一個觸發器在數據 copy 的過程中,將原表的更新數據的操作全部更新到新的表中來。 這里特別注意一下,如果原表中已經定義了觸發器那么工具就不能工作了,因為 pt 使用到了數據庫的觸發器。

4. copy 完成之后,用 rename table 新表代替原表,默認刪除原表。

 

了解了原理之后,理解起來就似乎不那么困難了。感覺這些問題也並不是什么高大上的問題了。下面來看個🌰

pt-online-schema-change \
             h=ip_address, u=user_name, D=database, t=table \
             --set-vars \
             --lock-wait-timeout=60 \
              --ask-pass \
             --execute \
             --alter "add column shop_id int(11) DEFAULT NULL "

lock-wait-timout 這個參數在 MySQL 之前的版本被默認設置成 1s 但是最新的版本會被默認設置成 60s 。一般 60s 的超時還是比較合理的。因為在挪動大量數據的時候,可能會耗時比較長。

 

 

以上就是大致語法,這里來介紹幾個參數:

 

--set-vars:

字符串類型
在鏈接到mysql之后立即設置mysql變量,這個變量會給展示這些設置和執行。


--lock-wait-timeout:

類型int,默認值是1秒

設置一個session值為innodb_lock_wait_timeout.這個選項幫助你防止一個長時間的鎖等待,這種情況一般會發生在比如說數據拷貝的時候,變得非常慢。設置這個選項需要innodb的插件,所以要innodb引擎和mysql比較新。如果設置的這個值比需要的值大,而且這個工具不能設置為一個需要值的話,就會報出warning。反之如果工具不能設置這個值,但是這個值又比所需要的值小的話,就不會發生什么。

 

--ask-for:

  在連接數據庫的時候提示輸入密碼。  

 

--execute參數

  只有加了這個參數,才會去真正執行添加觸發器拷貝數據等一系列操作。

 

其他想要了解更加相信的信息可以訪問這個文檔https://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html 這是官方文檔,基本上疑問都可以從這里得到解答。

 

--------------------------------------分割線----------------------------------------

pt-online-schema-change \
    u=dever,h=127.0.0.1,D=user,t=user,P=16033\
    --set-vars lock_wait_timeout=3 \
    --ask-pass \
    --execute \
    --charset=utf8mb4 \
    --no-check-replication-filters \
    --no-version-check \
    --alter "add column is_cxy20_user tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否創新院2020年學員'";

 

 

Reference:

https://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html  pt-online-schema-change 官方文檔

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM