有使用Mariadb 数据库的友吗?分享一个正在用的数据库备份脚本
- 内容介绍
- 文章标签
- 相关推荐
可以实现每天一个完整备份,每小时一个增量备份。只需要每小时运行一次脚本,会自动检测当天是否已有全量备份。
#!/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
--【叁】--:
当天,该死的输入法
--【肆】--: ######### # 备份频率:每天全量备份,每小时增量备份 #

