當前位置:編程學習大全網 - 源碼下載 - 數據庫數據歸檔,有什麽好辦法

數據庫數據歸檔,有什麽好辦法

pt-archiver原理解析

作為MySQL DBA,可以說應該沒有不知道pt-archiver了,作為pt-toolkit套件中的重要成員,往往能夠輕松幫助DBA解決數據歸檔的問題。例如線上壹個流水表,業務僅僅只需要存放最近3個月的流水數據,三個月前的數據做歸檔即可,那麽pt-archiver就可以輕松幫妳完成這件事情,甚至妳可以配置成自動任務,無需人工幹預。

作為DBA,我們應該知其然更應該知其所以然,這樣我們也能夠放心地使用pt工具。相信很多DBA都研究過pt-online-schema-change的原理,那麽今天我們深入刨壹刨pt-archiver的工作原理。

壹、原理觀察

土人有土辦法,我們直接開啟general log來觀察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=t1 --progress 5000 \

--statistics --charset=utf8mb4 --limit=10000 --txn-size 1000 --sleep 30

常用選項

--analyze

指定工具完成數據歸檔後對表執行'ANALYZE TABLE'操作。指定方法如'--analyze=ds',s代表源端表,d代表目標端表,也可以單獨指定。

--ask-pass

命令行提示密碼輸入,保護密碼安全,前提需安裝模塊perl-TermReadKey。

--buffer

指定緩沖區數據刷新到選項'--file'指定的文件並且在提交時刷新。

只有當事務提交時禁用自動刷新到'--file'指定的文件和刷新文件到磁盤,這意味著文件是被操作系統塊進行刷新,因此在事務進行提交之前有壹些數據隱式刷新到磁盤。默認是每壹行操作後進行文件刷新到磁盤。

--bulk-delete

指定單個語句刪除chunk的方式來批量刪除行,會隱式執行選項'--commit-each'。

使用單個DELETE語句刪除每個chunk對應的表行,通常的做法是通過主鍵進行逐行的刪除,批量刪除在速度上會有很大的提升,但如果有復雜的'WHERE'條件就可能會更慢。

--[no]bulk-delete-limit

默認值:yes

指定添加選項'--bulk-delete'和'--limit'到進行歸檔的語句中。

--bulk-insert

使用LOAD DATA LOCAL INFILE的方法,通過批量插入chunk的方式來插入行(隱式指定選項'--bulk-delete'和'--commit-each')

而不是通過逐行單獨插入的方式進行,它比單行執行INSERT語句插入的速度要快。通過隱式創建臨時表來存儲需要批量插入的行(chunk),而不是直接進行批量插入操作,當臨時表中完成每個chunk之後再進行統壹數據加載。為了保證數據的安全性,該選項會強制使用選項'--bulk-delete',這樣能夠有效保證刪除是在插入完全成功之後進行的。

--channel

指定當主從復制環境是多源復制時需要進行歸檔哪個主庫的數據,適用於多源復制中多個主庫對應壹個從庫的情形。

--charset,-A

指定連接字符集。

--[no]check-charset

默認值:yes

指定檢查確保數據庫連接時字符集和表字符集相同。

--[no]check-columns

默認值:yes

指定檢查確保選項'--source'指定的源端表和'--dest'指定的目標表具有相同的字段。

不檢查字段在表的排序和字段類型,只檢查字段是否在源端表和目標表當中都存在,如果有不相同的字段差異,則工具報錯退出。如果需要禁用該檢查,則指定'--no-check-columns'。

--check-slave-lag

指定主從復制延遲大於選項'--max-lag'指定的值之後暫停歸檔操作。默認情況下,工具會檢查所有的從庫,但該選項只作用於指定的從庫(通過DSN連接方式)。

--check-interval

默認值:1s

如果同時指定了選項'--check-slave-lag',則該選項指定的時間為工具發現主從復制延遲時暫停的時間。每進行操作100行時進行壹次檢查。

--columns,-c

指定需要歸檔的表字段,如有多個則用','(逗號)隔開。

--commit-each

指定按每次獲取和歸檔的行數進行提交,該選項會禁用選項'--txn-size'。

在每次獲取表數據並進行歸檔之後,在獲取下壹次數據和選項'--sleep'指定的休眠時間之前,進行事務提交和刷新選項'--file'指定的文件,通過選項'--limit'控制事務的大小。

--host,-h

指定連接的數據庫IP地址。

--port,-P

指定連接的數據庫Port端口。

--user,-u

指定連接的數據庫用戶。

--password,-p

指定連接的數據庫用戶密碼。

--socket,-S

指定使用SOCKET文件連接。

--databases,-d

指定連接的數據庫

--source

指定需要進行歸檔操作的表,該選項是必須指定的選項,使用DSN方式表示。

--dest

指定要歸檔到的目標端表,使用DSN方式表示。

如果該選項沒有指定的話,則默認與選項'--source'指定源端表為相同表。

--where

指定通過WHERE條件語句指定需要歸檔的數據,該選項是必須指定的選項。不需要加上'WHERE'關鍵字,如果確實不需要WHERE條件進行限制,則指定'--where 1=1'。

--file

指定表數據需要歸檔到的文件。使用類似MySQL DATE_FORMAT()格式化命名方式。

文件內容與MySQL中SELECT INTO OUTFILE語句使用相同的格式,文件命名選項如下所示:

%Y:年,4位數(Year, numeric, four digits)

%m:月,2位數(Month, numeric (01..12))

%d:日,2位數(Day of the month, numeric (01..31))

%H:小時(Hour (00..23))

%i:分鐘(Minutes, numeric (00..59))

%s:秒(Seconds (00..59))

%D:數據庫名(Database name)

%t:表名(Table name)

例如:--file '/var/log/archive/%Y-%m-%d-%D.%t'

--output-format

指定選項'--file'文件內容輸出的格式。

默認不指定該選項是以制表符進行字段的分隔符,如果指定該選項,則使用','(逗號)作為字段分隔符,使用'"'(雙引號)將字段括起。用法示例:'--output-format=dump'。

--for-update

指定為每次歸檔執行的SELECT語句添加FOR UPDATE子句。--share-lock

指定為每次歸檔執行的SELECT語句添加LOCK IN SHARE MODE子句。

--header

指定在文件中第壹行寫入字段名稱作為標題。

--ignore

指定為INSERT語句添加IGNORE選項。

--limit

默認值:1

指定每條語句獲取表和歸檔表的行數。

--local

指定不將OPTIMIZE和ANALYZE語句寫入binlog。

--max-lag

默認值:1s

指定允許主從復制延遲時長的最大值,單位秒。如果在每次獲取行數據之後主從延遲超過指定的值,則歸檔操作將暫停執行,暫停休眠時間為選項'--check-interval'指定的值。待休眠時間結束之後再次檢查主從延遲時長,檢查方法是通過從庫查詢的'Seconds_Behind_Master'值來確定。如果主從復制延遲壹直大於該參數指定值或者從庫停止復制,則操作將壹直等待直到從庫重新啟動並且延遲小於該參數指定值。

--no-delete

指定不刪除已被歸檔的表數據。

--optimize

指定工具完成數據歸檔後對表執行'OPTIMIZE TABLE'操作。指定方法如'--analyze=ds',s代表源端表,d代表目標端表,也可以單獨指定。

--primary-key-only

指定只歸檔主鍵字段,是選項'--columns=主鍵'的簡寫。

如果工具歸檔的操作是進行DELETE清除時最有效,因為只需讀取主鍵壹個字段而無需讀取行所有字段。

--progress

指定每多少行打印進度信息,打印當前時間,已用時間以及多少行進行歸檔。

--purge

指定執行的清除操作而不是歸檔操作。允許忽略選項'--dest'和'--file'進行操作,如果只是清除操作可以結合選項'--primary-key-only'會更高效。

--quiet,-q

指定工具靜默執行,不輸出任何的執行信息。

--replace

指定寫入選項'--dest'指定目標端表時改寫INSERT語句為REPLACE語句。

--retries

默認值:1

指定歸檔操作遇到死鎖或超時的重試次數。當重試次數超過該選項指定的值時,工具將報錯退出。

--run-time

指定工具歸檔操作在退出之前需要運行的時間。允許的時間後綴名為s=秒,m=分,h=小時,d=天,如果沒指定,默認為s。

--[no]safe-auto-increment

默認值:yes

指定不使用自增列(AUTO_INCREMENT)最大值對應的行進行歸檔。

該選項在進行歸檔清除時會額外添加壹條WHERE子句以防止工具刪除單列升序字段具有的具有AUTO_INCREMENT屬性最大值的數據行,為了在數據庫重啟之後還能使用到AUTO_INCREMENT對應的值,但這會引起無法歸檔或清除字段對應最大值的行。

--set-vars

默認:

wait_timeout=10000

innodb_lock_wait_timeout=1

lock_wait_timeout=60

工具歸檔時指定參數值,如有多個用','(逗號)分隔。如'--set-vars=wait_timeout=5000'。

--skip-foreign-key-checks

指定使用語句SET FOREIGN_KEY_CHECKS = 0禁用外鍵檢查。

--sleep

指定工具在通過SELECT語句獲取歸檔數據需要休眠的時間,默認值是不進行休眠。在休眠之前事務並不會提交,並且選項'--file'指定的文件不會被刷新。如果指定選項'--commit-each',則在休眠之前會進行事務提交和文件刷新。

--statistics

指定工具收集並打印操作的時間統計信息。

統計信息示例如下:

'

Started at 2008-07-18T07:18:53, ended at 2008-07-18T07:18:53

Source: D=db,t=table

SELECT 4

INSERT 4

DELETE 4

Action Count Time Pct

commit 10 0.1079 88.27

select 5 0.0047 3.87

deleting 4 0.0028 2.29

inserting 4 0.0028 2.28

other 0 0.0040 3.29

--txn-size

默認:1

指定每個事務處理的行數。如果是0則禁用事務功能。

--version

顯示工具的版本並退出。

--[no]version-check

默認值:yes

檢查Percona Toolkit、MySQL和其他程序的最新版本。

--why-quit

指定工具打印當非因完成歸檔行數退出的原因。

在執行壹個自動歸檔任務時該選項與選項'--run-time'壹起使用非常方便,這樣可以確定歸檔任務是否在指定的時間內完成。如果同時指定了選項'--statistics',則會打印所有退出的原因。

二、原理解析

根據general log的輸出,我們整理出時序表格如下

三、其他說明

咋壹看這個過程貌似也沒有什麽問題,但是,假如在原表掃描出數據,插入到新表的過程中,舊數據發生了變化怎麽辦?

帶著這個疑問,我們進行了源碼的跟蹤,我們在pt-archiver的6839行打上了斷點

然後我分別在幾個session窗口做了如下動作

最後pt-archiver輸出如下:

# A software update is available:

TIME ELAPSED COUNT

2020-04-08T09:13:21 0 0

2020-04-08T09:13:21 0 1

Started at 2020-04-08T09:13:21, ended at 2020-04-08T09:13:51

Source: 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

SELECT 1

INSERT 1

DELETE 1

Action Count Time Pct

sleep 1 30.0002 99.89

inserting 1 0.0213 0.07

commit 2 0.0080 0.03

select 2 0.0017 0.01

deleting 1 0.0005 0.00

other 0 0.0008 0.00

很明顯,id=3這條記錄並沒有進行歸檔(我們這裏是改了條件列,實際生產中可能是更改了其他列,造成歸檔數據不準確)

那麽如何來解決這種情況的發生呢?

顯然,數據庫在數據庫中可以通過加排它鎖來防止其他程序修改對應的數據,pt-archiver其實早就已經幫我們考慮到了這樣的情況,pt-archiver提供了兩種選擇

--for-update:Adds the FOR UPDATE modifier to SELECT statements

--share-lock:Adds the LOCK IN SHARE MODE modifier to SELECT statements

四、總結

pt-archiver作為歸檔工具無疑是MySQL DBA日常運維的大利器之壹,在使用過程中在知道如何使用的基礎上也能夠知曉其原理

歸檔過程中最好能對歸檔記錄進行加鎖操作,以免造成歸檔數據不準確

在主從環境中,歸檔過程最好控制速度,以免造成主從延遲

盡量控制好chunk的大小,不要過大,造成大事務

  • 上一篇:自私的男人面相特征解說
  • 下一篇:壹片雪花有幾片花瓣?
  • copyright 2024編程學習大全網