作為壹個MySQL DBA,可以說對pt-archiver不應該有任何的無知。作為pt-toolkit套件的重要成員,它往往可以輕松幫助DBA解決數據歸檔的問題。例如,對於壹個在線運行列表,業務只需要存儲最近三個月的運行數據,並對三個月前的數據進行歸檔,那麽pt-archiver就可以輕松幫助妳完成這個任務,甚至妳可以將其配置為自動任務,無需人工幹預。
作為壹個DBA,我們應該知道為什麽,這樣我們才能放心的使用pt工具。相信很多DBA都研究過pt-online-schema-change的原理,所以今天我們就來深入挖掘壹下pt-archiver的工作原理。
第壹,原則觀察
本機有本機方法,所以我們直接打開通用日誌來觀察pt-archiver如何完成歸檔。
命令
pt-Archiver-source h = 127 . 0 . 0 . 1,u=xucl,p=xuclxucl,P=3306,D=xucl,t=t1-dest h = 127 . 0 . 0 . 1,P=3306,u=xucl,p=xuclxucl,D=xucl_archive,t = t 1
-statistics-charset = utf8mb 4-limit = 10000-txn-size 1000-sleep 30
常見選項
-分析
指定在數據存檔後對表執行“分析表”操作的工具。指定諸如'- analyze=ds '之類的方法,其中s代表源表,d代表目標表,或者可以分別指定它們。
-詢問-通過
命令提示符下輸入密碼,保護密碼安全,前提是安裝Perl-$ TERM模塊讀取密鑰。
-緩沖器
指定緩沖區數據刷新到由選項'- file '指定的文件,並在提交時刷新。
只有在提交事務時,才會禁用對由'- file '指定的文件的自動刷新和刷新到磁盤,這意味著文件是由操作系統塊刷新的,因此在提交事務之前,某些數據會隱式刷新到磁盤。默認情況下,在每壹行操作之後,將文件刷新到磁盤。
-批量刪除
在單個語句中指定刪除chunk的方式來批量刪除行將隱式執行選項'- commit-each '。
使用單個DELETE語句刪除每個chunk對應的表行,通常的做法是按主鍵刪除行,這樣會大大提高批量刪除的速度,但是如果有復雜的‘WHERE’條件可能會慢壹些。
-[否]批量刪除-限制
默認值:是
指定將選項'- bulk-delete '和'- limit '添加到正在存檔的語句中。
-批量插入
使用LOAD DATA LOCAL INFILE方法通過成批插入塊來插入行(隱式指定選項'- bulk-delete '和'- commit-each ')。
與逐行插入相比,它比在單行中插入insert語句更快。通過隱式創建壹個臨時表來存儲需要批量插入的行(塊),而不是直接進行批量插入操作,在臨時表中完成每個塊後,再進行統壹的數據加載。為了保證數據的安全性,這個選項會強制選擇'- bulk-delete ',這樣可以有效保證插入完全成功後再進行刪除。
頻道
指定主從復制環境為多源時,需要歸檔哪個主數據庫,適用於多源復制中多個主數據庫對應壹個從數據庫的情況。
-字符集,-A
指定連接字符集。
-[否]檢查字符集
默認值:是
指定該檢查確保連接數據庫時字符集和表字符集相同。
-[否]檢查-列
默認值:是
指定壹個檢查以確保由選項'- source '指定的源表和由'- dest '指定的目標表具有相同的字段。
不檢查表中字段的排序和字段類型,只檢查源表和目標表中是否都有字段。如果存在不同的字段差異,工具將報告錯誤並退出。如果您需要禁用此檢查,請指定'-no - no-check-columns '。
-從動檢查-延遲
在指定主從復制延遲大於選項'- max-lag '指定的值後,暫停歸檔操作。默認情況下,該工具檢查所有從屬庫,但是該選項只對指定的從屬庫有效(通過DSN連接)。
-檢查時間間隔
默認值:1s
如果還指定了選項'- check-slave-lag-lag ',則該選項指定的時間是工具發現主從復制延遲時暫停的時間。每操作100行檢查壹次。
-列,-c
指定要存檔的表字段,如果有多個字段,請用','(逗號)分隔。
-提交-每個
指定根據壹次獲取和歸檔的行數進行提交,這將禁用選項'- txn-size '。
在每個表數據采集和歸檔之後,在采集下壹個數據和選項'- sleep '指定的休眠時間之前,提交事務並刷新選項'- file '指定的文件,事務大小由選項'- limit '控制。
-主機,-h
指定連接的數據庫的IP地址。
-端口,-P
指定連接的數據庫端口。
-用戶,-u
指定連接的數據庫用戶。
-密碼,-p
指定連接的數據庫用戶的口令。
-插座,-S
指定使用套接字文件進行連接。
-數據庫,-d
指定連接的數據庫。
-來源
指定需要存檔的表。該選項必須由DSN指定和表示。
-目的地
指定要歸檔到的目標結束表,用DSN表示。
如果未指定此選項,則由選項'- source '指定的源表在默認情況下是同壹個表。
-哪裏
通過WHERE條件語句指定要存檔的數據。必須指定該選項。您不需要添加“WHERE”關鍵字。如果真的不需要WHERE條件來限制,指定'-where 1 = 1 '。
-文件
指定需要將表數據歸檔到的文件。使用類似MySQL DATE_FORMAT()的格式命名方法。
該文件的內容使用與MySQL中SELECT INTO OUTFILE語句相同的格式,文件命名選項如下:
%Y:年份,4位數(年份,數字,4位數)
%m:月,兩位數(月,數字(01...12))
%d:天,兩位數(壹個月中的某壹天,數字(01...31))
%H:小時(小時(00...23))
%i:分鐘,數字(00...59))
%s:秒(00...59))
%D:數據庫名稱。
%t:表名
例如:-file '/var/log/archive/% y-% m-% d-% d,% t '
-輸出格式
指定選項'- file '文件內容的輸出格式。
默認情況下,該選項不被指定為字段的制表符分隔符。如果指定了此選項,則使用','(逗號)作為字段分隔符,使用' " '(雙引號)將字段括起來。用法示例:“- output-format=dump = dump”。
-for-更新
指定將FOR UPDATE子句添加到為每個歸檔文件執行的SELECT語句中。-共享鎖
指定將LOCK IN SHARE MODE子句添加到為每個歸檔文件執行的SELECT語句中。
-標題
指定將字段名作為標題寫入文件的第壹行。
-忽略
指定將IGNORE選項添加到INSERT語句中。
-限制
默認值:1
指定每個語句中獲取表和存檔表的行數。
-本地
指定不將優化和分析語句寫入binlog。
-最大延遲
默認值:1s
指定主從復制的最大允許延遲時間,以秒為單位。如果在每次行數據采集後,主從延遲超過指定值,歸檔操作將在選項'- check-interval '指定的值內暫停。睡眠時間結束後,再次檢查主從延遲時間,檢查方法通過從庫中查詢' Seconds_Behind_Master '值來確定。如果主-從復制延遲始終大於此參數指定的值,或者從庫中復制停止,操作將等待,直到從庫重新啟動並且延遲小於此參數指定的值。
-否-刪除
指定不刪除存檔的表數據。
-優化
指定在數據存檔後對表執行“優化表”操作的工具。指定諸如'- analyze=ds '之類的方法,其中s代表源表,d代表目標表,或者可以分別指定它們。
-僅主鍵
指定僅存檔主鍵字段,這是選項'-columns = primary key '的縮寫。
如果刪除時工具存檔操作最有效,因為只需要讀取主鍵的壹個字段,而不需要讀取該行的所有字段。
-進步
指定打印進度信息的行數、當前時間、已用時間和要存檔的行數。
-清洗
指定要執行的清除操作,而不是存檔操作。可以忽略選項'- dest '和'- file ',如果只有清除操作可以和選項'-primary-key-only '結合使用,效率會更高。
-安靜-問
指定工具靜默執行,不輸出任何執行信息。
-更換
指定write選項'- dest '以在指定目標結束表時將INSERT語句重寫為REPLACE語句。
-重試次數
默認值:1
指定歸檔操作遇到死鎖或超時時的重試次數。當重試次數超過此選項指定的值時,工具將出錯退出。
-運行時間
指定工具存檔操作需要運行多長時間才能退出。允許的時間後綴稱為s=秒,m=分鐘,h=小時,d=天。如果未指定,則默認為s..
-[否]安全-自動遞增
默認值:是
指定對應於AUTO_INCREMENT最大值的行不用於存檔。
該選項將在存檔和清除時添加壹個額外的WHERE子句,以防止工具刪除單列升序字段中AUTO_INCREMENT屬性最大值的數據行。為了在數據庫重啟後仍然使用AUTO_INCREMENT對應的值,會導致字段最大值的行無法存檔或清除。
-設置變量
默認值:
wait_timeout=10000
innodb _ lock _ wait _ time out = 1
鎖定等待超時=60
存檔工具時指定參數值。如果有多個值,請用','(逗號)分隔。如'-set-vars = wait _ timeout = 5000 '。
-跳過外鍵檢查
使用SET FOREIGN_KEY_CHECKS = 0語句指定禁用外鍵檢查。
-睡覺
指定通過SELECT語句獲取歸檔數據時工具需要休眠的時間。默認值是不休眠。休眠前不會提交事務,也不會刷新選項'- file '指定的文件。如果指定了選項'- commit-each ',事務提交和文件刷新將在休眠之前執行。
-統計
指定工具收集並打印操作的時間統計信息。
統計數據的示例如下:
'
開始於2008-07-18t 07:18:53,結束於2008-07-18t 07:18:53
來源:D =數據庫,t =表格
選擇4
插入4
刪除4
動作計數時間百分比
提交10 0.1079 88.27
選擇5 0.0047 3.87
刪除4 0.0028 2.29
插入4 0.0028 2.28
其他0 0.0040 3.29
-事務大小
默認值:1
指定每個事務的行數。如果為0,則交易功能被禁用。
-版本
顯示工具的版本並退出。
-[否]版本檢查
默認值:是
查看Percona Toolkit、MySQL等程序的最新版本。
-為什麽-退出
指定工具將退出的原因,而不是由於已完成的存檔行數。
在執行自動存檔任務時,將此選項與選項'- run-time '壹起使用非常方便,以便確定存檔任務是否在指定時間內完成。如果還指定了選項'- statistics ',將打印所有退出原因。
二、原理分析
根據壹般日誌的輸出,我們整理出時間序列表如下。
三。其他解釋
乍壹看,這個過程似乎沒有問題,但如果在從原始表中掃描數據並將其插入新表的過程中,舊數據發生了變化,怎麽辦?
帶著這個問題,我們追蹤了源代碼,我們破解了pt-archiver的6839行。
然後我在幾個會話窗口分別做了以下動作。
最後,pt-archiver的輸出如下:
#有可用的軟件更新:
經過時間計數
2020-04-08t 09:13:21 0 0
2020-04-08t 09:13:21 0 1
開始於2020-04-08t 09:13:21,結束於2020-04-08t 09:13:51
來源:A=utf8mb4,D=xucl,P=3306,h=127.0.0.1,P=...,t=t1,u=xucl
Dest: A=utf8mb4,D=xucl_archive,P=3306,h=127.0.0.1,P=...,t=t1,u=xucl
選擇1
插入1
刪除1
動作計數時間百分比
睡眠1 30.0002 99.89
插入1 0.0213 0.07
提交2 0.0080 0.03
選擇2 0.0017 0.01
刪除1 0.0005 0.00
其他0 0.0008 0.00
很明顯,id=3的記錄沒有存檔(我們在這裏更改了條件列,但實際生產中可能更改了其他列,導致存檔數據不準確)。
那麽如何解決這種情況呢?
顯然,數據庫可以通過添加和排除數據庫中的其他鎖來防止其他程序修改相應的數據。事實上,pt-archiver已經幫助我們考慮了這種情況,pt-archiver提供了兩種選擇。
- for-update:向SELECT語句添加FOR UPDATE修飾符
- share-lock:向SELECT語句添加共享模式中的鎖定修飾符
第四,總結
Pt-archiver作為壹款歸檔工具,無疑是MySQL DBA日常運維的絕佳工具之壹,在知道如何使用的基礎上就可以知道它的原理。
歸檔過程中最好將歸檔記錄加鎖,以免歸檔數據不準確。
在主從環境下,最好控制歸檔過程的速度,避免主從之間的延遲。
盡量控制chunk的大小,不要做的太大,造成大交易。