MySQL、Oracle、PostgreSQL 数据库备份用的 Shell 脚本

文章目录

  • 一、概要
  • 二、MySQL 数据库备份与还原异地备份脚本
    • 2.1 MySQL 数据库异地备份脚本
    • 2.2 MySQL 数据库的恢复
  • 三、Oracle 数据库备份与还原脚本
    • 3.1 Oracle 数据库异地备份脚本
    • 3.2 Oracle 数据库的恢复
  • 四、PostgreSQL 数据库异地备份与还原脚本
    • 4.1 PostgreSQL 数据库备份脚本
    • 4.2 PostgreSQL 数据库的恢复

一、概要

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

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

二、MySQL 数据库备份与还原异地备份脚本

2.1 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 filemkdir -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.logecho "开始删除 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.shcrontab -e
# MySQL 数据库备份
0 3 * * 6 root sh /bigdata/mysql_backup.sh >> /bigdata/mysql_backup.log 2>&1 &

2.2 MySQL 数据库的恢复

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

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

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

三、Oracle 数据库备份与还原脚本

3.1 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} ];thenecho "${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 ]
thenssh $backup_ip ls $destination > /dev/null 2>&1if [ $? -eq 0 ]thenecho "$destination exist mkdir"elsessh $backup_ip mkdir -p $destinationecho "$destination mkdir success"fi
### 本地删除备份文件,保留两个星期前的 ### ssh $backup_ip ls $destination >> /tmp/linshiwhile read mylinedoif [ ${myline} == ${seven_day_date}.dmp.gz -o ${myline} == ${fourteen_day_date}.dmp.gz ];thenecho "$myline.dmp persist success"elserm -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 ]thenecho "Two weeks ago file delete success"elseecho "Two weeks ago file delete fail"echo $current_date | mail -s "$current_date oracle.dmp file delete faile" $mail  # 保留两星期前数据,其他 dmp 文件删除失败fifidone < /tmp/linshirm -rf /tmp/linshi
elseecho "$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 ]   
thengzip -q -r $dmpDir/$current_date.dmp $dmpDirecho "compress success"scp -r $dmpDir/$current_date.dmp.gz root@$backup_ip:$destination > /dev/null 2>&1if [ $? -eq 0 ]thenecho "backup_file transfer success"elseecho "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
fiecho -e "-----end dmp all-----------------\n"

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

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

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

3.2 Oracle 数据库的恢复

前提是oracle数据库已经安装好,详情可参考文章:Oracle 数据库环境搭建 和 手把手教你在 Linux 环境下部署 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 数据库异地备份与还原脚本

4.1 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:destinationecho "远端备份完毕,感谢您使用此脚本!"
exit;

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

find / -name pg_dumpall

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

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

4.2 PostgreSQL 数据库的恢复

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

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

pg_restore -U <user_name> -d <database_name> <backup_file_path>
  • <user_name>具有足够权限的数据库用户的用户名

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/614821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生活自来水厂污水处理设备需要哪些

生活自来水厂是确保我们日常用水质量安全的重要设施。在自来水的生产过程中&#xff0c;污水处理设备是不可或缺的环节。那么&#xff0c;生活自来水厂的污水处理设备都有哪些呢&#xff1f;本文将为您详细介绍。 首先&#xff0c;生活自来水厂的污水处理设备主要包括预处理设备…

第11章 GUI Page489~494 步骤三十 保存画板文件

为“保存”菜单项 MenuItemFileSave挂接事件响应函数&#xff1a; 实际运行时&#xff0c;现版TrySaveFile()函数有点儿傻&#xff0c;点击保存菜单&#xff0c;还会弹出对话框&#xff0c;问我们“要不要保存” 修改TrySaveFile()函数 函数声明修改为&#xff1a; 函数实现修…

药品不良反应智能监测系统,java药品不良反应(ADR)智能监测系统源码,基于SpringBoot+Vue+MySQL技术开发

java药品不良反应智能监测系统 系统概述&#xff1a; 基于AI技术和深度学习模型&#xff0c;系统构建ADR智能识别模型&#xff0c;实现病程记录分析&#xff0c;提取病程记录实体&#xff0c;并完成语义关系的分类识别。一方面可以根据医务人员设置的监测任务或主题&#xff0c…

Open CV 图像处理基础:(六)在Java中使用 Open CV进行图片翻转和图片旋转

在Java中使用 Open CV进行图片翻转和图片旋转 目录 在Java中使用 Open CV进行图片翻转和图片旋转前言图片翻转函数代码示例其它翻转方向垂直翻转两轴翻转 图片旋转函数代码示例 Open CV 专栏导航 前言 在Java中使用OpenCV进行图片翻转和旋转是一种基本的图像处理技术&#xff0…

管理篇 - 24到28

学习目标&#xff1a; 为了更轻松的工作 学习内容&#xff1a; 新手管理最常犯的错&#xff1a;太把自己当回事儿&#xff01;当管理比自己干活还累&#xff1f;升职加薪后他真香了&#xff01;管理误区&#xff1a;要不要和下属做朋友&#xff1f;很多人都只理解了第一层&…

MySQL面试题 | 02.精选MySQL面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

vim基本操作命令

一、vi简介 vi是“Visual interface”的简称&#xff0c;它在Linux上的地位就仿佛Edit程序在DOS上一样。它可以执行输出、删除、查找、替换、块操作等众多文本操作&#xff0c;而且用户可以根据自己的需要对其进行定制。Vi不是一个排版程序&#xff0c;它不象Word或WPS那样可以…

商城小程序(8.购物车页面)

目录 一、商品列表区域1、渲染购物车商品列表的标题区域2、渲染商品列表区域的基本结构3、为my-goods组件封装radio勾选状态4、为my-goods组件封装radio-change事件5、修改购物车中商品的选择状态6、为my-goods组件封装NumberBox7、为my-goods封装num-change事件8、修改购物车商…

解决opencv出错:ImportError: numpy.core.multiarray failed to import

利用安装好opencv后&#xff0c;导入cv2的时候报错&#xff0c;如下 from .cv2 import * ImportError: numpy.core.multiarray failed to import这里是numpy库的版本过低或者过高&#xff0c;不合适刚刚装的opencv版本。 尝试升高或降低numpy版本&#xff0c;一般是升级到高版…

11.1、信赖域策略优化算法TRPO强化学习-从理论到实践

基于LunarLander登陆器的TRPO强化学习&#xff08;含PYTHON工程&#xff09; TRPO强化学习算法主要分为3个部分&#xff0c;分别介绍其理论、细节、实现 本文主要介绍TRPO的特点、思路、和优化式子的推导 TRPO系列&#xff08;TRPO是真的复杂&#xff0c;全部理解花费了我半…

【论文笔记】End-to-End Diffusion Latent Optimization Improves Classifier Guidance

Abstract Classifier guidance为图像生成带来了控制&#xff0c;但是需要训练新的噪声感知模型(noise-aware models)来获得准确的梯度&#xff0c;或使用最终生成的一步去噪近似&#xff0c;这会导致梯度错位(misaligned gradients)和次优控制(sub-optimal control)。 梯度错位…

算法训练营Day37

#Java #动态规划 Feeling and experiences&#xff1a; 目标和&#xff1a;力扣题目链接 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c…

facebook广告素材制作要注意哪些

在制作Facebook广告素材时&#xff0c;需要注意以下几点&#xff1a; 目标受众&#xff1a;了解目标受众的喜好、需求和兴趣&#xff0c;以便制作能够吸引他们的广告素材。广告格式&#xff1a;选择适合广告内容的格式&#xff0c;如图片、视频、幻灯片等。同时&#xff0c;要…

jmeter--1.安装

目录 1. jmeter和jdk下载地址 2. jdk环境变量配置 3. Jmeter的环境变量配置 1. jmeter和jdk下载地址 链接&#xff1a;https://pan.baidu.com/s/1C8ItsR8ZUGJO9uyTJ-9QtQ?pwdx5m5 提取码&#xff1a;x5m5 2. jdk环境变量配置 2.1 我的电脑右键属性-->高级系统设置--&…

20240111在ubuntu20.04.6下解压缩RAR格式的压缩包

20240111在ubuntu20.04.6下解压缩RAR格式的压缩包 2024/1/11 18:25 百度搜搜&#xff1a;ubuntu rar文件怎么解压 rootrootrootroot-X99-Turbo:~/temp$ ll total 2916 drwx------ 3 rootroot rootroot 4096 1月 11 18:28 ./ drwxr-xr-x 25 rootroot rootroot 4096 1月…

详细分析Java中的分布式任务调度框架 XXL-Job

目录 前言1. 基本知识2. Demo3. 实战 前言 可视化任务调度 可视化配置 1. 基本知识 在Java中&#xff0c;分布式任务调度框架 XXL-Job 是一个开源的分布式任务调度平台&#xff0c;用于实现分布式系统中的定时任务调度和分布式任务执行。 下面是关于XXL-Job的一些概念、功…

05- OpenCV:图像操作和图像混合

目录 一、图像操作 1、读写图像 2、读写像素 3、修改像素值 4、Vec3b与Vec3F 5、相关的代码演示 二、图像混合 1、理论-线性混合操作 2、相关API(addWeighted) 3、代码演示&#xff08;完整的例子&#xff09; 一、图像操作 1、读写图像 &#xff08;1&#xff09;…

IDC机房服务器搬迁之运行了几年的服务器没关过机,今天关机下架,再上架突然起不来了,怎么快速处理?

环境 戴尔R420 服务器 1U 2台直连存储 4U CentOS 7 问题描述 IDC机房服务器搬迁之运行了几年的服务器没关过机,今天关机下架,再上架突然起不来了,怎么快速处理? 服务器上电开机就出现进入紧急模式 Welcome to emergency mode! After logging in, type “journalctl …

MYSQL篇--锁机制高频面试题

Mysql锁机制 1对mysql的锁有了解吗&#xff1f; 首先我们要知道&#xff0c;mysql的锁 其实是为了解决在并发事务时所导致的数据不一致问题的一种处理机制&#xff0c;也就是说 在事务的隔离级别实现中&#xff0c;就需要利用锁来解决幻读问题 然后我们可以聊到锁的分类 按锁…

软件测试|使用Python读取CSV文件的详细指南

简介 CSV&#xff08;Comma-Separated Values&#xff09;是一种常用的数据存储格式&#xff0c;它以逗号为分隔符将数据以文本形式存储在文件中。Python是一门强大的编程语言&#xff0c;提供了许多库和工具&#xff0c;使得读取和处理CSV文件变得非常简便。在本文中&#xf…