資料庫定時備份linux篇

来源:https://www.cnblogs.com/xiezhr/archive/2023/05/12/17343589.html
-Advertisement-
Play Games

(資料庫定時備份linux篇) 1 序言 相信大家都還記得這則新聞吧,歐洲雲計算巨頭 OVH 位於法國斯特拉斯堡的機房發生嚴重火災,大火徹底摧毀了五層高、占地 500 平方米的 SBG2 數據中心。 當地報紙稱 115 位消防員投入 6 個小時才將其撲滅。經過長達 6 個小時的持續燃燒,SBG2 內 ...


目錄

1 序言

相信大家都還記得這則新聞吧,歐洲雲計算巨頭 OVH 位於法國斯特拉斯堡的機房發生嚴重火災,大火徹底摧毀了五層高、占地 500 平方米的 SBG2 數據中心。

當地報紙稱 115 位消防員投入 6 個小時才將其撲滅。經過長達 6 個小時的持續燃燒,SBG2 內的數據恐怕已經徹底丟失。

大火對歐洲範圍內的眾多網站造成嚴重影響。據 Netcraft 稱,目前跨 464000 個域的多達 360 萬個網站皆已下線。
在這裡插入圖片描述
在這裡插入圖片描述

數據是無價的,所以生產環境中定時備份資料庫顯得尤為重要。備份能防止伺服器故障和人為誤操作帶來的數據丟失。

生產環境中linux操作系統也是伺服器的首選,所以我們今天就以linux為例,說一說資料庫備份。

具體以什麼資料庫為例呢,就以這幾年工作中接觸到的幾種常見資料庫為例吧。

  • Oracle
  • mysql
  • postgresql
  • mongoDB

在這裡呢也給自己挖一個坑,工作中呢也用到winserver 作為伺服器的情況,所以呢後面也整理更新下winserver 環境下資料庫備份。

2 crond 相關知識點

2.1 crond 是什麼?

  • crond任務調度相當於我們日常生活中的鬧鐘。可以在某個時間點執行特定的命令和程式。
  • linux系統自身定期執行的任務工作:例如輪詢系統日誌、備份系統數據、清理系統緩存、殺毒等等
  • 用戶執行的工作任務:用戶通過設置任務調度,定時執行自己添加shell腳本或簡單的指令。例如每隔1分鐘和互聯網上時間伺服器同步,每天凌晨1點備份資料庫等等

2.2 crontab 進行定時任務設置

2.2.1 crontab 指令選項說明

語法:

crontab[-e|-l|-r]

-e:編輯crontab 定時任務
-l:查詢crontab定時任務
-r:刪除當前用戶所有的crontab定時任務

2.2.2 crontab 指令使用格式

crontab用戶的定時任務一般分為6段(空格分隔,系統的定時任務則/etc/crontab分為7段),其中前五段位時間設定段,第六段為所要執行的命令或腳本任務段。

①語法:

* * * * * cmd
①cmd為要執行的命令或腳本,例如/server/scripts/lee.sh
②每個段之間必須要有空格。

② crontab語法格式中時間段的含義表

在這裡插入圖片描述

含義 取值範圍
第一個“*” 一小時當中的第幾分鐘 0-59
第二個“*” 一天當中的第幾個小時 0-23
第三個“*” 一個月當中的第幾天 1-31
第四個“*” 一年當中的第幾個月 1-12
第五個“*” 一周當中的星期幾 0-7(0和7都代表周天)

③ crontab語法格式中特殊符號的含義表

特殊符號 含義
* "*" 表示任意時間都,就是“每”的意思,舉例:如00 01 * * * cmd 表示每月每周每日的凌晨1點執行cmd任務。
- "-" 表示分隔符,表示一個時間範圍段,如17-19點,每小時的00分執行任務。00 17-19 * * * cmd 表示17,18,19點整點分別執行的意思。
, "," 表示分隔時間段的意思。30 17,18,19 * * * cmd 表示每天17,18,19點的半點執行cmd 也可以和“-”結合使用,如: 30 3-5,17-19 * * * cmd 表示每天3、4、5和17、18、19 執行
/n n代表數字 即”每隔n單位時間”,例如:每10分鐘執行一次任務可以寫 */10 * * * * cmd,其中 /10,的範圍是0-59,也可以寫成0-59/10

2.2.3 特定時間執行任務例子

① 30 23 * * * cmd    表示每天23:30分執行cmd命令
② 40 22 * * 1 cmd    表示每周一22:40分執行cmd命令
③ 30 0 1-12 * * cmd  表示每月1號和12號 00:30執行cmd命令
④ 30 0 * * 1-5 cmd   表示每周一和周五00:30執行命令
⑤ */10 4 * * * cmd   表示每天4:00每隔10分鐘執行一次cmd命令

2.2.4 crontab 設置步驟

這裡我們以每5分鐘同步一次互聯網時間為例進行說明

① 查看crond服務是否啟動

/sbin/service crond status --查看crond服務是否啟動

[root@xiezhr /]# /sbin/service crond status
Redirecting to /bin/systemctl status crond.service
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2021-01-10 21:14:50 CST; 1 months 25 days ago
 Main PID: 990 (crond)
   CGroup: /system.slice/crond.service
           └─990 /usr/sbin/crond -n

Jan 25 14:00:01 xiezhr crond[990]: /usr/sbin/sendmail: error while loading shared librari...ory
Jan 25 14:30:02 xiezhr crond[990]: /usr/sbin/sendmail: error while loading shared librari...ory
Jan 25 15:00:02 xiezhr crond[990]: /usr/sbin/sendmail: error while loading shared librari...ory
Jan 25 15:30:01 xiezhr crond[990]: /usr/sbin/sendmail: error while loading shared librari...ory
Jan 25 16:00:01 xiezhr crond[990]: /usr/sbin/sendmail: error while loading shared librari...ory
Jan 25 16:24:01 xiezhr crond[990]: (*system*) RELOAD (/etc/cron.d/yunjing)
Jan 28 11:18:01 xiezhr crond[990]: (*system*) RELOAD (/etc/cron.d/sgagenttask)
Jan 28 11:18:01 xiezhr crond[990]: (root) RELOAD (/var/spool/cron/root)
Feb 07 12:03:01 xiezhr crond[990]: (*system*) RELOAD (/etc/cron.d/yunjing)
Feb 07 12:03:01 xiezhr crond[990]: (root) RELOAD (/var/spool/cron/root)
Hint: Some lines were ellipsized, use -l to show in full.

如果crond服務沒啟動則執行如下命令啟動crond服務

/sbin/service crond start          啟動服務

查看進程

[root@xiezhr /]# ps -ef|grep crond
root       990     1  0 Jan10 ?        00:00:22 /usr/sbin/crond -n
root     19552 15271  0 16:10 pts/1    00:00:00 grep --color=auto crond

② 編寫shell腳本

在home路徑下添加如下shell腳本

[root@xiezhr home]# vim /home/my.sh
/usr/sbin/ntpdate time.windows.com >/dev/null 2>&1

③ 給腳本增加執行許可權

[root@xiezhr home]# chmod u+x /home/my.sh 

④ 設置定時任務crontab

[root@xiezhr home]# crontab -e
*/5 * * * * /home/my.sh

在這裡插入圖片描述

3 各個資料庫備份腳本

3.1 Oracle資料庫

#!/bin/bash
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1;
export ORACLE_SID=orcl;
export PATH=$ORACLE_HOME/bin:/usr/sbin:$PATH;
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib;
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
#以上代碼為Oracle資料庫運行賬號oracle的系統環境變數設置,必須添加,否則crontab任務計劃不能執行。

date=date +%Y_%m_%d            #獲取系統當前日期時間
days=7                         #設置刪除7天之前的備份文件
orsid=192.168.1.100:1521/orcl  #Oracle資料庫伺服器IP、埠、SID
orowner=scott                  #備份此用戶下麵的數據
bakuser=system                 #用此用戶來執行備份,必須要有備份操作的許可權
bakpass=oracle                 #執行備註的用戶密碼
bakdir=/backup/oracledata      #備份文件路徑,需要提前創建好
bakdata=$orowner"_"$date.dmp   #備份資料庫名稱
baklog=$orowner"_"$date.log    #備份執行時候生成的日誌文件名稱
ordatabak=$orowner"_"$date.tar.gz #最後保存的Oracle資料庫備份文件

cd $bakdir                     #進入備份目錄
mkdir -p $orowner              #按需要備份的Oracle用戶創建目錄
cd $orowner                    #進入目錄
exp $bakuser/$bakpass@$orsid grants=y owner=$orowner file=$bakdir/$orowner/$bakdata log=$bakdir/$orowner/$baklog #執行備份
tar -zcvf $ordatabak $bakdata  $baklog                      #壓縮備份文件和日誌文件
find $bakdir/$orowner  -type f -name "*.log" -exec rm {} \; #刪除備份文件
find $bakdir/$orowner  -type f -name "*.dmp" -exec rm {} \; #刪除日誌文件
find $bakdir/$orowner  -type f -name "*.tar.gz" -mtime +$days -exec rm -rf {} \;  #刪除7天前的備份(註意:{} \中間有空格)

以上exp備份,如果要採用expd備份,只需將上面執行語句換成下麵的即可
expdp $bakuser/$bakpass@$orsid full=y cluster=n directory=$bakdir dumpfile=$bakdir/$orowner/$bakdata logfile=$bakdir/$orowner/$baklog 

3.2 Mysql資料庫

#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/local/mysql/bin
export PATH
dbuser='root'          #資料庫用戶名
dbpasswd='123456'      #資料庫密碼
dbname='test1 test2'   #資料庫名,可以定義多個資料庫,中間以空格隔開,如 test1 test2
backtime=`date +%Y%m%d%H%M%S`    #備份時間
logpath= '/home/mysql/backup'     #日誌備份路徑
datapath='/home/mysql/backup'     #數據備份路徑
echo "備份時間為${backtime},備份資料庫表 ${dbname} 開始" >> ${logpath}/mysqllog.log  #日誌記錄頭部

#正式備份資料庫
for table in $dbname; do  
source=`mysqldump -u ${dbuser} -p${dbpasswd} ${table}> ${logpath}/${backtime}.sql` 2>> ${logpath}/mysqllog.log;
#備份成功以下操作
if [ "$?" == 0 ];then 
cd $datapath
tar jcf ${table}${backtime}.tar.bz2 ${backtime}.sql > /dev/null   #為節約硬碟空間,將資料庫壓縮
rm -f ${datapath}/${backtime}.sql   #刪除原始文件,只留壓縮後文件
cd $datapath
rm -rf `find . -name '*.sql.gz' -mtime +30` >> ${logpath}/mysqllog.log 2>&1  #刪除30天前備份文件
echo "資料庫表 ${dbname} 備份成功!!" >> ${logpath}/mysqllog.log
else
echo “資料庫表 ${dbname} 備份失敗!!” >> ${logpath}/mysqllog.log   #備份失敗則進行以下操作
fi
done

3.3 postgresql資料庫

#!/bin/bash
pg_user ='postgres'
export NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss'
export exp_date=`date '+%Y%m%d'`
pg_dump  -U postgres dbpostgres -f /u01/backup/$exp_date.sql  
gzip -1 /u01/backup/$exp_date.sql       #壓縮備份文件
find /u01/backup -mtime +14 -exec rm {} \;   #刪除七天前備份文件

3.4 mongoDB資料庫

#!/bin/sh
DUMP=/home/webapp/Downloads/mongoDB/mongodbserver/bin/mongodump #mongodump備份文件執行路徑
OUT_DIR=/home/webapp/backup/mongo_bak/mongod_bak_now #臨時備份目錄
TAR_DIR=/home/webapp/backup/mongo_bak/mongod_bak_list #備份存放路徑
DATE=`date +%Y_%m_%d_%H_%M_%S` #獲取當前系統時間

DB_USER=XXXX#資料庫賬號
DB_PASS=XXXX #資料庫密碼
DB_NAME=TEST #資料庫名稱
IP=xx.xx.xx.xx:27017
DAYS=365 #DAYS=30代表刪除30天前的備份,即只保留最近30天的備份
TAR_BAK="mongod_bak_$DATE.tar.gz" #最終保存的資料庫備份文件名
cd $OUT_DIR
rm -rf $OUT_DIR
mkdir -p $OUT_DIR/$DATE
$DUMP -h $IP -u $DB_USER -p $DB_PASS -d $DB_NAME -o $OUT_DIR/$DATE #備份資料庫
tar -zcvf $TAR_DIR/$TAR_BAK $OUT_DIR/$DATE                         #壓縮為.tar.gz格式
find $TAR_DIR/ -mtime +$DAYS -delete                               #刪除30天前的備份

exit

4 定時備份資料庫實際操作

每天凌晨1點備份以上常見資料庫

① 創建備份腳本

在home路徑下創建backup.sh 並添加以上資料庫備份shell腳本

[root@xiezhr home]#  vim /home/bakcup/backup.sh
# 要備份那個資料庫,就往backup.sh 添加對應的shell腳本即可

③ 給腳本增加執行許可權

[root@xiezhr home]# chmod u+x /home/bakcup/backup.sh

③ 設置定時任務crontab

[root@xiezhr home]# crontab -e
0 1 * * * /home/bakcup/backup.sh

本期到此就結束了,下一期我們說一說winserver環境下資料庫備份。

敬請期待哦 (●'◡'●)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • I2C匯流排 | I2C匯流排介紹 I2C匯流排介紹 I2C(Inter - Intergrated Circuit)匯流排(也稱IIC或I2C)是由PHILIPS公司開發的兩線式串列匯流排,用於連接微控制器及其外圍設備,是微電子通行控制領域廣泛採用的一種匯流排標準。它是同步通信的一種特殊形式,具有介面少、控制 ...
  • 環境: 工具:Microsoft Edge Dev 系統版本:Windows 10 需求描述: 描述:需要正常游覽Flash頁面的所有內容,不能有缺少的動畫 提示: 本文章是最簡單的且直接的,若你的電腦不適合這個游覽器,可以看我另外一篇文章。https://www.cnblogs.com/boluo ...
  • 考前說明:所有項目運行過程中出現紅色字體的報錯信息是正常的,運行完成後看 “failed=0” 就代表執行成功,如果在執行任務期間暫停並且報錯那麼代表項目內部書寫格式或者命令輸入錯誤,請認真檢查 此文檔為考前模擬不代表真實考試環境及內容。 環境說明: | system | IP Address | ...
  • macOS系統中預設的C/C++編譯器是clang/clang++,命令行使用gcc/g++或者clang/clang++來執行命令時,都是調用clang/clang++編譯器,想使用gcc/g++編譯器的話,我們可以自己安裝。 查看一下gcc和clang 1. 安裝Homebrew,官網鏈接,複製 ...
  • 摘要:在實際使用過程中,資料庫集群級的故障並非高概率事件,如何安全高效地幫助客戶備份恢復一部分資料庫元素,才是更加實際的需求,這也是細粒度備份恢復的意義所在。 本文分享自華為雲社區《GaussDB(DWS)之物理細粒度備份恢復》,作者:我的橘子呢 。 1. 認識物理細粒度備份恢復 相對於集群級備份恢 ...
  • ACID :如果一個資料庫支持事務的操作,那麼該資料庫必須要具備以下四個特性 1、原子性(Atomicity) 事務包含的所有操作要麼全部成功,要麼全部失敗回滾,因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影響 2、一致性(Consistency) 事務必須使數據 ...
  • 這段時間,我們對產品本身以及客戶反饋的一些問題進行了持續的更新和優化,包括對離線平臺數據同步功能的更新,數據資產平臺血緣問題的優化等,力求滿足不同行業用戶的更多需求,為用戶帶來極致的產品使用體驗。 以下為袋鼠雲產品功能更新報告第五期內容,更多探索,請繼續閱讀。 離線開發平臺 1.支持工作流參數 背景 ...
  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 作者:Yejinrong/葉金榮 文章來源:GreatSQL社區原創 繼續吹MySQL 8.0~ 在以前,當需要對MySQL資料庫進行維護操作時,通常需 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...