安裝
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.
基本原理:
- 使用用戶密碼登錄
- 然後檢查表的創建語句
show create table table_name
進行臨時表的創建, - 根據l
--alter
參數對臨時表進行結構更改 - 創建觸發器,在更新、刪除、插入的時候對臨時表的修改
- 從舊錶向臨時表中拷貝數據
- 修改舊錶名字, 修改臨時表名字
- 刪除舊錶,刪除觸發器
使用實例:爲表加唯一索引, 添加列, 刪除列
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