備份指令碼

*一炁化三清*發表於2024-07-09

1.Oracle RMAN備份

1.1 建立目錄

 [oracle@OEL7 ~]$ mkdir -p /u01/dbbak/script
 [oracle@OEL7 ~]$ cd /u01/dbbak
 [oracle@OEL7 ~]$ chown -R oracle:oinstall script

 [oracle@OEL7 ~]$ mkdir -p /u01/dbbak/db
 [oracle@OEL7 ~]$ mkdir -p /u01/dbbak/arch
 [oracle@OEL7 ~]$ cd /u01/dbbak
 [oracle@OEL7 ~]$ chown -R oracle:oinstall db
 [oracle@OEL7 ~]$ chown -R oracle:oinstall arch

1.2 編輯指令碼

[oracle@OEL7 ~]$ vi /u01/dbbak/script/rman_full.sh

export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export ORACLE_SID=prod
dt=`date '+%Y%m%d_%H%M%S'`
/u01/app/oracle/product/19.3.0/dbhome_1/bin/rman target / cmdfile=/u01/dbbak/script/backup.sh log=/u01/dbbak/log/log_$dt.log append
[oracle@OEL7 ~]$ vi /u01/dbbak/script/backup.sh

run{
allocate channel c1 type disk;   
allocate channel c2 type disk;   
allocate channel c3 type disk;
allocate channel c4 type disk;
backup as compressed backupset database format '/u01/dbbak/db/DB%U.bkp' plus archivelog format '/u01/dbbak/arch/ARCH%U.bkp' delete all input;
release channel c1;  
release channel c2;  
release channel c3;
release channel c4;
report obsolete;
crosscheck copy;
crosscheck archivelog all;
delete noprompt obsolete;
crosscheck backup;
delete noprompt expired backup;
}
quit;
EOF

1.3 指令碼授權

[oracle@OEL7 ~]$ chmod 775 /u01/dbbak/script/backup.sh
[oracle@OEL7 ~]$ chmod 775 /u01/dbbak/script/rman_full.sh

1.4 執行指令碼

/u01/dbbak/script/rman_full.sh

1.5 定時任務

crontab -e 為編輯視窗

[oracle@OEL7 ~]$ crontab -l
0 2 * * * /u01/dbbak/script/rman_full.sh

1.6 備份刪除

[oracle@OEL7 ~]$ rman target /

RMAN> show all;
--備份策略調整,備份保留7天
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;

2.Oracle邏輯備份

2.1 生成目錄

[oracle@OEL7 ~]$ mkdir -p /home/oracle/backup/dump
[oracle@OEL7 ~]$ mkdir -p /home/oracle/backup/tars

#使用expdp時需要先指定轉儲檔案和日誌檔案所在的目錄,可以透過如下命令實現
SQL> CREATE OR REPLACE DIRECTORY scott_backup as '/home/oracle/backup/dump';
SQL> grant read,write on directory scott_backup to public; 

2.2 備份指令碼

[oracle@OEL7 ~]$ vi /home/oracle/backup/exp_backup.sh

#!/bin/bash
#Oracle 環境變數
NLS_LANG=AMERICAN_AMERICA.AL32UTF8
ORACLE_SID=prod
ORACLE_BASE=/opt/oracle
ORACLE_HOME=/opt/oracle/11g
PATH=$PATH:$ORACLE_HOME/bin:$HOME/bin
export ORACLE_SID ORACLE_BASE ORACLE_HOME NLS_LANG PATH

#獲取時間戳
#dump生成時間
export BAKUPTIME=`date +%Y%m%d%H%M%S`
#壓縮檔案存放目錄
export DATA_DIR=/home/oracle/backup/dump
export TAR_DIR=/home/oracle/backup/tars
cd $DATA_DIR     
echo "Starting bakup..."
echo "Bakup file path $DATA_DIR/scott_expdp_$BAKUPTIME.dmp"
#parallel=4 為並行度,對於備份大資料庫有助於減少備份時間,但會增加CPU負載。
expdp scott/tiger directory=scott_backup dumpfile=scott_expdp_$BAKUPTIME.dump logfile=scott_expdp_$BAKUPTIME.log parallel=4
echo "Starting tar..."
echo "Tar file path $TAR_DIR/SCOTT_$BAKUPTIME.tar.gz"
tar -zcvf $TAR_DIR/scott_expdp_$BAKUPTIME.tar.gz scott_expdp*
echo "Bakup job is done!"
#歷史dump檔案保留7天
find  $DATA_DIR -type f -mtime +7 -exec rm -rf {} \;

2.3 定時任務

crontab -e 為編輯視窗

[oracle@OEL7 ~]$ crontab -l
0 3 * * * /home/oracle/backup/exp_backup.sh

3.MySQL邏輯全|增備份
mysqldump備份和恢復無需關閉資料庫
需要恢復上次完全備份及完全備份之後所有的增量備份才能恢復,而且要對所有增量備份進行逐個反推恢復。

3.1 開啟binlog日誌

binlog日誌預設不開啟,修改引數後重啟MySQL資料庫
mysql> show variables like '%log_bin%';

# vim /etc/my.cnf
log_bin=ON
log_bin_basename=/home/mysql/mysql-bin
log_bin_index=/home/mysql/mysql-bin.index
## 引數說明
log_bin:開啟binlog日誌檔案,預設值為OFF。
log_bin_basename:binlog日誌的基本檔名。MySQL會在該檔名後追加標識來表示每一個binlog檔案。
log_bin_index:binlog檔案的索引檔案,管理所有的binlog檔案。

3.2 全備指令碼

# mkdir -p /home/mysql/daily
# mkdir -p /home/mysql/backup
# vi /home/mysql/Mysql-FullyBak.sh

#mysqldump to Fully backup mysql data per week!
source /etc/profile
BakDir=/home/mysql/backup
LogFile=/home/mysql/backup/bak.log
Date=`date +%Y%m%d`
Begin=`date +"%Y年%m月%d日 %H:%M:%S"`
cd $BakDir
DumpFile=$Date.sql
GZDumpFile=$Date.sql.tgz
/usr/bin/mysqldump -uroot -proot --quick --events --databases wmp --flush-logs --delete-master-logs --single-transaction >$DumpFile
/bin/tar -zvcf $GZDumpFile $DumpFile
/bin/rm $DumpFile
oldDate=`date -d '7 days ago' +%Y%m%d`
oldBakFile=${oldDate}".sql.tgz"
/bin/rm $oldBakFile
Last=`date +"%Y年%m月%d日 %H:%M:%S"`
echo 開始:$Begin 結束:$Last $GZDumpFile succ >> $LogFile
cd $BakDir/daily
/bin/rm -f *

3.3 增備指令碼

# vi /home/mysql/Mysql-DailyBak.sh
#use cp to bakup mysql data everyday!
source /etc/profile
BakDir=/home/mysql/backup/daily
BinDir=/home/mysql/mysql-bin
LogFile=/home/mysql/backup/bak.log
BinFile=/home/mysql/mysql-bin/mysql-bin.index
/usr/bin/mysqladmin -uroot -proot flush-logs
Counter=`wc -l $BinFile |awk '{print $1}'`  
#產生新的mysql-bin.00000*檔案
NextNum=0
#比對$Counter和¥NextNum這兩個值來確定檔案是不是最新的
for file in `cat $BinFile`
do
     base=`basename $file`
     #basename用於擷取mysql-bin.00000*檔名,去掉./mysql-bin.000005前面的./
     NextNum=`expr $NextNum + 1`
     if [[ $NextNum -eq $Counter ]]
     then
        echo $base skip! >> $LogFile
      else
        dest=$BakDir/$base
         if(test -e $dest)
        #test -e用於檢測目標檔案是否存在,存在就寫exist!到$LogFile去
         then
               echo $base exist! >> $LogFile
         else
                cp $BinDir/$base $BakDir
                echo $base copying >> $LogFile
          fi
fi
done

3.4 定時任務

在命令列輸入:
#crontab -e
新增相應的任務,wq存檔退出
#每個星期日凌晨3:00執行完全備份指令碼
0 3 * * 0 /bin/bash -x /home/mysql/Mysql-FullyBak.sh >/dev/null 2>&1
#週一到週六凌晨3:00做增量備份
0 3 * * 1-6 /bin/bash -x /home/mysql/Mysql-DailyBak.sh >/dev/null 2>&1

3.5 恢復步驟

3.6 mysql其它備份指令碼

#!/bin/bash

# 定義變數
DB_USER="root"
DB_PASS="password"
DB_NAME="database_name"
BACKUP_DIR="/db_backup/mysql"
REMOTE_SERVER="remote_server_address"
REMOTE_DIR="/db_backup/mysql"

# 建立備份目錄
if [ ! -d $BACKUP_DIR ]; then
  mkdir -p $BACKUP_DIR
fi

# 備份資料庫
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME > $BACKUP_DIR/$DB_NAME-$(date +%Y%m%d).sql

# 壓縮備份檔案
tar -czvf $BACKUP_DIR/$DB_NAME-$(date +%Y%m%d).tar.gz $BACKUP_DIR/$DB_NAME-$(date +%Y%m%d).sql

# 上傳備份檔案到遠端伺服器
scp $BACKUP_DIR/$DB_NAME-$(date +%Y%m%d).tar.gz $REMOTE_SERVER:$REMOTE_DIR

# 刪除過期備份檔案
find $BACKUP_DIR -type f -name "*.tar.gz" -mtime +15 -delete
vim mysql_backup.sh

#!/bin/bash
#完成資料庫的定時備份
#備份的路徑
BACKUP=/db_backup/backup/db
#當前的時間作為檔名
DATETIME=$(date +%Y_%m_%d_%H%M%S)
#可以輸出變數除錯
#echo ${DATETIME}
echo "==========開始備份==========="
echo "備份的路徑是 $BACKUP/$DATETIME.tar.gz"

#主機
HOST=localhost
#使用者名稱
DB_USER=root
#密碼
DB_PWD=root
#備份資料庫名
DATABASE=mysql
#建立備份的路徑
#如果備份的路徑資料夾存在就使用,否則建立
[ ! -d "$BACKUP/$DATETIME"  ]  && mkdir -p "$BACKUP/$DATETIME" 
#執行mysql的備份資料庫的指令
mysqldump -u${DB_USER} -p${DB_PWD} --host=$HOST  $DATABASE | gzip  > $BACKUP/$DATETIME/$DATETIME.sql.gz
#打包備份檔案
cd $BACKUP
tar -zcvf  $DATETIME.tar.gz  $DATETIME
#刪除臨時目錄
rm -rf  $BACKUP/$DATETIME

#刪除15天前的備份檔案(-exec rm -rf {} \是固定寫法,刪除查詢出來的資料)
find $BACKUP -mtime +15 -name  "*.tar.gz" -exec rm -rf {} \;
echo "==========備份完成==========="
vim mysql_backup.sh

#!/bin/bash
#全備方式,一般在從機上執行,適用於小中型mysql資料庫
#刪除15天以前備份

source /etc/profile        #載入系統環境變數
source ~/.bash_profile    #載入使用者環境變數
set -o nounset             #引用未初始化變數時退出
#set -o errexit            #執行shell命令遇到錯誤時退出

user="root"
password="root"
host="localhost"
port="13306"
#需備份的資料庫,陣列
db=("test")
#備份時加鎖方式,
#MyISAM為鎖表--lock-all-tables,
#InnoDB為鎖行--single-transaction
lock="--single-transaction"
mysql_path="/usr/local/mysql"
backup_path="${mysql_path}/backup"
date=$(date +%Y-%m-%d_%H-%M-%S)
day=15
backup_log="${mysql_path}/backup.log"

#建立備份目錄
if [ ! -e $backup_path ];then
    mkdir -p $backup_path
fi

#刪除以前備份
find $backup_path -type f -mtime +$day -exec rm -rf {} \; > /dev/null 2>&1

echo "開始備份資料庫:${db[*]}"

#備份並壓縮
backup_sql(){
    dbname=$1
    backup_name="${dbname}_${date}.sql"
    #-R備份儲存過程,函式,觸發器
    mysqldump -h $host -P $port -u $user -p$password $lock --default-character-set=utf8 --flush-logs -R $dbname > $backup_path/$backup_name    
    if [[ $? == 0 ]];then
        cd $backup_path
        tar zcpvf $backup_name.tar.gz $backup_name
        size=$(du $backup_name.tar.gz -sh | awk '{print $1}')
        rm -rf $backup_name
        echo "$date 備份 $dbname($size) 成功 "
    else
        cd $backup_path
        rm -rf $backup_name
        echo "$date 備份 $dbname 失敗 "
    fi
}

#迴圈備份
length=${#db[@]}
for (( i = 0; i < $length; i++ )); do
        backup_sql ${db[$i]} >> $backup_log 2>&1
done

echo "備份結束,結果檢視 $backup_log"
du $backup_path/*$date* -sh | awk '{print "檔案:" $2 ",大小:" $1}'

4.MySQL PXB全/增備份

Xtrabackup是一個開源的MySQL資料庫備份工具,由Percona公司開發和維護

4.1 備份指令碼

vi /home/mysql/scripts/backup.sh

#!/bin/bash

echo ""
START_TIME=`date`
echo "############## backup start at $START_TIME ##############"
echo ""
###you need install xtrabackup!###
# Set env
source /home/mysql/.bash_profile
which xtrabackup
# Database Info
DB_USER="root"
DB_PASS="jeames@123"
CONF="/data/mysqldb/conf/mysql.conf"
SOCKET="/data/mysqldb/socket/mysql.sock"
BAK_BASE="/db_bak/mysql_bak/mysql"
DATE=`date +%F`
YESTERDAY=`date +%F -d "-1 days"`
WEEK_DAY=`date +%w`
BAK_DIR=$BAK_BASE/$DATE-$WEEK_DAY
# Create Directory and backup
if [ "$WEEK_DAY" == "6"  ]; then
  xtrabackup --defaults-file=$CONF --socket=$SOCKET --backup --user=$DB_USER --password=$DB_PASS --target-dir=$BAK_DIR --compress
elif [ "$WEEK_DAY" == "0"  ]; then
  INCRE_BASE=$BAK_BASE/$YESTERDAY-6
  xtrabackup --defaults-file=$CONF --socket=$SOCKET --backup --user=$DB_USER --password=$DB_PASS --target-dir=$BAK_DIR --incremental-basedir=$INCRE_BASE --compress
else
  INCRE_BASE=$BAK_BASE/$YESTERDAY-$[WEEK_DAY-1]
  xtrabackup --defaults-file=$CONF --socket=$SOCKET --backup --user=$DB_USER --password=$DB_PASS --target-dir=$BAK_DIR --incremental-basedir=$INCRE_BASE --compress
fi
echo ""
END_TIME=`date`
echo "############## backup end at $END_TIME ##############"
echo ""

4.2 備份刪除

vi  /home/mysql/scripts/cleanup.sh
#!/bin/bash

echo ""
START_TIME=`date`
echo "############## clean up start at $START_TIME ##############"
echo ""

find /db_bak/mysql_bak/mysql -maxdepth 1 -type d -mtime +30
find /db_bak/mysql_bak/mysql -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;

echo ""
END_TIME=`date`
echo "############## clean up end at $END_TIME ##############"
echo ""

4.3 定時任務

執行指令碼
每天凌晨 4:10 分清理 30 天之前的備份,
每天 4:30 分使用 xtrabackup 進行備份,
注意只有週六是全備,其他時間均是增備。
#crontab -e
10 4 * * * /home/mysql/scripts/cleanup.sh >> /home/mysql/scripts/cleanup.log 2>&1
30 4 * * * /home/mysql/scripts/backup.sh >> /home/mysql/scripts/backup.log 2>&1

5.PostgreSQL邏輯備份

以下是一個用於定時備份 PostgreSQL 資料庫的示例指令碼。這個指令碼將使用 pg_dump 工具來建立資料庫備份,然後將備份檔案儲存到指定的目錄中,並可選擇保留最近一段時間內的備份檔案

5.1 備份指令碼

vi /data/script_name.sh 

#!/bin/bash
 
# PostgreSQL資料庫相關資訊
db_host="localhost"
db_port="5432"
db_name="database_name"
db_user="database_user"
db_password="database_password"
 
# 備份儲存目錄
backup_dir="/data/backup/folder"
 
# 保留備份的天數
retention_days=7
 
# 建立備份目錄
mkdir -p $backup_dir
 
# 備份檔名
backup_file="$backup_dir/backup_$(date +'%Y%m%d%H%M%S').sql"
 
# 執行備份
PGPASSWORD=$db_password 
pg_dump -h $db_host -p $db_port -U $db_user -F c -b -v -f "$backup_file" $db_name
 
if [ $? -eq 0 ]; then
    echo "資料庫備份成功: $backup_file"
 
    # 刪除舊的備份檔案
    find $backup_dir -name "backup_*.sql" -type f -mtime +$retention_days -exec rm -f {} \;
else
    echo "資料庫備份失敗."
fi

5.2 定時任務

在命令列輸入:
#crontab -e
#每天定時凌晨2點定時任務
0 2 * * * /data/script_name.sh

5.3 備份恢復

--恢復
drop database jmedb;
create database jmedb;;
psql --file=jmedb.sql   --先檢視可否有建立資料庫的語句 
psql --dbname=db2 --file=jmedb.sql   --先檢視可否有建立資料庫的語句

6.PostgreSQL物理備份

pg_rman是一個開源的PostgreSQL備份軟體,pg_rman跑的不是流複製協議,而是檔案複製,所以pg_rman必須和資料庫Server安裝在一起.

6.1 備份指令碼

#!/bin/bash

source /home/postgres/.bash_profile

DATE=`date +%Y%m%d`;
PG_HOME=/home/postgres
BACK_LOG=/home/postgres/log/pg_rman_${DATE}.log

#START BACKUP
echo "START BACKUP" > $BACK_LOG
#執行備份命令
pg_rman backup --backup-mode=full -B /rmanbk >> $BACK_LOG
#備份集校驗
pg_rman validate >> $BACK_LOG
#檢查備份是否成功
error_num=`pg_rman show | awk 'BEGIN{n=0}{if(NR > 3 && $8 != "OK")n++}END{print n}'`
if [ $error_num > 0 ];then
    message="Postgres 資料庫伺服器${hostname}在${DATE}備份失敗" 
    echo $message
fi
#清理無效備份集
pg_rman purge >> $BACK_LOG
echo "BACKUP  END" >> $BACK_LOG

6.2 備份恢復

--原地恢復,使用新的$PGDATA恢復
pg_ctl stop 
rm -rf /postgresql/pgdata/    
pg_rman restore -B /rmanbk

-- 檢查配置檔案是否有問題,若無問題則可以啟動PG
pg_ctl start

--檢驗資料是否正確
啟動PG後,會刪除recovery.signal檔案

7.openGauss備份
7.1 備份指令碼

vi /home/omm/backup.sh

# database dump shell
# you should change the GAUSSHOME GAUSSPORT GAUSSDATA DUMP_USER DUMP_PASSWORD
#!/bin/bash
source /etc/profile
source /home/omm/.bash_profile
export GAUSSHOME=/opt/gaussdb/app
export GAUSSPORT=26000
export GAUSSDATA=/gaussdb/data/dn1
export PATH=$PGHOME/bin:$PATH
DUMP_USER=ysla
DUMP_PASSWORD='jeames007@HW'
CUR_DATE=`date "+%Y-%m-%d-%H%M"`
dbnamelist=`cat db.txt`
 
#Loading DBLIST
gsql -p ${GAUSSPORT} postgres -c "select datname from pg_database where datname not in ('template1','template0','postgres')" -t | grep -v '^$' >db.txt
 
#save directory
SAVE_BASE_DIR="/gaussdb/dump_dir"
DAT_FILE_DIR="${SAVE_BASE_DIR}/${CUR_DATE}"
if [ -d ${DAT_FILE_DIR} ]
 then :
 else
 mkdir -p ${DAT_FILE_DIR}
fi
# The real backup step!
echo "`date "+%Y-%m-%d-%H%M"` begin backup db "
for dbname in ${dbnamelist}
do
gs_dump -E UTF8 ${dbname} -U ${DUMP_USER} -W ${DUMP_PASSWORD} -p ${GAUSSPORT} -F p -f ${DAT_FILE_DIR}/${dbname}_${CUR_DATE}.sql
gs_dumpall -l ${dbname} -U ${DUMP_USER} -W ${DUMP_PASSWORD} -p ${GAUSSPORT} -g -f ${DAT_FILE_DIR}/global_data_${dbname}_${CUR_DATE}.sql
done
tar -cjvf ${DAT_FILE_DIR}.tar.gz /${DAT_FILE_DIR} --remove-files
echo "`date "+%Y-%m-%d-%H%M"` end backup db "

7.2 定時任務

在命令列輸入:
#crontab -e
30 02 * * * sh /home/omm/backup.sh

7.3 備份清理

每天都進行備份,如果備份天數過多不清理,
可能使目錄打滿,因此需要新增備份清理策略
在命令列輸入:
#crontab -e
30 03 * * * find /gaussdb/dump_dir  -not -path '*/\.*' -mtime +30  -type f -name *.tar.gz -exec rm -rf {} \;"

轉載至
墨天輪
備份指令碼

相關文章