我的PG數據庫備份優化之路

      網友投稿 1246 2025-04-01

      1 背景


      今天和大家聊一聊一段經歷,之前待在傳統ERP行業,由于涉及到出海的業務, 且國外的開發者對PG比較傾向,所以選擇PG作為后端的數據庫,并且在云上部署了應用和本地的數據庫。 雖然知道上云是大方向,但是由于上云時間上比較著急了些, 所以暫時將所有的服務都部署在了云上的虛擬機上,包括數據庫本身,說白了就是利用了云的虛擬化功能。PG采用了自建的部署方式,沒有利用云原生的數據庫服務。

      本身應用PG數據庫的數據量不大, 但是突然有天晚上會收到告警,連夜起來查看。剛打開電腦,連上VPN,又收到短信告警恢復。未理之,呼呼睡去。

      第二日,忘記查看此問題,結果夜里再次發生告警。

      第三日白天,查看PG所在服務的監控, 告警是對接的zabbix,內容為PG所在服務器磁盤容量超過80%。最先想到的是擴容磁盤。

      可是仔細查看后,發現磁盤大部分時間在40%左右,就只是在夜里飆升到80%,達到告警閾值產生告警。

      夜里究竟生了什么? 實在是百思不得其解。

      于是查看定時任務, crontab,發現是定時任務在為PG數據庫備份(pg_dump)的時候,?備份占用空間較大。才導致數據盤實際可用空間減半。

      2 備份流程分析

      當時使用的備份步驟如下:

      1.??pg_dump?導出數據文件?到?data目錄:/opt/data/pg_data/data。

      2.??自己的備份框架backupclient?壓縮打包?到?backup目錄:/opt/data/pg_data/backup。

      3.??備份框架將壓縮包上傳至backup server。

      注:?/opt/data/pg_data目錄為數據盤掛載點。

      雖然這里有壓縮,但是實際上是先備份,在壓縮,最后上傳服務器。原數據庫200G,備份文件200G,壓縮后的文件50G。?實際500G的盤,數據庫可用空間僅200G。超過200G就會磁盤空間不足告警。同時可能存在夜里備份期間由于空間滿導致數據庫不可用的情況。到這里就比較清晰了,實際上備份的200G空間完全可以省略,可以直接將源庫中的數據一次性備份為壓縮文件。我自己是SHELL控,所以直接想到忽略這個中間數據文件,?那就用SHELL管道的方式處理, pg_dump出來的內容不落盤,?直接輸出到壓縮包。說干就干,由于是線上系統,所以需要驗證下影響。

      3 管道壓縮驗證

      驗證目的:

      1. cpu?是否有影響?

      2.?內存?是否有影響?

      3.?臨時空間是否增加?

      4.?時間耗時比較。

      環境信息:

      CPU:?4核:

      processor???????:?3

      vendor_id???????:?GenuineIntel

      cpu?family??????:?6

      model???????????:?62

      model?name??????:?Intel(R)?Xeon(R)?CPU?E5-2690?v2?@?3.00GHz

      IO:?400?IOPS?寫

      MYHOST:~?#?dd?if=/dev/zero?of=/u04/test2?bs=4k?count=262144??oflag=direct

      我的PG數據庫備份優化之路

      262144+0?records?in

      262144+0?records?out

      1073741824?bytes?(1.1?GB)?copied,?737.527?s,?1.5?MB/s

      Device:????rrqm/s????wrqm/s????r/s????w/s????rsec/s????wsec/s????avgrq-sz????avgqu-sz????await????svctm????%util

      de??????????0.00??????1.00?????0.00??406.00???0.00????3408.00?????8.39????????1.01???????2.49?????2.44?????99.20

      MEM:?8GB

      數據量:

      MY_ERP=#?select?datname,pg_size_pretty(pg_database_size(oid))?from?pg_database?where?datname?not?in?($$TEMPLATE0$$,?$$TEMPLATE1$$)?order?by?pg_database_size(oid)?desc;

      DATNAME|PG_SIZE_PRETTY

      MY_ERP|14?GB

      Shared_buffers:?3GB

      3.1 正常備份時間分析

      1. 備份

      date;time?pg_dump??-p?6432?MY_ERP?-f?/u02/pg/MY_ERP.sql

      Tue?Jul??3?14:41:41?CST?2018

      pg_dump:?total?time:?369355??ms??##耗時369秒。

      real????6m9.426s

      user????0m13.985s

      sys?????0m22.757s

      第一次執行369s,又執行了一次,執行時間只有259秒,原因是緩存的影響,讀IO持續了40秒。

      第一次執行,主要是io,利用率100%,存在讀和寫。讀IO一直持續了6分鐘。

      Device:?????????rrqm/s???wrqm/s?????r/s?????w/s????rkB/s????wkB/s?avgrq-sz?avgqu-sz???await??svctm??%util

      de??????????????0.00?????0.00????451.00???603.00?37440.00?52848.00??85.66???162.01???157.04??0.95???100.00

      主要時間消耗為備份(Copy),cpu消耗50%左右。備份時的主要瓶頸在IO。

      PID????USER????PR????NI????VIRT????RES????SHR????S????%CPU????%MEM?????TIME+????COMMAND

      103743??pga????20????0?????3209m???3.0g???3.0g???R?????56?????39.2????1:28.55???pg:?PGA?MY_ERP?[local]?COPY

      備份完成之后的文件大小為12G:

      /dev/de2???????20G???13G??6.1G??68%?/u02?--?空間占用為數據庫備份文件12G。

      -rw-r--r--??1?pga?dbgrp?12717552237?Jul??3?14:47?/u02/pg/MY_ERP.sql

      2. 壓縮

      開始壓縮:

      MYHOST:/u02/pg?#?date;time?tar?zcvf??/u02/pg/MY_ERP.sql.tar.gz?/u02/pg/MY_ERP

      Mon?Jul??9?14:38:39?CST?2018

      /u02/pg/MY_ERP

      real????6m5.763s

      CPU情況:

      PID????USER????PR????NI????VIRT????RES????SHR????S????%CPU?????%MEM????TIME+????COMMAND

      93452??pga?????20????0?????12624???648????456????R?????80??????0.0????3:31.83????gzip

      3449???pga?????20????0?????13100???868????716????D?????6???????0.0????0:09.08????tar

      IO情況:

      Device:?????????rrqm/s???wrqm/s?????r/s?????w/s???rsec/s???wsec/s?avgrq-sz?avgqu-sz???await??svctm??%util

      de??????????????0.00?????13.00?????613.00??7.00??52224.00??160.00??84.49?????2.20?????3.55???0.42???26.00

      由此可知,壓縮時的主要瓶頸在CPU,壓縮后文件大小為2G,?壓縮比約為16%。壓縮比主要看數據的重復占比,現網大概20%左右。

      -rw-r--r--?1?pga?dbgrp?1993688791?Jul??3?15:14?/u02/pg/MY_ERP.sql.tar.gz

      總結一下正常備份時候的時間分布和空間占用情況:

      3.2?管道方式備份時間分析

      1. 備份和壓縮單個數據庫

      date;time?pg_dump?-p?6432?MY_ERP?|?gzip?>?/u02/pg/MY_ERP.gz

      Fri?Jul??6?15:18:04?CST?2018

      pg_dump:?total?time:?370992??ms??##耗時370秒,和正常備份時候的時間一致。

      real????6m12.337s

      CPU情況:

      PID??????USER??PR????NI????VIRT??????RES??????SHR??????S????%CPU????%MEM????TIME+????COMMAND

      53507????pga???20????0?????12624?????648??????456??????R?????93?????0.0????3:09.08???gzip

      53508????pga???20????0?????3209m?????3.0g?????3.0g?????S?????32?????39.1???1:20.21???pg:?PGA?MY_ERP?[local]?COPY

      IO情況:

      Device:?????????rrqm/s???wrqm/s?????r/s?????w/s???rsec/s???wsec/s?avgrq-sz?avgqu-sz???await??svctm??%util

      de??????????????0.00?????0.00?????408.00??547.00?34816.00?47920.00??86.63???158.94????169.81?1.05???100.00

      主要瓶頸在IO和CPU,此時CPU和IO都被充分利用。備份完成后包的大小,和正常備份再壓縮后基本一致:

      1993691949?Jul??6?15:24?MY_ERP.gz

      2.?所有文件打包

      由于單個數據庫備份,?所以需要把備份(gz)再次打包。

      time?tar?cvf?MY_ERP3.tar.gz?MY_ERP3.gz

      MY_ERP3.gz

      real????0m30.013s

      如果3個打包:

      -rw-r--r--?1?pga?dbgrp?1993691949?Jul??6?15:24?MY_ERP.gz

      -rw-r--r--?1?pga?dbgrp?1993691949?Jul??6?15:31?MY_ERP2.gz

      -rw-r--r--?1?root?????root??1993691949?Jul??6?15:51?MY_ERP3.gz

      MYHOST:/u02/pg?#?time?tar?cvf?MY_ERP.tar.gz?temp/*

      temp/MY_ERP.gz

      temp/MY_ERP2.gz

      temp/MY_ERP3.gz

      real????1m46.427s

      打包后大小基本不變:1993697280?Jul??9?15:33?MY_ERP3.tar.gz

      打包的主要瓶頸還是在IO方面,不涉及到壓縮算法,所以CPU占比不高。

      PID???USER??????PR???NI??VIRT???RES??SHR??S???%CPU??%MEM????TIME+????COMMAND

      43007?root??????20???0???13376??976??816??D???10????0.0?????0:08.90??tar

      Device:?????????rrqm/s???wrqm/s?????r/s?????w/s???rsec/s?????wsec/s?avgrq-sz?avgqu-sz???await??svctm??%util

      da??????????????0.00?????0.00???????0.00????1.00???0.00???????8.00????8.00?????0.01?????8.00???8.00???0.80

      de??????????????0.00?????4.00??????737.00?1493.00?62904.00?130600.00??86.77???167.80???76.84???0.49???110.00

      總結一下管道方式備份時候的時間分布和空間占用情況:

      3.3?正常恢復流程分析

      1. 解壓

      MYHOST:/u02/pg?#?time?tar?xzvf?MY_ERP.tar.gz

      MY_ERP

      real????2m51.733s

      2. 恢復

      通過psql直接恢復

      time?psql?-p?6432?MY_ERP?-f?/u02/pg/temp/MY_ERP

      total?time:?1725587??ms

      real????28m45.656s

      資源利用情況:

      Device:?????????rrqm/s???wrqm/s????r/s?????w/s????rsec/s???wsec/s????avgrq-sz?avgqu-sz???await????svctm??%util

      de??????????????0.00?????0.00??????144.00??981.00?12288.00?85648.00??87.05????143.28?????124.18???0.89???100.00

      PID???USER?????PR???NI??VIRT??RES??SHR??S???%CPU?%MEM????TIME+????COMMAND

      35271?pga??????20???0???3207m?1.5g?1.5g?R???86???19.6????5:15.21??pg:?PGA?MY_ERP?[local]?COPY

      76511?pga??????20???0???3205m?1.4g?1.4g?S???0????18.6????0:10.41??pg:?checkpointer?process

      數據庫日志顯示:

      10:19:33.271?CST]??pg?35271??LOG:??duration:?0.377?ms??statement:?COPY?AAA

      10:29:19.152?CST]??pg?35271??LOG:??duration:?103858.397?ms??statement:?COPY?BBB

      10:30:16.080?CST]??pg?35271??LOG:??duration:?0.276?ms??statement:?COPY?CCC

      10:30:16.184?CST]??pg?35271??LOG:??duration:?69.733?ms??statement:?ALTER?TABLE?ONLY?AAA?ADD?CONSTRAINT?AAA_PKEY?PRIMARY?KEY?(ID);

      10:42:27.009?CST]??pg?35271??LOG:??duration:?155173.931?ms??statement:?CREATE?INDEX?BBB_UUID?ON?BBB?USING?BTREE?(BBB_UUID);?(postgres.c:5427)

      10:48:11.067?CST]??pg?35271??LOG:??duration:?8.153?ms??statement:?ALTER?TABLE?ONLY?CCC?ADD?CONSTRAINT?CCC_BBB_UUID_FKEY?FOREIGN?KEY?(BBB_UUID)

      導入數據時間為11分鐘,?創建索引耗時18分鐘。總結:

      3.4?管道方式恢復流程分析

      1. 解壓:把管道備份的文件tar.gz先解壓為gz文件。

      MYHOST:/u02/pg/temp?#?time?tar?xvf?MY_ERP3.tar.gz

      MY_ERP3.gz

      real????0m19.327

      2. 恢復:通過psql管道方式直接恢復

      time?psql?-p?6432?MY_ERP?-f?/u02/pg/temp/MY_ERP

      total?time:?1725587??ms

      real????28m45.656s

      主要瓶頸在IO:

      Device:?????????rrqm/s???wrqm/s?????r/s?????w/s???rsec/s???wsec/s?avgrq-sz?avgqu-sz???await??svctm??%util

      de??????????????0.00?????0.00???24.00?2256.00??2048.00?197664.00????87.59???144.24???63.85???0.44?100.00

      數據庫日志顯示:

      11:03:42.184?CST]??pg?72035??LOG:??duration:?0.252?ms??statement:?COPY?AAA

      11:11:21.680?CST]??pg?72035??LOG:??duration:?84496.344?ms??statement:?COPY?BBB

      11:12:08.434?CST]??pg?72035??LOG:??duration:?0.160?ms??statement:?COPY?VOLUME_USAGE_CACHE

      11:27:48.790?CST]??pg?72035??LOG:??duration:?7.949?ms??statement:?ALTER?TABLE?ONLY?CCC

      導入數據時間為9分鐘,?創建索引耗時16分鐘。總結:

      4 初步優化總結

      數據庫大小14G的場景下:

      Pg_dump原始備份

      5 后記:還能再優化嗎?

      前段時間, 看見一朋友發了條朋友圈,說將自建的PG遷移到了華為云。于是突然也想研究一下大廠的備份方式,看下會不會也出現我這個在實例備份中遇到的問題。于是買了一個華為云的PG實例測試了一下。選的4U8G,高IO的規格,?17G的數據量大概在3分鐘左右備份完成。最后的備份數據文件大小為1GB左右。備份時間比以前快了5倍,備份文件比以前小了1倍。

      恢復的時長,17G大概在0.5分鐘左右。數據庫全庫恢復比我原來的邏輯方式快了30倍。看了下恢復的文件, 應該是基于物理備份的方式, 所以恢復時長較我原來的邏輯備份要短很多。

      而我最關心的是磁盤空間使用率, 我在華為RDS的監控上看到, 磁盤可用空間大小沒有變化。

      我猜測華為云RDS后端是不是又外掛了一個專門的存儲盤?疑問來了,?那是否還要單獨收費?趕緊查了下文檔說明,如下:

      可以猜測,如果是200G的數據盤, 后臺可能是掛了一個200G的備份盤(或者利用云原生的evs snapshot備份功能?),備份完畢之后,再將備份文件上傳,在刪除備份盤里面的臨時備份文件。而且目前看來, 如果有這部分備份空間,費用也是華為云為客戶買單的。

      另外還發現了一個“驚喜”,華為云PG還可以做增量的恢復, 能夠恢復到任意時間點。確實給我們省了不少心,哈哈。

      我預計在這個夏天的某個晚上,我們將通過華為的DRS服務將我們自己的pg順利遷移到華為云的pg上。

      這樣,?就再也不會在晚上收到數據盤空間不足的異常告警了。

      數據庫 數據庫 華為云數據庫 云備份

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:WPS文字添加超鏈接以后怎么取消下劃線?
      下一篇:WPS2019中PPT如何設置切換效果的快慢(wps快閃ppt怎么改速度)
      相關文章
      无码亚洲成a人在线观看| 久久精品国产亚洲精品| 亚洲AV综合色区无码一区| 亚洲AⅤ无码一区二区三区在线| 亚洲中文精品久久久久久不卡| 亚洲精品人成在线观看| 国产成人亚洲综合无码精品 | 亚洲桃色AV无码| 亚洲乳大丰满中文字幕| 亚洲日韩精品无码一区二区三区| 久久久亚洲精品蜜桃臀 | 亚洲一卡2卡4卡5卡6卡在线99 | 亚洲AV无码成H人在线观看 | 亚洲a级在线观看| 中文字幕亚洲男人的天堂网络| 中文字幕亚洲男人的天堂网络| 亚洲日韩精品无码专区加勒比| 亚洲成AV人片在WWW| 女bbbbxxxx另类亚洲| 亚洲精品国产V片在线观看| 亚洲日韩人妻第一页| 亚洲精品一品区二品区三品区| 国产AV无码专区亚洲Av| 亚洲视频在线观看一区| 亚洲精品福利在线观看| 亚洲一级视频在线观看| 在线综合亚洲中文精品| 亚洲精品乱码久久久久蜜桃| 亚洲日韩在线中文字幕综合| 亚洲精品和日本精品| 亚洲人成色7777在线观看| 亚洲国产综合91精品麻豆| 亚洲国产精品网站久久| 亚洲色精品三区二区一区| 国产成人亚洲精品91专区高清 | 亚洲依依成人精品| 亚洲GV天堂GV无码男同| 亚洲男人第一无码aⅴ网站 | 亚洲春色在线视频| 亚洲最大在线观看| 亚洲精品无AMM毛片|