easy excel date 类型解析报错_ptarchiver原理解析
pt-archiver原理解析
作為MySQL DBA,可以說應(yīng)該沒有不知道pt-archiver了,作為pt-toolkit套件中的重要成員,往往能夠輕松幫助DBA解決數(shù)據(jù)歸檔的問題。例如線上一個(gè)流水表,業(yè)務(wù)僅僅只需要存放最近3個(gè)月的流水?dāng)?shù)據(jù),三個(gè)月前的數(shù)據(jù)做歸檔即可,那么pt-archiver就可以輕松幫你完成這件事情,甚至你可以配置成自動(dòng)任務(wù),無需人工干預(yù)。
作為DBA,我們應(yīng)該知其然更應(yīng)該知其所以然,這樣我們也能夠放心地使用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常用選項(xiàng)
--analyze指定工具完成數(shù)據(jù)歸檔后對表執(zhí)行'ANALYZE TABLE'操作。指定方法如'--analyze=ds',s代表源端表,d代表目標(biāo)端表,也可以單獨(dú)指定。--ask-pass命令行提示密碼輸入,保護(hù)密碼安全,前提需安裝模塊perl-TermReadKey。--buffer指定緩沖區(qū)數(shù)據(jù)刷新到選項(xiàng)'--file'指定的文件并且在提交時(shí)刷新。只有當(dāng)事務(wù)提交時(shí)禁用自動(dòng)刷新到'--file'指定的文件和刷新文件到磁盤,這意味著文件是被操作系統(tǒng)塊進(jìn)行刷新,因此在事務(wù)進(jìn)行提交之前有一些數(shù)據(jù)隱式刷新到磁盤。默認(rèn)是每一行操作后進(jìn)行文件刷新到磁盤。--bulk-delete指定單個(gè)語句刪除chunk的方式來批量刪除行,會(huì)隱式執(zhí)行選項(xiàng)'--commit-each'。使用單個(gè)DELETE語句刪除每個(gè)chunk對應(yīng)的表行,通常的做法是通過主鍵進(jìn)行逐行的刪除,批量刪除在速度上會(huì)有很大的提升,但如果有復(fù)雜的'WHERE'條件就可能會(huì)更慢。--[no]bulk-delete-limit默認(rèn)值:yes指定添加選項(xiàng)'--bulk-delete'和'--limit'到進(jìn)行歸檔的語句中。--bulk-insert使用LOAD DATA LOCAL INFILE的方法,通過批量插入chunk的方式來插入行(隱式指定選項(xiàng)'--bulk-delete'和'--commit-each')而不是通過逐行單獨(dú)插入的方式進(jìn)行,它比單行執(zhí)行INSERT語句插入的速度要快。通過隱式創(chuàng)建臨時(shí)表來存儲(chǔ)需要批量插入的行(chunk),而不是直接進(jìn)行批量插入操作,當(dāng)臨時(shí)表中完成每個(gè)chunk之后再進(jìn)行統(tǒng)一數(shù)據(jù)加載。為了保證數(shù)據(jù)的安全性,該選項(xiàng)會(huì)強(qiáng)制使用選項(xiàng)'--bulk-delete',這樣能夠有效保證刪除是在插入完全成功之后進(jìn)行的。--channel指定當(dāng)主從復(fù)制環(huán)境是多源復(fù)制時(shí)需要進(jìn)行歸檔哪個(gè)主庫的數(shù)據(jù),適用于多源復(fù)制中多個(gè)主庫對應(yīng)一個(gè)從庫的情形。--charset,-A指定連接字符集。--[no]check-charset默認(rèn)值:yes指定檢查確保數(shù)據(jù)庫連接時(shí)字符集和表字符集相同。--[no]check-columns默認(rèn)值:yes指定檢查確保選項(xiàng)'--source'指定的源端表和'--dest'指定的目標(biāo)表具有相同的字段。不檢查字段在表的排序和字段類型,只檢查字段是否在源端表和目標(biāo)表當(dāng)中都存在,如果有不相同的字段差異,則工具報(bào)錯(cuò)退出。如果需要禁用該檢查,則指定'--no-check-columns'。--check-slave-lag指定主從復(fù)制延遲大于選項(xiàng)'--max-lag'指定的值之后暫停歸檔操作。默認(rèn)情況下,工具會(huì)檢查所有的從庫,但該選項(xiàng)只作用于指定的從庫(通過DSN連接方式)。--check-interval默認(rèn)值:1s如果同時(shí)指定了選項(xiàng)'--check-slave-lag',則該選項(xiàng)指定的時(shí)間為工具發(fā)現(xiàn)主從復(fù)制延遲時(shí)暫停的時(shí)間。每進(jìn)行操作100行時(shí)進(jìn)行一次檢查。--columns,-c指定需要?dú)w檔的表字段,如有多個(gè)則用','(逗號(hào))隔開。--commit-each指定按每次獲取和歸檔的行數(shù)進(jìn)行提交,該選項(xiàng)會(huì)禁用選項(xiàng)'--txn-size'。在每次獲取表數(shù)據(jù)并進(jìn)行歸檔之后,在獲取下一次數(shù)據(jù)和選項(xiàng)'--sleep'指定的休眠時(shí)間之前,進(jìn)行事務(wù)提交和刷新選項(xiàng)'--file'指定的文件,通過選項(xiàng)'--limit'控制事務(wù)的大小。--host,-h指定連接的數(shù)據(jù)庫IP地址。--port,-P指定連接的數(shù)據(jù)庫Port端口。--user,-u指定連接的數(shù)據(jù)庫用戶。--password,-p指定連接的數(shù)據(jù)庫用戶密碼。--socket,-S指定使用SOCKET文件連接。--databases,-d指定連接的數(shù)據(jù)庫--source指定需要進(jìn)行歸檔操作的表,該選項(xiàng)是必須指定的選項(xiàng),使用DSN方式表示。--dest指定要?dú)w檔到的目標(biāo)端表,使用DSN方式表示。如果該選項(xiàng)沒有指定的話,則默認(rèn)與選項(xiàng)'--source'指定源端表為相同表。--where指定通過WHERE條件語句指定需要?dú)w檔的數(shù)據(jù),該選項(xiàng)是必須指定的選項(xiàng)。不需要加上'WHERE'關(guān)鍵字,如果確實(shí)不需要WHERE條件進(jìn)行限制,則指定'--where 1=1'。--file指定表數(shù)據(jù)需要?dú)w檔到的文件。使用類似MySQL DATE_FORMAT()格式化命名方式。文件內(nèi)容與MySQL中SELECT INTO OUTFILE語句使用相同的格式,文件命名選項(xiàng)如下所示:'%Y:年,4位數(shù)(Year, numeric, four digits) %m:月,2位數(shù)(Month, numeric (01..12)) %d:日,2位數(shù)(Day of the month, numeric (01..31)) %H:小時(shí)(Hour (00..23)) %i:分鐘(Minutes, numeric (00..59)) %s:秒(Seconds (00..59)) %D:數(shù)據(jù)庫名(Database name) %t:表名(Table name) 例如:--file '/var/log/archive/%Y-%m-%d-%D.%t''--output-format指定選項(xiàng)'--file'文件內(nèi)容輸出的格式。默認(rèn)不指定該選項(xiàng)是以制表符進(jìn)行字段的分隔符,如果指定該選項(xiàng),則使用','(逗號(hào))作為字段分隔符,使用'"'(雙引號(hào))將字段括起。用法示例:'--output-format=dump'。--for-update指定為每次歸檔執(zhí)行的SELECT語句添加FOR UPDATE子句。--share-lock指定為每次歸檔執(zhí)行的SELECT語句添加LOCK IN SHARE MODE子句。--header指定在文件中第一行寫入字段名稱作為標(biāo)題。--ignore指定為INSERT語句添加IGNORE選項(xiàng)。--limit默認(rèn)值:1指定每條語句獲取表和歸檔表的行數(shù)。--local指定不將OPTIMIZE和ANALYZE語句寫入binlog。--max-lag默認(rèn)值:1s指定允許主從復(fù)制延遲時(shí)長的最大值,單位秒。如果在每次獲取行數(shù)據(jù)之后主從延遲超過指定的值,則歸檔操作將暫停執(zhí)行,暫停休眠時(shí)間為選項(xiàng)'--check-interval'指定的值。待休眠時(shí)間結(jié)束之后再次檢查主從延遲時(shí)長,檢查方法是通過從庫查詢的'Seconds_Behind_Master'值來確定。如果主從復(fù)制延遲一直大于該參數(shù)指定值或者從庫停止復(fù)制,則操作將一直等待直到從庫重新啟動(dòng)并且延遲小于該參數(shù)指定值。--no-delete指定不刪除已被歸檔的表數(shù)據(jù)。--optimize指定工具完成數(shù)據(jù)歸檔后對表執(zhí)行'OPTIMIZE TABLE'操作。指定方法如'--analyze=ds',s代表源端表,d代表目標(biāo)端表,也可以單獨(dú)指定。--primary-key-only指定只歸檔主鍵字段,是選項(xiàng)'--columns=主鍵'的簡寫。如果工具歸檔的操作是進(jìn)行DELETE清除時(shí)最有效,因?yàn)橹恍枳x取主鍵一個(gè)字段而無需讀取行所有字段。--progress指定每多少行打印進(jìn)度信息,打印當(dāng)前時(shí)間,已用時(shí)間以及多少行進(jìn)行歸檔。--purge指定執(zhí)行的清除操作而不是歸檔操作。允許忽略選項(xiàng)'--dest'和'--file'進(jìn)行操作,如果只是清除操作可以結(jié)合選項(xiàng)'--primary-key-only'會(huì)更高效。--quiet,-q指定工具靜默執(zhí)行,不輸出任何的執(zhí)行信息。--replace指定寫入選項(xiàng)'--dest'指定目標(biāo)端表時(shí)改寫INSERT語句為REPLACE語句。--retries默認(rèn)值:1指定歸檔操作遇到死鎖或超時(shí)的重試次數(shù)。當(dāng)重試次數(shù)超過該選項(xiàng)指定的值時(shí),工具將報(bào)錯(cuò)退出。--run-time指定工具歸檔操作在退出之前需要運(yùn)行的時(shí)間。允許的時(shí)間后綴名為s=秒,m=分,h=小時(shí),d=天,如果沒指定,默認(rèn)為s。--[no]safe-auto-increment默認(rèn)值:yes指定不使用自增列(AUTO_INCREMENT)最大值對應(yīng)的行進(jìn)行歸檔。該選項(xiàng)在進(jìn)行歸檔清除時(shí)會(huì)額外添加一條WHERE子句以防止工具刪除單列升序字段具有的具有AUTO_INCREMENT屬性最大值的數(shù)據(jù)行,為了在數(shù)據(jù)庫重啟之后還能使用到AUTO_INCREMENT對應(yīng)的值,但這會(huì)引起無法歸檔或清除字段對應(yīng)最大值的行。--set-vars默認(rèn): wait_timeout=10000 innodb_lock_wait_timeout=1 lock_wait_timeout=60工具歸檔時(shí)指定參數(shù)值,如有多個(gè)用','(逗號(hào))分隔。如'--set-vars=wait_timeout=5000'。--skip-foreign-key-checks指定使用語句SET FOREIGN_KEY_CHECKS = 0禁用外鍵檢查。--sleep指定工具在通過SELECT語句獲取歸檔數(shù)據(jù)需要休眠的時(shí)間,默認(rèn)值是不進(jìn)行休眠。在休眠之前事務(wù)并不會(huì)提交,并且選項(xiàng)'--file'指定的文件不會(huì)被刷新。如果指定選項(xiàng)'--commit-each',則在休眠之前會(huì)進(jìn)行事務(wù)提交和文件刷新。--statistics指定工具收集并打印操作的時(shí)間統(tǒng)計(jì)信息。統(tǒng)計(jì)信息示例如下:'Started at 2008-07-18T07:18:53, ended at 2008-07-18T07:18:53Source: D=db,t=tableSELECT 4INSERT 4DELETE 4Action Count Time Pctcommit 10 0.1079 88.27select 5 0.0047 3.87deleting 4 0.0028 2.29inserting 4 0.0028 2.28other 0 0.0040 3.29'--txn-size默認(rèn):1指定每個(gè)事務(wù)處理的行數(shù)。如果是0則禁用事務(wù)功能。--version顯示工具的版本并退出。--[no]version-check默認(rèn)值:yes檢查Percona Toolkit、MySQL和其他程序的最新版本。--why-quit指定工具打印當(dāng)非因完成歸檔行數(shù)退出的原因。在執(zhí)行一個(gè)自動(dòng)歸檔任務(wù)時(shí)該選項(xiàng)與選項(xiàng)'--run-time'一起使用非常方便,這樣可以確定歸檔任務(wù)是否在指定的時(shí)間內(nèi)完成。如果同時(shí)指定了選項(xiàng)'--statistics',則會(huì)打印所有退出的原因。二、原理解析
根據(jù)general log的輸出,我們整理出時(shí)序表格如下
三、其他說明
咋一看這個(gè)過程貌似也沒有什么問題,但是,假如在原表掃描出數(shù)據(jù),插入到新表的過程中,舊數(shù)據(jù)發(fā)生了變化怎么辦?
帶著這個(gè)疑問,我們進(jìn)行了源碼的跟蹤,我們在pt-archiver的6839行打上了斷點(diǎn)
然后我分別在幾個(gè)session窗口做了如下動(dòng)作
最后pt-archiver輸出如下:
# A software update is available:TIME ELAPSED COUNT2020-04-08T09:13:21 0 02020-04-08T09:13:21 0 1Started at 2020-04-08T09:13:21, ended at 2020-04-08T09:13:51Source: A=utf8mb4,D=xucl,P=3306,h=127.0.0.1,p=...,t=t1,u=xuclDest: A=utf8mb4,D=xucl_archive,P=3306,h=127.0.0.1,p=...,t=t1,u=xuclSELECT 1INSERT 1DELETE 1Action Count Time Pctsleep 1 30.0002 99.89inserting 1 0.0213 0.07commit 2 0.0080 0.03select 2 0.0017 0.01deleting 1 0.0005 0.00other 0 0.0008 0.00很明顯,id=3這條記錄并沒有進(jìn)行歸檔(我們這里是改了條件列,實(shí)際生產(chǎn)中可能是更改了其他列,造成歸檔數(shù)據(jù)不準(zhǔn)確)
那么如何來解決這種情況的發(fā)生呢?
顯然,數(shù)據(jù)庫在數(shù)據(jù)庫中可以通過加排它鎖來防止其他程序修改對應(yīng)的數(shù)據(jù),pt-archiver其實(shí)早就已經(jīng)幫我們考慮到了這樣的情況,pt-archiver提供了兩種選擇
--for-update:Adds the FOR UPDATE modifier to SELECT statements
--share-lock:Adds the LOCK IN SHARE MODE modifier to SELECT statements
四、總結(jié)
pt-archiver作為歸檔工具無疑是MySQL DBA日常運(yùn)維的大利器之一,在使用過程中在知道如何使用的基礎(chǔ)上也能夠知曉其原理
歸檔過程中最好能對歸檔記錄進(jìn)行加鎖操作,以免造成歸檔數(shù)據(jù)不準(zhǔn)確
在主從環(huán)境中,歸檔過程最好控制速度,以免造成主從延遲
盡量控制好chunk的大小,不要過大,造成大事務(wù)
五、附錄
不會(huì)perl打斷點(diǎn)調(diào)試,網(wǎng)上找了一些打斷點(diǎn)的技巧,在這里記錄一下
perl -d filename
這句是進(jìn)入perl的調(diào)試命令
然后屏幕上會(huì)出現(xiàn)如下字樣:
Enter h or `h h' for help, or `man perldebug' for more help.
main::(filename:linenumber)
linenumber: content;
DB<1>
filename即所調(diào)試的文件名,linenumber顯示的是當(dāng)前調(diào)試語句的行號(hào),content也即當(dāng)前調(diào)試的語句,DB<1>后跟著黑色小方塊的光標(biāo)
1、此時(shí)可以輸入n,相當(dāng)于Visual Studio中的F10,進(jìn)入下一句的調(diào)試
2、如果想直接運(yùn)行到第N行語句,可以在第N行處設(shè)置一個(gè)斷點(diǎn):b N (將N替換為需要設(shè)置斷點(diǎn)的行
號(hào)),回車后斷點(diǎn)設(shè)置成功,可以輸入L來查看所設(shè)置的所有斷點(diǎn)情況,不想查看也可以直接輸入c,
回車后就直接運(yùn)行到設(shè)置斷點(diǎn)的語句處了
3、想要?jiǎng)h除斷點(diǎn)可以用 B N (將N替換為需要設(shè)置斷點(diǎn)的行號(hào)),回車后所在行處的斷點(diǎn)即被刪除,
也可以通過B *來刪除所有的斷點(diǎn)
4、想要查看變量的值,通過print 變量名 就可以查看了
5、也可以通過給變量賦值來直接改變調(diào)試中腳本里的變量的值,比如直接輸入:$debug = 0,這樣
$debug的值就被賦為0了
6、退出調(diào)試,只要輸入q即可
參考文章
《perl腳本的簡單調(diào)試方法》:
https://blog.csdn.net/wenwenxiong/article/details/47757715
《Percona-Toolkit 之 pt-archiver 總結(jié)》:
https://www.cnblogs.com/dbabd/p/10721857.html#_label11
總結(jié)
以上是生活随笔為你收集整理的easy excel date 类型解析报错_ptarchiver原理解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想美国高管谈笔记本市场竞争:不相信所谓
- 下一篇: 谷歌母公司 Alphabet 旗下 Ve