有使用Mariadb 数据库的友吗?分享一个正在用的数据库备份脚本

2026-04-11 14:351阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐
问题描述:

可以实现每天一个完整备份,每小时一个增量备份。只需要每小时运行一次脚本,会自动检测当天是否已有全量备份。

#!/bin/bash







######### # 备份频率:每天全量备份,每小时增量备份 #





######### base_dir="/root/backup/store" backup_u="mariabackup" backup_p="mariabackup" log_file="/var/log/mariabackup.log" base_date="$(date +'%Y%m%d')" # 忽略的数据库,使用空格隔断 ignoredb="msg" # 日志记录函数 log_message() { echo "$(date +'%Y-%m-%d %H:%M:%S') - $1" >> "$log_file" } # 检查备份目录是否存在,不存在则创建 if [ ! -d "$base_dir/$base_date" ]; then log_message "开始全量备份 $base_date..." today_base="$base_dir/$base_date/full_$(date +'%H%M%S')" mkdir -p "$today_base" if mariabackup -u"$backup_u" -p"$backup_p" --backup --target-dir="$today_base" --databases-exclude="$ignoredb"; then echo "$today_base" >> "$base_dir/$base_date/config.ini" log_message "全量备份成功完成。" else log_message "全量备份失败。" exit 1 fi else log_message "开始增量备份 $base_date..." last_dir=$(tail -n 1 "$base_dir/$base_date/config.ini") incr_dir="$base_dir/$base_date/incr_$(date +'%H%M%S')" if mariabackup -u"$backup_u" -p"$backup_p" --backup --target-dir="$incr_dir" --incremental-basedir="$last_dir" --databases-exclude="$ignoredb"; then echo "$incr_dir" >> "$base_dir/$base_date/config.ini" log_message "增量备份成功完成,基于 $last_dir。" else log_message "增量备份失败。" exit 1 fi fi # 清理:删除3天以前的备份和日志文件 find "$base_dir" -type d -ctime +3 -exec rm -r {} + -exec log_message "删除旧目录 {}" \; find "$base_dir" -type f -ctime +3 -exec rm {} + -exec log_message "删除旧文件 {}" \;

我这边是每天会自动拉取备份至专用设备,所以最后两行会自动清理主机上3天以前的数据,不需要的友要自己删除
下面是在windows平台恢复备份的脚本,会自动应用增量。

@echo off setlocal enabledelayedexpansion :: =========================================================================== :: ★ 需配置参数 set "backup_dir=D:\DB_RESTORE\20260111" set "mysql_home=E:\Mariadb" set "mysql_user=root" set "mysql_pass=root" set "mysql_port=3306" :: ★ 使用 MariaDB 自带的 mariabackup.exe set "xb_bin=%mysql_home%\bin\mariabackup.exe" echo. echo ========================================================== echo MariaDB 物理恢复自动化脚本 echo ========================================================== :: 查找 full_000001 目录 for /d %%d in ("%backup_dir%\full_*") do ( set "full_dir=%%d" ) if "%full_dir%"=="" ( echo [错误] 未找到 full_xxx 目录 exit /b 1 ) echo 使用备份目录:%full_dir% echo. echo 停止 MariaDB 服务... net stop MariaDB >nul 2>&1 taskkill /F /IM mysqld.exe >nul 2>&1 :: 清空 data set "data_dir=%mysql_home%\data" echo 清空数据库 data 目录:%data_dir% if exist "%data_dir%" rmdir /S /Q "%data_dir%" mkdir "%data_dir%" :: 是否已 prepare if exist "%full_dir%\xtrabackup_logfile" ( echo [信息] 检测到 xtrabackup_logfile -> 已经 prepare ) else ( echo 执行 mariabackup --prepare ... "%xb_bin%" --prepare --target-dir="%full_dir%" if %errorlevel% neq 0 ( echo [错误] prepare 阶段失败 exit /b 1 ) ) echo 执行 copy-back 到 %data_dir% "%xb_bin%" --copy-back --target-dir="%full_dir%" if %errorlevel% neq 0 ( echo [错误] copy-back 失败 exit /b 1 ) echo 修复 data 目录权限... icacls "%data_dir%" /grant Everyone:F /T >nul echo 启动 MariaDB 服务... net start MariaDB echo. echo ========================================================== echo 数据恢复完成 echo ========================================================== pause exit /b 0 网友解答:


--【壹】--: 凯格格:

汉天

汉天是什么天


--【贰】--: ######### base_dir="/root/backup/store" backup_u="mariabackup" backup_p="mariabackup" log_file="/var/log/mariabackup.log" base_date="$(date +'%Y%m%d')" # 忽略的数据库,使用空格隔断 ignoredb="msg" # 日志记录函数 log_message() { echo "$(date +'%Y-%m-%d %H:%M:%S') - $1" >> "$log_file" } # 检查备份目录是否存在,不存在则创建 if [ ! -d "$base_dir/$base_date" ]; then log_message "开始全量备份 $base_date..." today_base="$base_dir/$base_date/full_$(date +'%H%M%S')" mkdir -p "$today_base" if mariabackup -u"$backup_u" -p"$backup_p" --backup --target-dir="$today_base" --databases-exclude="$ignoredb"; then echo "$today_base" >> "$base_dir/$base_date/config.ini" log_message "全量备份成功完成。" else log_message "全量备份失败。" exit 1 fi else log_message "开始增量备份 $base_date..." last_dir=$(tail -n 1 "$base_dir/$base_date/config.ini") incr_dir="$base_dir/$base_date/incr_$(date +'%H%M%S')" if mariabackup -u"$backup_u" -p"$backup_p" --backup --target-dir="$incr_dir" --incremental-basedir="$last_dir" --databases-exclude="$ignoredb"; then echo "$incr_dir" >> "$base_dir/$base_date/config.ini" log_message "增量备份成功完成,基于 $last_dir。" else log_message "增量备份失败。" exit 1 fi fi # 清理:删除3天以前的备份和日志文件 find "$base_dir" -type d -ctime +3 -exec rm -r {} + -exec log_message "删除旧目录 {}" \; find "$base_dir" -type f -ctime +3 -exec rm {} + -exec log_message "删除旧文件 {}" \;

我这边是每天会自动拉取备份至专用设备,所以最后两行会自动清理主机上3天以前的数据,不需要的友要自己删除
下面是在windows平台恢复备份的脚本,会自动应用增量。

@echo off setlocal enabledelayedexpansion :: =========================================================================== :: ★ 需配置参数 set "backup_dir=D:\DB_RESTORE\20260111" set "mysql_home=E:\Mariadb" set "mysql_user=root" set "mysql_pass=root" set "mysql_port=3306" :: ★ 使用 MariaDB 自带的 mariabackup.exe set "xb_bin=%mysql_home%\bin\mariabackup.exe" echo. echo ========================================================== echo MariaDB 物理恢复自动化脚本 echo ========================================================== :: 查找 full_000001 目录 for /d %%d in ("%backup_dir%\full_*") do ( set "full_dir=%%d" ) if "%full_dir%"=="" ( echo [错误] 未找到 full_xxx 目录 exit /b 1 ) echo 使用备份目录:%full_dir% echo. echo 停止 MariaDB 服务... net stop MariaDB >nul 2>&1 taskkill /F /IM mysqld.exe >nul 2>&1 :: 清空 data set "data_dir=%mysql_home%\data" echo 清空数据库 data 目录:%data_dir% if exist "%data_dir%" rmdir /S /Q "%data_dir%" mkdir "%data_dir%" :: 是否已 prepare if exist "%full_dir%\xtrabackup_logfile" ( echo [信息] 检测到 xtrabackup_logfile -> 已经 prepare ) else ( echo 执行 mariabackup --prepare ... "%xb_bin%" --prepare --target-dir="%full_dir%" if %errorlevel% neq 0 ( echo [错误] prepare 阶段失败 exit /b 1 ) ) echo 执行 copy-back 到 %data_dir% "%xb_bin%" --copy-back --target-dir="%full_dir%" if %errorlevel% neq 0 ( echo [错误] copy-back 失败 exit /b 1 ) echo 修复 data 目录权限... icacls "%data_dir%" /grant Everyone:F /T >nul echo 启动 MariaDB 服务... net start MariaDB echo. echo ========================================================== echo 数据恢复完成 echo ========================================================== pause exit /b 0


--【叁】--:

当天,该死的输入法


--【肆】--: ######### # 备份频率:每天全量备份,每小时增量备份 #
标签:数据库
问题描述:

可以实现每天一个完整备份,每小时一个增量备份。只需要每小时运行一次脚本,会自动检测当天是否已有全量备份。

#!/bin/bash







######### # 备份频率:每天全量备份,每小时增量备份 #





######### base_dir="/root/backup/store" backup_u="mariabackup" backup_p="mariabackup" log_file="/var/log/mariabackup.log" base_date="$(date +'%Y%m%d')" # 忽略的数据库,使用空格隔断 ignoredb="msg" # 日志记录函数 log_message() { echo "$(date +'%Y-%m-%d %H:%M:%S') - $1" >> "$log_file" } # 检查备份目录是否存在,不存在则创建 if [ ! -d "$base_dir/$base_date" ]; then log_message "开始全量备份 $base_date..." today_base="$base_dir/$base_date/full_$(date +'%H%M%S')" mkdir -p "$today_base" if mariabackup -u"$backup_u" -p"$backup_p" --backup --target-dir="$today_base" --databases-exclude="$ignoredb"; then echo "$today_base" >> "$base_dir/$base_date/config.ini" log_message "全量备份成功完成。" else log_message "全量备份失败。" exit 1 fi else log_message "开始增量备份 $base_date..." last_dir=$(tail -n 1 "$base_dir/$base_date/config.ini") incr_dir="$base_dir/$base_date/incr_$(date +'%H%M%S')" if mariabackup -u"$backup_u" -p"$backup_p" --backup --target-dir="$incr_dir" --incremental-basedir="$last_dir" --databases-exclude="$ignoredb"; then echo "$incr_dir" >> "$base_dir/$base_date/config.ini" log_message "增量备份成功完成,基于 $last_dir。" else log_message "增量备份失败。" exit 1 fi fi # 清理:删除3天以前的备份和日志文件 find "$base_dir" -type d -ctime +3 -exec rm -r {} + -exec log_message "删除旧目录 {}" \; find "$base_dir" -type f -ctime +3 -exec rm {} + -exec log_message "删除旧文件 {}" \;

我这边是每天会自动拉取备份至专用设备,所以最后两行会自动清理主机上3天以前的数据,不需要的友要自己删除
下面是在windows平台恢复备份的脚本,会自动应用增量。

@echo off setlocal enabledelayedexpansion :: =========================================================================== :: ★ 需配置参数 set "backup_dir=D:\DB_RESTORE\20260111" set "mysql_home=E:\Mariadb" set "mysql_user=root" set "mysql_pass=root" set "mysql_port=3306" :: ★ 使用 MariaDB 自带的 mariabackup.exe set "xb_bin=%mysql_home%\bin\mariabackup.exe" echo. echo ========================================================== echo MariaDB 物理恢复自动化脚本 echo ========================================================== :: 查找 full_000001 目录 for /d %%d in ("%backup_dir%\full_*") do ( set "full_dir=%%d" ) if "%full_dir%"=="" ( echo [错误] 未找到 full_xxx 目录 exit /b 1 ) echo 使用备份目录:%full_dir% echo. echo 停止 MariaDB 服务... net stop MariaDB >nul 2>&1 taskkill /F /IM mysqld.exe >nul 2>&1 :: 清空 data set "data_dir=%mysql_home%\data" echo 清空数据库 data 目录:%data_dir% if exist "%data_dir%" rmdir /S /Q "%data_dir%" mkdir "%data_dir%" :: 是否已 prepare if exist "%full_dir%\xtrabackup_logfile" ( echo [信息] 检测到 xtrabackup_logfile -> 已经 prepare ) else ( echo 执行 mariabackup --prepare ... "%xb_bin%" --prepare --target-dir="%full_dir%" if %errorlevel% neq 0 ( echo [错误] prepare 阶段失败 exit /b 1 ) ) echo 执行 copy-back 到 %data_dir% "%xb_bin%" --copy-back --target-dir="%full_dir%" if %errorlevel% neq 0 ( echo [错误] copy-back 失败 exit /b 1 ) echo 修复 data 目录权限... icacls "%data_dir%" /grant Everyone:F /T >nul echo 启动 MariaDB 服务... net start MariaDB echo. echo ========================================================== echo 数据恢复完成 echo ========================================================== pause exit /b 0 网友解答:


--【壹】--: 凯格格:

汉天

汉天是什么天


--【贰】--: ######### base_dir="/root/backup/store" backup_u="mariabackup" backup_p="mariabackup" log_file="/var/log/mariabackup.log" base_date="$(date +'%Y%m%d')" # 忽略的数据库,使用空格隔断 ignoredb="msg" # 日志记录函数 log_message() { echo "$(date +'%Y-%m-%d %H:%M:%S') - $1" >> "$log_file" } # 检查备份目录是否存在,不存在则创建 if [ ! -d "$base_dir/$base_date" ]; then log_message "开始全量备份 $base_date..." today_base="$base_dir/$base_date/full_$(date +'%H%M%S')" mkdir -p "$today_base" if mariabackup -u"$backup_u" -p"$backup_p" --backup --target-dir="$today_base" --databases-exclude="$ignoredb"; then echo "$today_base" >> "$base_dir/$base_date/config.ini" log_message "全量备份成功完成。" else log_message "全量备份失败。" exit 1 fi else log_message "开始增量备份 $base_date..." last_dir=$(tail -n 1 "$base_dir/$base_date/config.ini") incr_dir="$base_dir/$base_date/incr_$(date +'%H%M%S')" if mariabackup -u"$backup_u" -p"$backup_p" --backup --target-dir="$incr_dir" --incremental-basedir="$last_dir" --databases-exclude="$ignoredb"; then echo "$incr_dir" >> "$base_dir/$base_date/config.ini" log_message "增量备份成功完成,基于 $last_dir。" else log_message "增量备份失败。" exit 1 fi fi # 清理:删除3天以前的备份和日志文件 find "$base_dir" -type d -ctime +3 -exec rm -r {} + -exec log_message "删除旧目录 {}" \; find "$base_dir" -type f -ctime +3 -exec rm {} + -exec log_message "删除旧文件 {}" \;

我这边是每天会自动拉取备份至专用设备,所以最后两行会自动清理主机上3天以前的数据,不需要的友要自己删除
下面是在windows平台恢复备份的脚本,会自动应用增量。

@echo off setlocal enabledelayedexpansion :: =========================================================================== :: ★ 需配置参数 set "backup_dir=D:\DB_RESTORE\20260111" set "mysql_home=E:\Mariadb" set "mysql_user=root" set "mysql_pass=root" set "mysql_port=3306" :: ★ 使用 MariaDB 自带的 mariabackup.exe set "xb_bin=%mysql_home%\bin\mariabackup.exe" echo. echo ========================================================== echo MariaDB 物理恢复自动化脚本 echo ========================================================== :: 查找 full_000001 目录 for /d %%d in ("%backup_dir%\full_*") do ( set "full_dir=%%d" ) if "%full_dir%"=="" ( echo [错误] 未找到 full_xxx 目录 exit /b 1 ) echo 使用备份目录:%full_dir% echo. echo 停止 MariaDB 服务... net stop MariaDB >nul 2>&1 taskkill /F /IM mysqld.exe >nul 2>&1 :: 清空 data set "data_dir=%mysql_home%\data" echo 清空数据库 data 目录:%data_dir% if exist "%data_dir%" rmdir /S /Q "%data_dir%" mkdir "%data_dir%" :: 是否已 prepare if exist "%full_dir%\xtrabackup_logfile" ( echo [信息] 检测到 xtrabackup_logfile -> 已经 prepare ) else ( echo 执行 mariabackup --prepare ... "%xb_bin%" --prepare --target-dir="%full_dir%" if %errorlevel% neq 0 ( echo [错误] prepare 阶段失败 exit /b 1 ) ) echo 执行 copy-back 到 %data_dir% "%xb_bin%" --copy-back --target-dir="%full_dir%" if %errorlevel% neq 0 ( echo [错误] copy-back 失败 exit /b 1 ) echo 修复 data 目录权限... icacls "%data_dir%" /grant Everyone:F /T >nul echo 启动 MariaDB 服务... net start MariaDB echo. echo ========================================================== echo 数据恢复完成 echo ========================================================== pause exit /b 0


--【叁】--:

当天,该死的输入法


--【肆】--: ######### # 备份频率:每天全量备份,每小时增量备份 #
标签:数据库