Shell腳本實(shí)現(xiàn)MySQL、Oracle、PostgreSQL數(shù)據(jù)庫(kù)備份
在工作中,生產(chǎn)環(huán)境數(shù)據(jù)庫(kù)備份的重要性和必要性是必不可少的。備份可以確保數(shù)據(jù)庫(kù)的安全性和業(yè)務(wù)連續(xù)性,有助于預(yù)防減少因硬件故障、人為錯(cuò)誤或惡意攻擊等原因?qū)е碌囊馔鈹?shù)據(jù)丟失的風(fēng)險(xiǎn)。
那么今天,本文主要介紹MySQL、Oracle和PostgreSQL數(shù)據(jù)庫(kù)的備份腳本及恢復(fù)方法,可全面了解不同數(shù)據(jù)庫(kù)的備份和恢復(fù)方法。
一、MySQL 數(shù)據(jù)庫(kù)異地備份腳本
該腳本主要是用于在Linux系統(tǒng)上備份MySQL數(shù)據(jù)庫(kù),自定義數(shù)據(jù)庫(kù)用戶名、密碼、IP 地址、遠(yuǎn)程備份服務(wù)器 IP、本地備份路徑、遠(yuǎn)程備份路徑、當(dāng)前時(shí)間、7 天前的日期變量。
使用mkdir -p命令創(chuàng)建以當(dāng)前日期為名的目錄,存放數(shù)據(jù)庫(kù)備份文件。
使用mysqldump命令備份所有數(shù)據(jù)庫(kù),并將輸出重定向至mysql_backup_$DATE.sql文件中。
使用tar命令將備份文件壓縮為:.tar.gz格式的文件內(nèi),并附加日志到備份文件中,然后刪除原始的備份文件。
使用rm -rf命令刪除 7 天前的備份文件,刪除的是以 7 天前日期為名的目錄和目錄下的所有文件。
使用scp命令將本地備份文件傳到遠(yuǎn)程備份服務(wù)器上。
#!/bin/bash
# Database info
DB_USER="root" # 數(shù)據(jù)庫(kù)備份用戶
DB_PASS="1Q!2W@3E#" # 備份用戶密碼
DB_HOST="192.168.1.100" # 數(shù)據(jù)庫(kù) IP
DBBACK_IP="192.168.1.200" # 遠(yuǎn)程備份服務(wù)器 IP
BCK_DIR="/bigdata/mysql" # 本地備份路徑
DBBACK_PATH=/bigdata/mysqlbackup # 遠(yuǎn)程備份路徑
DATE=`date +%F` # 獲取當(dāng)前時(shí)間
yestoday=$(date -d '-7 day' +%Y-%m-%d) # 取 7 天前的時(shí)間,格式為:2023-12-30,用于刪除備份文件取文件時(shí)間,該參數(shù)可自行調(diào)整
#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ù)庫(kù)備份文件..."
rm -rf $BCK_DIR/$yestoday
echo "7 天前的數(shù)據(jù)庫(kù)備份文件刪除完畢!"
echo "開始遠(yuǎn)程備份中..."
scp -r $BCK_DIR/$DATE/mysql_backup_$DATE.sql.tar.gz root@$DBBACK_IP:$DBBACK_PATH
echo "遠(yuǎn)程備份完畢!"
需要注意的是:遠(yuǎn)程備份需要做免密,在MySQL數(shù)據(jù)庫(kù)所在服務(wù)器與需要遠(yuǎn)程備份的服務(wù)器做免密,并進(jìn)行ssh驗(yàn)證登錄是否正常。
ssh-keygen cd ~/.ssh/ scp id_rsa.pub 目標(biāo)主機(jī)IP:~/.ssh/authorized_keys
利用find命令查找mysqldump工具安裝路徑,并按實(shí)際路徑更改腳本中的參數(shù)。
find / -name mysqldump
給mysql_backup.sh腳本增加可執(zhí)行權(quán)限,并創(chuàng)建crontab定時(shí)任務(wù)。
chmod +x mysql_backup.sh crontab -e # MySQL 數(shù)據(jù)庫(kù)備份 0 3 * * 6 root sh /bigdata/mysql_backup.sh >> /bigdata/mysql_backup.log 2>&1 &
二、MySQL 數(shù)據(jù)庫(kù)的恢復(fù)
首先確保已安裝好MySQL數(shù)據(jù)庫(kù)
可使用以下語法命令從.sql文件中恢復(fù)MySQL數(shù)據(jù)庫(kù)
mysql -u [用戶名] -p [密碼] [數(shù)據(jù)庫(kù)名] < [備份文件名.sql]
三、Oracle 數(shù)據(jù)庫(kù)異地備份腳本
該腳本用來自動(dòng)備份Oracle數(shù)據(jù)庫(kù)。首先,輸出一些提示信息,然后獲取當(dāng)前時(shí)間,并設(shè)置日志文件路徑、備份日期時(shí)間、保留文件的日期時(shí)間、本地備份路徑、遠(yuǎn)端備份路徑、Oracle 數(shù)據(jù)庫(kù)服務(wù)器本機(jī) IP、遠(yuǎn)端備份 IP、用戶名、密碼、告警郵箱變量。
腳本會(huì)檢查本地備份目錄路徑是否存在,如果不存在則創(chuàng)建定義的目錄。然后,使用 exp 命令進(jìn)行Oracle數(shù)據(jù)庫(kù)的全量備份,并將備份文件保存在指定的本地備份目錄路徑中。
通過SSH連接到遠(yuǎn)程備份服務(wù)器,檢查遠(yuǎn)程備份目錄路徑是否存在,如果不存在則創(chuàng)建定義的路徑。然后刪除本地備份目錄路徑下兩星期前的備份文件,并通過SSH刪除遠(yuǎn)程備份路徑下兩星期前的備份文件。
對(duì)當(dāng)前備份文件進(jìn)行壓縮,并通過SCP將壓縮后的備份文件傳輸?shù)竭h(yuǎn)程備份服務(wù)器。最后,會(huì)根據(jù)備份和傳輸?shù)慕Y(jié)果發(fā)送相應(yīng)的通知郵件。
#!/bin/bash
echo "開始執(zhí)行 Oracle 數(shù)據(jù)庫(kù)備份..."
echo "backup ing -------------------"
echo "時(shí)間:" nowtime
oraclelog=/opt/originbackup/oraclebackup.log # Oracle 日志查看位置
current_date=`date +%Y-%m-%d` # 當(dāng)前執(zhí)行日期時(shí)間
nowtime=$(date +%F+%T) # 顯示當(dāng)前時(shí)間,用于記錄腳本運(yùn)行開始時(shí)間
seven_day_date=`date -d -7day '+%Y-%m-%d'` # 保留一星期前 dmp 文件時(shí)間
fourteen_day_date=`date -d -14day '+%Y-%m-%d'` # 保留兩星期前 dmp 文件時(shí)間
### 需修改參數(shù)部分 ###
dmpDir=/data/originbackup # 本地備份路徑
destination=/opt/backup/ # 遠(yuǎn)端備份路徑
localhost_ip=192.168.1.111 # Oracle 本機(jī) IP
backup_ip=192.168.1.110 # 遠(yuǎn)端備份服務(wù)器 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
### 連接遠(yuǎn)端備份 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
### 本地刪除備份文件,保留兩個(gè)星期前的 ###
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
### 本地壓縮,將壓縮文件傳到遠(yuǎn)端 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í)行權(quán)限,并在Linux的/etc/crontab文件中創(chuàng)建定時(shí)任務(wù)。
chmod +x oracle_backup.sh crontab -e # Oracle 數(shù)據(jù)庫(kù)備份 0 3 * * 6 root sh /opt/oracle_backup.sh >> /opt/oraclebackup.log
四、Oracle 數(shù)據(jù)庫(kù)的恢復(fù)
前提是oracle數(shù)據(jù)庫(kù)已經(jīng)安裝好
然后,創(chuàng)建目錄 /opt/oracle/oraclebak 并將數(shù)據(jù)庫(kù)備份文件 oracle_db.dmp 復(fù)制到該目錄中。
mkdir -p /opt/oracle/oraclebak cp oracle_db.dmp /opt/oracle/oraclebak
授予 /opt/oracle/oraclebak 目錄權(quán)限給 oracle 用戶和 dba 組。
chown oracle:dba /opt/oracle/oraclebak
在數(shù)據(jù)庫(kù)中創(chuàng)建備份目錄,以便數(shù)據(jù)庫(kù)可以訪問備份文件。
create or replace directory oracle_exp as '/opt/oracle/oraclebak';
授予 oracle_db 用戶對(duì)備份目錄的讀寫權(quán)限。
grant read, write on directory oracle_exp to oracle_db;
最后,使用以下命令在數(shù)據(jù)庫(kù)服務(wù)器上切換到 oracle 用戶,并執(zhí)行數(shù)據(jù)庫(kù)恢復(fù)操作:
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:本地?cái)?shù)據(jù)庫(kù)恢復(fù)的用戶名、密碼和數(shù)據(jù)庫(kù) SIDSCHEMAS:指定要導(dǎo)入的表空間DUMPFILE:指定數(shù)據(jù)庫(kù)恢復(fù)文件LOGFILE:指定數(shù)據(jù)庫(kù)恢復(fù)日志
五、PostgreSQL 數(shù)據(jù)庫(kù)異地備份腳本
該腳本是備份PostgreSQL數(shù)據(jù)庫(kù)并將備份文件傳輸?shù)竭h(yuǎn)端備份服務(wù)器上。首先,使用date命令獲取了今天的日期、當(dāng)前時(shí)間點(diǎn)和 7 天前的日期,分別賦給了today、nowtime和yestoday變量。
定義了本機(jī) IP 地址、遠(yuǎn)端備份服務(wù)器 IP、PostgreSQL 數(shù)據(jù)庫(kù)的端口號(hào)、數(shù)據(jù)庫(kù)用戶名和密碼,分別賦給了host_ip、backup_ip、port_id、username和export PGPASSWORD變量。
指定了本地備份目錄和遠(yuǎn)端備份目錄,分別賦給了dmpDir和destination變量。
使用pg_dumpall命令來備份整個(gè)PostgreSQL數(shù)據(jù)庫(kù),并將備份文件保存在本地備份目錄中。備份完成后,對(duì)備份文件進(jìn)行了壓縮。使用scp命令將壓縮后的備份文件傳輸?shù)竭h(yuǎn)端備份服務(wù)器上的指定目錄。
最后,輸出備份和傳輸?shù)南嚓P(guān)信息,并結(jié)束腳本的執(zhí)行。
#!/bin/bash #Description:備份 PostgreSQL 數(shù)據(jù)庫(kù)必能壓縮成 gz 文件,最后刪除 3 天前的備份文件。 echo "開始執(zhí)行 PostgreSQL 數(shù)據(jù)庫(kù)的備份..." echo "backup ing..." today=$(date +%Y-%m-%d) # 今天的日期 nowtime=$(date +%F+%T) # 當(dāng)前時(shí)間點(diǎn) yestoday=$(date -d '-7 day' +%Y-%m-%d) # 7天前的日期 host_ip=127.0.0.1 # 本機(jī) IP 地址 backup_ip=192.168.1.111 # 遠(yuǎn)端備份服務(wù)器 IP port_id=5432 # 端口號(hào),PostgreSQL默認(rèn)的端口號(hào)是5432 username=postgres # 數(shù)據(jù)庫(kù)用戶 export PGPASSWORD=7u&8i*9o( # 數(shù)據(jù)庫(kù)密碼 dmpDir=/opt/pgbak # 本地備份目錄 destination=/bigdata/pg_backup # 遠(yuǎn)端備份目錄 echo "時(shí)間:" $nowtime set timeout 600 #/monchickey/bin/ 為 pg_dump 備份工具安裝路徑,根據(jù)實(shí)際情況更新此路徑。 /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" 備份轉(zhuǎn)換擴(kuò)展配置 echo "PostgreSQL 數(shù)據(jù)庫(kù)備份完成!" echo "當(dāng)天備份文件壓縮中..." gzip "$dmpDir"/pg_backup_"$today".sql.gz ; echo "7 天前的 PostgreSQL 數(shù)據(jù)庫(kù)備份文件已刪除!" echo "開始遠(yuǎn)端備份..." scp -r $dmpDir"/pg_backup_"$today".sql.gz root@backup_ip:destination echo "遠(yuǎn)端備份完畢,感謝您使用此腳本!" exit;
利用find查找pg_dumpall工具安裝路徑,并修改腳本中的參數(shù)。
find / -name pg_dumpall
給pg_dump_backup.sh腳本增加可執(zhí)行權(quán)限,并在Linux的/etc/crontab文件中創(chuàng)建定時(shí)任務(wù)。
chmod +x pg_dump_backup.sh crontab -e # PostgreSQL 數(shù)據(jù)庫(kù)備份 0 3 * * 6 root sh /home/postgres/pg_dump_backup.sh >> /home/postgres/postgres_backup.log 2>&1 &
六、PostgreSQL 數(shù)據(jù)庫(kù)的恢復(fù)
使用pg_restore命令將備份文件恢復(fù)到新數(shù)據(jù)庫(kù)中,需確保已創(chuàng)建目標(biāo)數(shù)據(jù)庫(kù)。
首先,確保已經(jīng)登錄到擁有足夠權(quán)限的數(shù)據(jù)庫(kù)用戶賬號(hào)。然后,使用以下命令將備份文件恢復(fù)到新數(shù)據(jù)庫(kù)中:
pg_restore -U <username> -d <database_name> <backup_file_path>
<username>:具有足夠權(quán)限的數(shù)據(jù)庫(kù)用戶的用戶名<database_name>:將備份文件恢復(fù)到的目標(biāo)數(shù)據(jù)庫(kù)的名稱<backup_file_path>:數(shù)據(jù)庫(kù)備份文件的完整路徑及文件名
輸入用戶密碼后,pg_restore將開始從備份文件中恢復(fù)數(shù)據(jù)庫(kù)。
最后,在分享個(gè)腳本,該腳本的作用主要是刪除指定目錄中7天前的數(shù)據(jù)庫(kù)備份文件。首先,是在終端中打印一條消息,告訴用戶腳本開始刪除 7 天前的數(shù)據(jù)庫(kù)備份文件。
然后,執(zhí)行find /home/postgresql_backup/ -name "*sql" -mtime +7 -exec rm -rf {} \;命令,這行命令實(shí)際上是執(zhí)行刪除操作。讓我來解釋一下這個(gè)命令:
find:是一個(gè)用于在指定目錄中查找文件的命令/home/postgresql_backup/:要查找的目錄-name "*sql":查找以.sql結(jié)尾的文件-mtime +7:查找修改時(shí)間在 7 天之前的文件-exec rm -rf {} \;:對(duì)查找到的文件執(zhí)行rm -rf命令,{}會(huì)被替換為實(shí)際的文件名。
最后,在終端中打印一條消息,告訴用戶 7 天前的數(shù)據(jù)庫(kù)備份文件已經(jīng)刪除完畢!
#!/bin/bash
echo "開始刪除 7 天前的 數(shù)據(jù)庫(kù)備份文件..."
find /home/postgresql_backup/ -name "*sql" -mtime +7 -exec rm -rf {} \;
set timeout 1000
echo " 7 天前的數(shù)據(jù)庫(kù)備份文件刪除完畢!"到此這篇關(guān)于Shell腳本實(shí)現(xiàn)MySQL、Oracle、PostgreSQL數(shù)據(jù)庫(kù)備份的文章就介紹到這了,更多相關(guān)Shell數(shù)據(jù)庫(kù)備份內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux bc命令實(shí)現(xiàn)數(shù)學(xué)計(jì)算器
這篇文章主要介紹了Linux bc命令實(shí)現(xiàn)數(shù)學(xué)計(jì)算器,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
shell腳本實(shí)現(xiàn)多進(jìn)程運(yùn)行的方法示例
這篇文章主要給大家分享了shell腳本實(shí)現(xiàn)多進(jìn)程運(yùn)行的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-06-06
linux踢出遠(yuǎn)程登錄用戶命令(總結(jié)篇)
本文給大家總結(jié)了linux踢出遠(yuǎn)程登錄用戶命令,通過linux命令介紹了 tty 踢出登錄的操作方法,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2024-01-01
shell腳本實(shí)現(xiàn)定時(shí)刪除文件或文件夾
本文主要介紹了shell腳本實(shí)現(xiàn)定時(shí)刪除文件或文件夾,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08

