太强了!MySQL、Oracle、PostgreSQL 数据库备份拿来就用的 Shell 脚本!

作者:JackTian

来源:公众号「杰哥的IT之旅」

ID:Jake_Internet

转载请联系授权(微信ID:Hc220088)

原文链接:太强了!MySQL、Oracle、PostgreSQL 数据库备份拿来就用的 Shell 脚本!

大家好,我是杰哥。

在工作中,生产环境数据库备份的重要性和必要性是必不可少的。备份可以确保数据库的安全性和业务连续性,有助于预防减少因硬件故障、人为错误或恶意攻击等原因导致的意外数据丢失的风险。

那么今天,本文主要介绍MySQLOraclePostgreSQL数据库的备份脚本及恢复方法,可全面了解不同数据库的备份和恢复方法。

一、MySQL 数据库异地备份脚本

该脚本主要是用于在Linux系统上备份MySQL数据库,自定义数据库用户名、密码、IP 地址、远程备份服务器 IP、本地备份路径、远程备份路径、当前时间、7 天前的日期变量。

使用mkdir -p命令创建以当前日期为名的目录,存放数据库备份文件。

使用mysqldump命令备份所有数据库,并将输出重定向至mysql_backup_$DATE.sql文件中。

使用tar命令将备份文件压缩为:.tar.gz格式的文件内,并附加日志到备份文件中,然后删除原始的备份文件。

使用rm -rf命令删除 7 天前的备份文件,删除的是以 7 天前日期为名的目录和目录下的所有文件。

使用scp命令将本地备份文件传到远程备份服务器上。

bash 复制代码
#!/bin/bash
# Database info
DB_USER="root"                          # 数据库备份用户
DB_PASS="1Q!2W@3E#"                     # 备份用户密码
DB_HOST="192.168.1.100"                 # 数据库 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,用于删除备份文件取文件时间,该参数可自行调整

#BACK_NAME="db_$var.sql"
#TB_NAME=("" "" "" "" "")               # 需要备份的表名

#create file

mkdir -p $BCK_DIR/$DATE                 # 创建本地备份日期目录
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 天前的数据库备份文件..."
rm -rf $BCK_DIR/$yestoday
echo "7 天前的数据库备份文件删除完毕!"

echo "开始远程备份中..."
scp -r $BCK_DIR/$DATE/mysql_backup_$DATE.sql.tar.gz root@$DBBACK_IP:$DBBACK_PATH
echo "远程备份完毕!"

需要注意的是:远程备份需要做免密,在MySQL数据库所在服务器与需要远程备份的服务器做免密,并进行ssh验证登录是否正常。

javascript 复制代码
ssh-keygen
cd ~/.ssh/
scp id_rsa.pub 目标主机IP:~/.ssh/authorized_keys

利用find命令查找mysqldump工具安装路径,并按实际路径更改脚本中的参数。

arduino 复制代码
find / -name mysqldump

mysql_backup.sh脚本增加可执行权限,并创建crontab定时任务。

bash 复制代码
chmod +x mysql_backup.sh

crontab -e
# MySQL 数据库备份
0 3 * * 6 root sh /bigdata/mysql_backup.sh >> /bigdata/mysql_backup.log 2>&1 &

二、MySQL 数据库的恢复

首先确保已安装好MySQL数据库,详情可参考文章:MySQL 数据库系统的安装

可使用以下语法命令从.sql文件中恢复MySQL数据库,详情可参考文章:MySQL 数据库系统的备份与恢复

css 复制代码
mysql -u [用户名] -p [密码] [数据库名] < [备份文件名.sql]

三、Oracle 数据库异地备份脚本

该脚本用来自动备份Oracle数据库。首先,输出一些提示信息,然后获取当前时间,并设置日志文件路径、备份日期时间、保留文件的日期时间、本地备份路径、远端备份路径、Oracle 数据库服务器本机 IP、远端备份 IP、用户名、密码、告警邮箱变量。

脚本会检查本地备份目录路径是否存在,如果不存在则创建定义的目录。然后,使用 exp 命令进行Oracle数据库的全量备份,并将备份文件保存在指定的本地备份目录路径中。

通过SSH连接到远程备份服务器,检查远程备份目录路径是否存在,如果不存在则创建定义的路径。然后删除本地备份目录路径下两星期前的备份文件,并通过SSH删除远程备份路径下两星期前的备份文件。

对当前备份文件进行压缩,并通过SCP将压缩后的备份文件传输到远程备份服务器。最后,会根据备份和传输的结果发送相应的通知邮件。

bash 复制代码
#!/bin/bash
echo "开始执行 Oracle 数据库备份..."
echo "backup ing -------------------"
echo "时间:" nowtime
oraclelog=/opt/originbackup/oraclebackup.log                   # Oracle 日志查看位置
current_date=`date +%Y-%m-%d`                                  # 当前执行日期时间
nowtime=$(date +%F+%T)                                         # 显示当前时间,用于记录脚本运行开始时间
seven_day_date=`date -d -7day '+%Y-%m-%d'`                     # 保留一星期前 dmp 文件时间
fourteen_day_date=`date -d -14day '+%Y-%m-%d'`                 # 保留两星期前 dmp 文件时间

### 需修改参数部分 ###
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

### 判断是否有目录,没有则创建目录 ### 
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}|${b})'`
				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  # 保留两星期前数据,其他 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      # 终止后面的所有脚本执行
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 文件未发现
                fi
fi

echo -e "-----end dmp all-----------------\n"

同样,异地备份免密是必不可少的一步,参考上述MySQL配置的免密步骤即可。

oracle_backup.sh脚本增加可执行权限,并在Linux/etc/crontab文件中创建定时任务。

bash 复制代码
chmod +x oracle_backup.sh

crontab -e
# Oracle 数据库备份
0 3 * * 6 root sh /opt/oracle_backup.sh >> /opt/oraclebackup.log

四、Oracle 数据库的恢复

前提是oracle数据库已经安装好,详情可参考文章:Oracle 数据库环境搭建手把手教你在 Linux 环境下部署 Oracle 数据库!

然后,创建目录 /opt/oracle/oraclebak 并将数据库备份文件 oracle_db.dmp 复制到该目录中。

bash 复制代码
mkdir -p /opt/oracle/oraclebak
cp oracle_db.dmp /opt/oracle/oraclebak

授予 /opt/oracle/oraclebak 目录权限给 oracle 用户和 dba 组。

bash 复制代码
chown oracle:dba /opt/oracle/oraclebak

在数据库中创建备份目录,以便数据库可以访问备份文件。

csharp 复制代码
create or replace directory oracle_exp as '/opt/oracle/oraclebak';

授予 oracle_db 用户对备份目录的读写权限。

arduino 复制代码
grant read, write on directory oracle_exp to oracle_db;

最后,使用以下命令在数据库服务器上切换到 oracle 用户,并执行数据库恢复操作:

css 复制代码
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:本地数据库恢复的用户名、密码和数据库 SID
  • SCHEMAS:指定要导入的表空间
  • DUMPFILE:指定数据库恢复文件
  • LOGFILE:指定数据库恢复日志

五、PostgreSQL 数据库异地备份脚本

该脚本是备份PostgreSQL数据库并将备份文件传输到远端备份服务器上。首先,使用date命令获取了今天的日期、当前时间点和 7 天前的日期,分别赋给了todaynowtimeyestoday变量。

定义了本机 IP 地址、远端备份服务器 IP、PostgreSQL 数据库的端口号、数据库用户名和密码,分别赋给了host_ipbackup_ipport_idusernameexport PGPASSWORD变量。

指定了本地备份目录和远端备份目录,分别赋给了dmpDirdestination变量。

使用pg_dumpall命令来备份整个PostgreSQL数据库,并将备份文件保存在本地备份目录中。备份完成后,对备份文件进行了压缩。使用scp命令将压缩后的备份文件传输到远端备份服务器上的指定目录。

最后,输出备份和传输的相关信息,并结束脚本的执行。

bash 复制代码
#!/bin/bash
#Description:备份 PostgreSQL 数据库必能压缩成 gz 文件,最后删除 3 天前的备份文件。

echo "开始执行 PostgreSQL 数据库的备份..."
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                             # 数据库用户             
export PGPASSWORD=7u&8i*9o(                   # 数据库密码
dmpDir=/opt/pgbak                             # 本地备份目录
destination=/bigdata/pg_backup                # 远端备份目录
echo "时间:" $nowtime
set timeout 600

#/monchickey/bin/ 为 pg_dump 备份工具安装路径,根据实际情况更新此路径。
/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 数据库备份完成!"

echo "当天备份文件压缩中..."
gzip "$dmpDir"/pg_backup_"$today".sql.gz ;
echo "7 天前的 PostgreSQL 数据库备份文件已删除!"

echo "开始远端备份..."
scp -r $dmpDir"/pg_backup_"$today".sql.gz root@backup_ip:destination

echo "远端备份完毕,感谢您使用此脚本!"
exit;

利用find查找pg_dumpall工具安装路径,并修改脚本中的参数。

arduino 复制代码
find / -name pg_dumpall

pg_dump_backup.sh脚本增加可执行权限,并在Linux/etc/crontab文件中创建定时任务。

bash 复制代码
chmod +x pg_dump_backup.sh

crontab -e
# PostgreSQL 数据库备份
0 3 * * 6 root sh /home/postgres/pg_dump_backup.sh >> /home/postgres/postgres_backup.log 2>&1 &

六、PostgreSQL 数据库的恢复

使用pg_restore命令将备份文件恢复到新数据库中,需确保已创建目标数据库。

首先,确保已经登录到拥有足够权限的数据库用户账号。然后,使用以下命令将备份文件恢复到新数据库中:

xml 复制代码
pg_restore -U <username> -d <database_name> <backup_file_path>
  • <username>:具有足够权限的数据库用户的用户名
  • <database_name>:将备份文件恢复到的目标数据库的名称
  • <backup_file_path>:数据库备份文件的完整路径及文件名

输入用户密码后,pg_restore将开始从备份文件中恢复数据库。

最后,在分享个脚本,该脚本的作用主要是删除指定目录中7天前的数据库备份文件。首先,是在终端中打印一条消息,告诉用户脚本开始删除 7 天前的数据库备份文件。

然后,执行find /home/postgresql_backup/ -name "*sql" -mtime +7 -exec rm -rf {} \;命令,这行命令实际上是执行删除操作。让我来解释一下这个命令:

  • find:是一个用于在指定目录中查找文件的命令
  • /home/postgresql_backup/:要查找的目录
  • -name "*sql":查找以.sql结尾的文件
  • -mtime +7:查找修改时间在 7 天之前的文件
  • -exec rm -rf {} \;:对查找到的文件执行 rm -rf 命令,{} 会被替换为实际的文件名。

最后,在终端中打印一条消息,告诉用户 7 天前的数据库备份文件已经删除完毕!

bash 复制代码
#!/bin/bash
echo "开始删除 7 天前的 数据库备份文件..."
find /home/postgresql_backup/ -name "*sql" -mtime +7 -exec rm -rf {} \;
set timeout 1000
echo " 7 天前的数据库备份文件删除完毕!"

以上,就是今天分享的全部内容啦!希望对你有所帮助。下期见!

如果你觉得这篇文章对你有点用的话,为本文点个赞留个言 或者转发一下,让更多的朋友看到,因为这将是我持续输出更多优质文章的最强动力!

相关推荐
bin91531 小时前
DeepSeek 助力 Vue 开发:打造丝滑的复制到剪贴板(Copy to Clipboard)
前端·javascript·vue.js·ecmascript·deepseek
月光水岸New1 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6752 小时前
数据库基础1
数据库
我爱松子鱼2 小时前
mysql之规则优化器RBO
数据库·mysql
闲猫2 小时前
go orm GORM
开发语言·后端·golang
丁卯4042 小时前
Go语言中使用viper绑定结构体和yaml文件信息时,标签的使用
服务器·后端·golang
chengooooooo2 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
晴空万里藏片云3 小时前
elment Table多级表头固定列后,合计行错位显示问题解决
前端·javascript·vue.js
曦月合一3 小时前
html中iframe标签 隐藏滚动条
前端·html·iframe
奶球不是球3 小时前
el-button按钮的loading状态设置
前端·javascript