Shell脚本实现MySQL、Oracle、PostgreSQL数据库备份

2024-03-01 0 676
目录
  • 一、MySQL 数据库异地备份脚本
  • 二、MySQL 数据库的恢复
  • 三、Oracle 数据库异地备份脚本
  • 四、Oracle 数据库的恢复
  • 五、PostgreSQL 数据库异地备份脚本
  • 六、PostgreSQL 数据库的恢复

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

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

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

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

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

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

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

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

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

#!/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验证登录是否正常。

ssh-keygen
cd ~/.ssh/
scp id_rsa.pub 目标主机IP:~/.ssh/authorized_keys

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

find / -name mysqldump

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

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数据库

可使用以下语法命令从.sql文件中恢复MySQL数据库

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

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

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

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

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

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

#!/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文件中创建定时任务。

chmod +x oracle_backup.sh

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

四、Oracle 数据库的恢复

前提是oracle数据库已经安装好

然后,创建目录/opt/oracle/oraclebak并将数据库备份文件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

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

create or replace directory oracle_exp as \’/opt/oracle/oraclebak\’;

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

grant read, write on directory oracle_exp to oracle_db;

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

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 天前的日期,分别赋给了today、nowtime和yestoday变量。

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

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

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

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

#!/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工具安装路径,并修改脚本中的参数。

find / -name pg_dumpall

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

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命令将备份文件恢复到新数据库中,需确保已创建目标数据库。

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

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 天前的数据库备份文件已经删除完毕!

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

到此这篇关于Shell脚本实现MySQL、Oracle、PostgreSQL数据库备份的文章就介绍到这了,更多相关Shell数据库备份内容请搜索悠久资源网以前的文章或继续浏览下面的相关文章希望大家以后多多支持悠久资源网!

您可能感兴趣的文章:

  • shell脚本实现mysql数据库双机定时备份的方法
  • shell脚本定时备份MySQL数据库数据并保留指定时间
  • shell 备份数据库、代码上线的脚本
  • 使用shell脚本每天对MySQL多个数据库自动备份的讲解
  • MySQL数据库的shell脚本自动备份
  • 两个备份数据库的shell脚本

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悠久资源 linux shell Shell脚本实现MySQL、Oracle、PostgreSQL数据库备份 https://www.u-9.cn/jiaoben/linuxshell/179386.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务