pt-archiver工具其實就是用來清理,歸檔數據用的
一.歸檔前的准備
需要配置client字符集為utf-8,如果你用了utf-8的編碼,防止歸檔數據為亂碼
[client]
default-character-set=utf8
二.使用場景
1、清理線上過期數據
2、清理過期數據,並把數據歸檔到本地歸檔表中,或者遠端歸檔服務器
3、兩張表之間的數據不完全相同,希望合並。此時加上–ignore或–replace選項,可以輕松實現
4、導出線上數據,到線下數據作處理
三.參數
- 至少指定–dest, –file 或者 –purge三個參數中的一個
- –ignore and –replace 不能同時指定
- –txn-size and –commit-each 不能同時指定
- –low-priority-insert and –delayed-insert 不能同時指定
- –share-lock and –for-update 不能同時指定
- –analyze and –optimize 不能同時指定
- –no-ascend and –no-delete 不能同時指定
默認情況下,–dest從–source中復制DSN字符串.即,在同一個MySQL Server上面把數據歸檔到另外一個表.
- –analyze
在數據歸檔完成后,執行ANALYZE TABLE命令.d是在目的端執行,s是在源端執行.--analyze=ds
- –ascend-first
只使用第一列為升序的索引.
- –ask-pass
交互模式輸入密碼
- –buffer
指定–file參數時,提供緩沖功能.性能可能會提高(5-15)%
風險: 在歸檔大事務的時候,如果發生宕機,可能會造成數據丟失.
- –bulk-delete
用單獨的sql語句,每次刪除一個塊的數據.可以加快刪除的速度.不推薦使用.
正常情況下,是根據主鍵,一行一行的刪除.
- –[no]bulk-delete-limit
為–bulk-delete參數添加limit選項
- –bulk-insert
使用”LOAD DATA INFILE”方式代替INSERT方式寫入.
- –charset
指定字符集,例如--charset 'utf8'
- –[no]check-charset
默認開啟,檢查連接的字符集與表的字符集是否一致.
- –[no]check-columns
檢查source和dest是否具有相同的列(不減查列的順序,數據類型等).如果不同,則報錯退出.
- –check-interval
默認1s
如果指定了–check-slave-lag 參數,那么每秒都會檢查從庫的延遲情況(帳號要有權限連接從庫).
- –check-slave-lag
指定一個從庫的DSN串,檢查復制延遲的情況,如果大於–max-lag,就會暫停歸檔.
- –columns
指定歸檔的列(用逗號分割),寫入文件和目的庫表.
注意: 沒有指定列,在原表也會被刪除.也就說,未選擇列的數據,就會丟失.
- –commit-each
配合–limit參數,一組一組的歸檔數據
- –config
參考下面的”如何讀取配置文件”
- –delayed-insert
增加DELAYED屬性
- –dry-run
不做任何操作,只打印要執行的查詢語句.
- –file
歸檔到文件,文件內容相當於是SELECT INTO OUTFILE語法導出的數據,文件名可以增加時間戳和庫名:%d Day of the month, numeric (01..31) %H Hour (00..23) %i Minutes, numeric (00..59) %m Month, numeric (01..12) %s Seconds (00..59) %Y Year, numeric, four digits %D Database name %t Table name
例如
--file '/var/log/archive/%Y-%m-%d-%D.%t'
- –for-update
為SELECT語句增加FOR UPDATE屬性
- –header
在歸檔文件的第一行加入列名.注意,在LOAD DATA INFILE時,別寫入多余的數據.
- –high-priority-select
增加HIGH_PRIORITY 修飾符
See http://dev.mysql.com/doc/en/select.html for details.
- –limit
默認值1
指定每次歸檔多少行.
- –local
執行OPTIMZE或者ANALYZE語句時,不寫binlog,只在本地執行.
- –low-priority-delete
Adds the LOW_PRIORITY modifier to DELETE statements.
See http://dev.mysql.com/doc/en/delete.html for details.
- –low-priority-insert
Adds the LOW_PRIORITY modifier to INSERT or REPLACE statements.
See http://dev.mysql.com/doc/en/insert.html for details.
- –max-lag
默認是1s, 從庫延遲超過這個設置值就會自動暫停.
- –no-ascend
不使用順序索引優化
- –no-delete
不在source上面刪除歸檔數據
- –optimize
歸檔完成后,執行 OPTIMIZE TABLE
- –pid
指定pid文件
- –progress
每隔多少行,打印一次信息.
- –purge
只刪除,不做歸檔.可以省略–file和–dest選項
- –quiet
不打印任何輸出
- –replace
在dest端,使用REPLACE INSERT語句
- –retries
遇到超時或死鎖時,重試的次數.默認是1次
- –run-time
運行多長時間后退出.
可以指定如下后綴,如果沒有后綴,默認是秒s=seconds, m=minutes, h=hours, d=days
- –sentinel
默認路徑: /tmp/pt-archiver-sentinel
如果這個文件存在,則直接退出.
- –set-vars
可以設置mysql的變量,多個變量用逗號分割.--set-vars wait_timeout=500
- –skip-foreign-key-checks
禁用外鍵檢查,相當於執行了 SET FOREIGN_KEY_CHECKS=0
- –sleep
指定兩次SELECT語句的sleep時間.默認是沒有sleep的.
如果指定commit-each參數,commit和flush會在sleep之前發生.
- –stop
創建一個哨兵文件,停止正在運行的pt-archiver進程.例如session1正在執行歸檔操作,然后我用session2創建一個哨兵文件,那么session1的操作會立刻停止.
- –txn-size
指定每個事務的行數.
- –where (重要)
指定歸檔數據的過濾條件.
- –why-quit
打印退出的原因,歸檔數據正常完成的除外.
四.示例
1.歸檔到數據庫
pt-archiver --source h=127.0.0.1,D=test,t=table1,u=root,p=123456 --dest h=127.0.0.1,D=test,t=table2,u=root,p=123456 --where 'id<10000' --no-check-charset --no-delete --limit=1000 --commit-each --progress 2000 --statistics
2.只清理數據
pt-archiver --source h=127.0.0.1,D=test,t=table1,u=root,p=123456 --where 'id<10000' --purge --limit=1 --no-check-charset
3.只把數據導出到外部文件,但是不刪除源表里的數據
pt-archiver --source h=127.0.0.1,D=test,t=table1,u=root,p=123456 --where '1=1' --no-check-charset --no-delete --file="/tmp/archiver.dat"