在線修改大表結構之pt-online-schema-change (alter-foreign-keys-method)

安裝

sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
sudo yum install percona-toolkit

查看觸發器:

方式一:

use information_schema;
select * from TRIGGERS;

方式二:

use database_name;
show triggers;

刪除觸發器:

drop trigger trigger_name

有觸發器pt-online-schema-change將不工作
會出現如下提示:The table fr.xaxa has triggers. This tool needs to create its own triggers, so the table cannot already have triggers.

基本原理:

  1. 使用用戶密碼登錄
  2. 然後檢查表的創建語句show create table table_name進行臨時表的創建,
  3. 根據l--alter參數對臨時表進行結構更改
  4. 創建觸發器,在更新、刪除、插入的時候對臨時表的修改
  5. 從舊錶向臨時表中拷貝數據
  6. 修改舊錶名字, 修改臨時表名字
  7. 刪除舊錶,刪除觸發器

使用實例:爲表加唯一索引, 添加列, 刪除列

time pt-online-schema-change --user=kratos --password=3vUbY52IJ2fJq7KwWPeItNrz8 --host=127.0.0.1 --port=3306  --alter="add unique index tel_name(tel, name)" D=test,t=tb_user --nocheck-replication-filters --nocheck-unique-key-change --max-lag=5  --check-interval=2 --alter-foreign-keys-method=auto --execute --print
# 添加列 --alter="add column address varchar(50) not null default ''"
# 刪除列 --alter="drop column address"

不同的操作就是改一下--alter裏面的內容

問題:

主從複製 --max-lag=5 --check-interval=2 (設定延遲) 這裏使用默認也可以
外鍵約束 --alter-foreign-keys-method=auto
auto 表示在下面兩種方式中進行選擇

  • 如果使用 drop_swrap 的時候,會先刪除舊錶 然後將 新表重命名爲原表名
    (原因是在rename的時候原來的外鍵約束名稱也會更改,這裏不通過名稱交換再刪除就是爲了防止原來的約束名稱改變)

  • 如果使用 rebuild_constraints 的方式,則是通過交換表名的方式進行的,只不過是再重新構建了外鍵約束,通過改表名,外鍵約束對應的表名也被更改。
    需要注意的是: 如果行不存在重複數據的情況下的時候是沒什麼問題的,如果建立唯一所以導致重複數據刪除,在重建外鍵約束的時候就會報錯*

  • 另外,對於特別大的表進行刪除的時候會消耗一定的時間,drop_swap的方式是先刪原表則會造成在 查詢的時候 原表不存在而報錯,雖然官方文檔說刪錶速度很快,
    但是網上說IO很慢,導致刪表變慢, 這裏需要對官方說法進行驗證,以確保在刪表上pt做了優化(這個括號裏面的是在驗證後的內容,在2千萬的帶有外鍵約束的表,刪除的時候是很快的)**

  • 一種做法是在刪除的時候給數據文件加上另外一個硬鏈接,這樣在刪除表的時候,就只是刪除硬鏈接的時間,很快,然後手動刪除真實數據文件即可!
    然而,如果表使用的是共享空間,而不是單個表的空間 就… ! 使用SHOW VARIABLES LIKE 'innodb_file_per_table'; 查看*

另外在插入刪除的時候,因爲觸發器的存在,不會造成影響。
磁盤空間(1倍)
–no-drop-old-table 不刪除原來的表

性能
–critical-load=“Threads_running=200”

特別參數
–nocheck-unique-key-change
–nocheck-replication-filters

測試過程
-–dry-run --print

使用
–execute

權威 文檔

查看主從狀態

SHOW SLAVE STATUS \G
SHOW status;

擴展:類似工具gh-ost

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章