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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!