Shell腳本實現(xiàn)MySQL、Oracle、PostgreSQL數(shù)據(jù)庫備份
在工作中,生產環(huán)境數(shù)據(jù)庫備份的重要性和必要性是必不可少的。備份可以確保數(shù)據(jù)庫的安全性和業(yè)務連續(xù)性,有助于預防減少因硬件故障、人為錯誤或惡意攻擊等原因導致的意外數(shù)據(jù)丟失的風險。
那么今天,本文主要介紹MySQL、Oracle和PostgreSQL數(shù)據(jù)庫的備份腳本及恢復方法,可全面了解不同數(shù)據(jù)庫的備份和恢復方法。
一、MySQL 數(shù)據(jù)庫異地備份腳本
該腳本主要是用于在Linux系統(tǒng)上備份MySQL數(shù)據(jù)庫,自定義數(shù)據(jù)庫用戶名、密碼、IP 地址、遠程備份服務器 IP、本地備份路徑、遠程備份路徑、當前時間、7 天前的日期變量。
使用mkdir -p命令創(chuàng)建以當前日期為名的目錄,存放數(shù)據(jù)庫備份文件。
使用mysqldump命令備份所有數(shù)據(jù)庫,并將輸出重定向至mysql_backup_$DATE.sql文件中。
使用tar命令將備份文件壓縮為:.tar.gz格式的文件內,并附加日志到備份文件中,然后刪除原始的備份文件。
使用rm -rf命令刪除 7 天前的備份文件,刪除的是以 7 天前日期為名的目錄和目錄下的所有文件。
使用scp命令將本地備份文件傳到遠程備份服務器上。
#!/bin/bash
# Database info
DB_USER="root" # 數(shù)據(jù)庫備份用戶
DB_PASS="1Q!2W@3E#" # 備份用戶密碼
DB_HOST="192.168.1.100" # 數(shù)據(jù)庫 IP
DBBACK_IP="192.168.1.200" # 遠程備份服務器 IP
BCK_DIR="/bigdata/mysql" # 本地備份路徑
DBBACK_PATH=/bigdata/mysqlbackup # 遠程備份路徑
DATE=`date +%F` # 獲取當前時間
yestoday=$(date -d '-7 day' +%Y-%m-%d) # 取 7 天前的時間,格式為:2023-12-30,用于刪除備份文件取文件時間,該參數(shù)可自行調整
#BACK_NAME="db_$var.sql"
#TB_NAME=("" "" "" "" "") # 需要備份的表名
#create file
mkdir -p $BCK_DIR/$DATE # 創(chuàng)建本地備份日期目錄
echo "開始本地備份中..."
/usr/local/mysql/bin/mysqldump -u$DB_USER -p$DB_PASS -h$DB_HOST --all-databases > $BCK_DIR/$DATE/mysql_backup_$DATE.sql
cd $BCK_DIR/$DATE && tar -zcvf mysql_backup_$DATE.sql.tar.gz mysql_backup_$DATE.sql >>/$BCK_DIR/$DATE/$DATE.log && rm -fr mysql_backup_$DATE.sql
echo "$DATE db bakcup success!" >>/$BCK_DIR/$DATE/$DATE.log
echo "開始刪除 7 天前的數(shù)據(jù)庫備份文件..."
rm -rf $BCK_DIR/$yestoday
echo "7 天前的數(shù)據(jù)庫備份文件刪除完畢!"
echo "開始遠程備份中..."
scp -r $BCK_DIR/$DATE/mysql_backup_$DATE.sql.tar.gz root@$DBBACK_IP:$DBBACK_PATH
echo "遠程備份完畢!"
需要注意的是:遠程備份需要做免密,在MySQL數(shù)據(jù)庫所在服務器與需要遠程備份的服務器做免密,并進行ssh驗證登錄是否正常。
ssh-keygen cd ~/.ssh/ scp id_rsa.pub 目標主機IP:~/.ssh/authorized_keys
利用find命令查找mysqldump工具安裝路徑,并按實際路徑更改腳本中的參數(shù)。
find / -name mysqldump
給mysql_backup.sh腳本增加可執(zhí)行權限,并創(chuàng)建crontab定時任務。
chmod +x mysql_backup.sh crontab -e # MySQL 數(shù)據(jù)庫備份 0 3 * * 6 root sh /bigdata/mysql_backup.sh >> /bigdata/mysql_backup.log 2>&1 &
二、MySQL 數(shù)據(jù)庫的恢復
首先確保已安裝好MySQL數(shù)據(jù)庫
可使用以下語法命令從.sql文件中恢復MySQL數(shù)據(jù)庫
mysql -u [用戶名] -p [密碼] [數(shù)據(jù)庫名] < [備份文件名.sql]
三、Oracle 數(shù)據(jù)庫異地備份腳本
該腳本用來自動備份Oracle數(shù)據(jù)庫。首先,輸出一些提示信息,然后獲取當前時間,并設置日志文件路徑、備份日期時間、保留文件的日期時間、本地備份路徑、遠端備份路徑、Oracle 數(shù)據(jù)庫服務器本機 IP、遠端備份 IP、用戶名、密碼、告警郵箱變量。
腳本會檢查本地備份目錄路徑是否存在,如果不存在則創(chuàng)建定義的目錄。然后,使用 exp 命令進行Oracle數(shù)據(jù)庫的全量備份,并將備份文件保存在指定的本地備份目錄路徑中。
通過SSH連接到遠程備份服務器,檢查遠程備份目錄路徑是否存在,如果不存在則創(chuàng)建定義的路徑。然后刪除本地備份目錄路徑下兩星期前的備份文件,并通過SSH刪除遠程備份路徑下兩星期前的備份文件。
對當前備份文件進行壓縮,并通過SCP將壓縮后的備份文件傳輸?shù)竭h程備份服務器。最后,會根據(jù)備份和傳輸?shù)慕Y果發(fā)送相應的通知郵件。
#!/bin/bash
echo "開始執(zhí)行 Oracle 數(shù)據(jù)庫備份..."
echo "backup ing -------------------"
echo "時間:" nowtime
oraclelog=/opt/originbackup/oraclebackup.log # Oracle 日志查看位置
current_date=`date +%Y-%m-%d` # 當前執(zhí)行日期時間
nowtime=$(date +%F+%T) # 顯示當前時間,用于記錄腳本運行開始時間
seven_day_date=`date -d -7day '+%Y-%m-%d'` # 保留一星期前 dmp 文件時間
fourteen_day_date=`date -d -14day '+%Y-%m-%d'` # 保留兩星期前 dmp 文件時間
### 需修改參數(shù)部分 ###
dmpDir=/data/originbackup # 本地備份路徑
destination=/opt/backup/ # 遠端備份路徑
localhost_ip=192.168.1.111 # Oracle 本機 IP
backup_ip=192.168.1.110 # 遠端備份服務器 IP
oracle_user=oracle_db # Oracle 用戶名
oracle_password=4r$5t%6y^ # Oracle 密碼
mail=xxx@163.com,xxx@126.com # 告警郵箱
source /home/oracle/.bash_profile
### 判斷是否有目錄,沒有則創(chuàng)建目錄 ###
echo "---${current_date}--start dmp all-----"
if [ ! -d ${dmpDir} ];then
echo "${dmpDir} is not exists,try to create"
mkdir -p ${dmpDir}
fi
### 開始本地備份(exp 為 oracle 備份工具) ###
exp $oracle_user/$oracle_password@$localhost_ip:1521/orcl file=$dmpDir/$current_date.dmp full=y > /dev/null 2>&1
#touch $dmpDir/$current_date.dmp > /dev/null 2>&1
### 連接遠端備份 IP 判斷是否有目錄 ###
if [ $? -eq 0 ]
then
ssh $backup_ip ls $destination > /dev/null 2>&1
if [ $? -eq 0 ]
then
echo "$destination exist mkdir"
else
ssh $backup_ip mkdir -p $destination
echo "$destination mkdir success"
fi
### 本地刪除備份文件,保留兩個星期前的 ###
ssh $backup_ip ls $destination >> /tmp/linshi
while read myline
do
if [ ${myline} == ${seven_day_date}.dmp.gz -o ${myline} == ${fourteen_day_date}.dmp.gz ];then
echo "$myline.dmp persist success"
else
rm -rf `ls ${dmpDir}/*|grep -v ${current_date}|grep -v ${seven_day_date}| grep -v ${fourteen_day_date}`
ssh $backup_ip rm -rf `ls ${destination}/*| grep -v ${seven_day_date}| grep -v ${fourteen_day_date}` > /dev/null 2>&1
# ssh $backup_ip rm -rf `ls $destination/*| egrep -v '(${a}|$)'`
if [ $? -eq 0 ]
then
echo "Two weeks ago file delete success"
else
echo "Two weeks ago file delete fail"
echo $current_date | mail -s "$current_date oracle.dmp file delete faile" $mail # 保留兩星期前數(shù)據(jù),其他 dmp 文件刪除失敗
fi
fi
done < /tmp/linshi
rm -rf /tmp/linshi
else
echo "$current_date 文件備份失敗"
echo $current_date | mail -s "$current_date file backup fail $localhost_ip" $mail # 文件備份失敗
echo -e "-----end dmp all-----------------\n"
exit -1 # 終止后面的所有腳本執(zhí)行
fi
### 本地壓縮,將壓縮文件傳到遠端 IP ###
if [ -f $dmpDir/$current_date.dmp ]
then
gzip -q -r $dmpDir/$current_date.dmp $dmpDir
echo "compress success"
scp -r $dmpDir/$current_date.dmp.gz root@$backup_ip:$destination > /dev/null 2>&1
if [ $? -eq 0 ]
then
echo "backup_file transfer success"
else
echo "backup_file transfer fail"
echo $current_date | mail -s "$current_date oracle_dmp_file transfer fail $localhost_ip" $mail # dmp 文件傳遞失敗
fi
else
echo "backup_file not found"
if [ $? -eq 0 ]
then
#echo "backup_file found fail"
echo $current_date | mail -s "$current_date oracle_dmp_file not found $localhost_ip" $mail # dmp 文件未發(fā)現(xiàn)
fi
fi
echo -e "-----end dmp all-----------------\n"
同樣,異地備份免密是必不可少的一步,參考上述MySQL配置的免密步驟即可。
給oracle_backup.sh腳本增加可執(zhí)行權限,并在Linux的/etc/crontab文件中創(chuàng)建定時任務。
chmod +x oracle_backup.sh crontab -e # Oracle 數(shù)據(jù)庫備份 0 3 * * 6 root sh /opt/oracle_backup.sh >> /opt/oraclebackup.log
四、Oracle 數(shù)據(jù)庫的恢復
前提是oracle數(shù)據(jù)庫已經安裝好
然后,創(chuàng)建目錄 /opt/oracle/oraclebak 并將數(shù)據(jù)庫備份文件 oracle_db.dmp 復制到該目錄中。
mkdir -p /opt/oracle/oraclebak cp oracle_db.dmp /opt/oracle/oraclebak
授予 /opt/oracle/oraclebak 目錄權限給 oracle 用戶和 dba 組。
chown oracle:dba /opt/oracle/oraclebak
在數(shù)據(jù)庫中創(chuàng)建備份目錄,以便數(shù)據(jù)庫可以訪問備份文件。
create or replace directory oracle_exp as '/opt/oracle/oraclebak';
授予 oracle_db 用戶對備份目錄的讀寫權限。
grant read, write on directory oracle_exp to oracle_db;
最后,使用以下命令在數(shù)據(jù)庫服務器上切換到 oracle 用戶,并執(zhí)行數(shù)據(jù)庫恢復操作:
su - oracle impdp oracle_db/oracle_db@orcl SCHEMAS=oracle_db DUMPFILE=oracle_exp:oracle_db.dmp LOGFILE=oracle_exp:oracle_db.log
oracle_exp:備份路徑定義的目錄別名oracle_db/oracle_db@orcl:本地數(shù)據(jù)庫恢復的用戶名、密碼和數(shù)據(jù)庫 SIDSCHEMAS:指定要導入的表空間DUMPFILE:指定數(shù)據(jù)庫恢復文件LOGFILE:指定數(shù)據(jù)庫恢復日志
五、PostgreSQL 數(shù)據(jù)庫異地備份腳本
該腳本是備份PostgreSQL數(shù)據(jù)庫并將備份文件傳輸?shù)竭h端備份服務器上。首先,使用date命令獲取了今天的日期、當前時間點和 7 天前的日期,分別賦給了today、nowtime和yestoday變量。
定義了本機 IP 地址、遠端備份服務器 IP、PostgreSQL 數(shù)據(jù)庫的端口號、數(shù)據(jù)庫用戶名和密碼,分別賦給了host_ip、backup_ip、port_id、username和export PGPASSWORD變量。
指定了本地備份目錄和遠端備份目錄,分別賦給了dmpDir和destination變量。
使用pg_dumpall命令來備份整個PostgreSQL數(shù)據(jù)庫,并將備份文件保存在本地備份目錄中。備份完成后,對備份文件進行了壓縮。使用scp命令將壓縮后的備份文件傳輸?shù)竭h端備份服務器上的指定目錄。
最后,輸出備份和傳輸?shù)南嚓P信息,并結束腳本的執(zhí)行。
#!/bin/bash #Description:備份 PostgreSQL 數(shù)據(jù)庫必能壓縮成 gz 文件,最后刪除 3 天前的備份文件。 echo "開始執(zhí)行 PostgreSQL 數(shù)據(jù)庫的備份..." echo "backup ing..." today=$(date +%Y-%m-%d) # 今天的日期 nowtime=$(date +%F+%T) # 當前時間點 yestoday=$(date -d '-7 day' +%Y-%m-%d) # 7天前的日期 host_ip=127.0.0.1 # 本機 IP 地址 backup_ip=192.168.1.111 # 遠端備份服務器 IP port_id=5432 # 端口號,PostgreSQL默認的端口號是5432 username=postgres # 數(shù)據(jù)庫用戶 export PGPASSWORD=7u&8i*9o( # 數(shù)據(jù)庫密碼 dmpDir=/opt/pgbak # 本地備份目錄 destination=/bigdata/pg_backup # 遠端備份目錄 echo "時間:" $nowtime set timeout 600 #/monchickey/bin/ 為 pg_dump 備份工具安裝路徑,根據(jù)實際情況更新此路徑。 /monchickey/bin/pg_dumpall --file ""$dmpDir"/pg_backup_"$today".sql" --host "$host_ip" --port "$port_id" --username "$username" #--verbose --role "postgres" --format=c --blobs --encoding "UTF8" 備份轉換擴展配置 echo "PostgreSQL 數(shù)據(jù)庫備份完成!" echo "當天備份文件壓縮中..." gzip "$dmpDir"/pg_backup_"$today".sql.gz ; echo "7 天前的 PostgreSQL 數(shù)據(jù)庫備份文件已刪除!" echo "開始遠端備份..." scp -r $dmpDir"/pg_backup_"$today".sql.gz root@backup_ip:destination echo "遠端備份完畢,感謝您使用此腳本!" exit;
利用find查找pg_dumpall工具安裝路徑,并修改腳本中的參數(shù)。
find / -name pg_dumpall
給pg_dump_backup.sh腳本增加可執(zhí)行權限,并在Linux的/etc/crontab文件中創(chuàng)建定時任務。
chmod +x pg_dump_backup.sh crontab -e # PostgreSQL 數(shù)據(jù)庫備份 0 3 * * 6 root sh /home/postgres/pg_dump_backup.sh >> /home/postgres/postgres_backup.log 2>&1 &
六、PostgreSQL 數(shù)據(jù)庫的恢復
使用pg_restore命令將備份文件恢復到新數(shù)據(jù)庫中,需確保已創(chuàng)建目標數(shù)據(jù)庫。
首先,確保已經登錄到擁有足夠權限的數(shù)據(jù)庫用戶賬號。然后,使用以下命令將備份文件恢復到新數(shù)據(jù)庫中:
pg_restore -U <username> -d <database_name> <backup_file_path>
<username>:具有足夠權限的數(shù)據(jù)庫用戶的用戶名<database_name>:將備份文件恢復到的目標數(shù)據(jù)庫的名稱<backup_file_path>:數(shù)據(jù)庫備份文件的完整路徑及文件名
輸入用戶密碼后,pg_restore將開始從備份文件中恢復數(shù)據(jù)庫。
最后,在分享個腳本,該腳本的作用主要是刪除指定目錄中7天前的數(shù)據(jù)庫備份文件。首先,是在終端中打印一條消息,告訴用戶腳本開始刪除 7 天前的數(shù)據(jù)庫備份文件。
然后,執(zhí)行find /home/postgresql_backup/ -name "*sql" -mtime +7 -exec rm -rf {} \;命令,這行命令實際上是執(zhí)行刪除操作。讓我來解釋一下這個命令:
find:是一個用于在指定目錄中查找文件的命令/home/postgresql_backup/:要查找的目錄-name "*sql":查找以.sql結尾的文件-mtime +7:查找修改時間在 7 天之前的文件-exec rm -rf {} \;:對查找到的文件執(zhí)行rm -rf命令,{}會被替換為實際的文件名。
最后,在終端中打印一條消息,告訴用戶 7 天前的數(shù)據(jù)庫備份文件已經刪除完畢!
#!/bin/bash
echo "開始刪除 7 天前的 數(shù)據(jù)庫備份文件..."
find /home/postgresql_backup/ -name "*sql" -mtime +7 -exec rm -rf {} \;
set timeout 1000
echo " 7 天前的數(shù)據(jù)庫備份文件刪除完畢!"到此這篇關于Shell腳本實現(xiàn)MySQL、Oracle、PostgreSQL數(shù)據(jù)庫備份的文章就介紹到這了,更多相關Shell數(shù)據(jù)庫備份內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

