MariaDB存储文件恢复数据&备份
前言
NAS升降级,MariaDB数据库出现异常(之前没有出现过),导致无法正常启动数据库。
没有进行定期导出备份.sql文件,只有映射了存储文件(.frm .ibd),引擎为innodb。
直接重新搭建mariadb服务并映射目录,服务依然不能正常启动。需要替换一些文件才能恢复数据,并且这次作为警醒单是靠快照还不稳妥,需要定时导出备份数据库
准备工作
- 正常运行的mariadb/mysql
- 原数据库存储文件
恢复
linuxserver/mariadb镜像的目录是/config
官方mariadb镜像的目录是/var/lib/mysql
把原数据库存储文件复制到新的数据库database
目录下
- databases里面
对应名
的文件夹为该数据库的存储文件 - ib_logfile0
- ib_logfile1
ib_logfile是innodb引擎中事物的日志记录,记录了所有数据更改操作; - ibdata1
存放着innodb表的元数据
文件并非0、1、2都有,但至少各有有一个,有则复制。
停止服务,替换掉新的mariadb目录database下的文件,再开启
此时mariadb服务和数据库应该可以正常使用,如果还没能正常使用,可以试试ib_logfile
文件都删除,再启动服务。
备份
备份脚本
mariadb容器映射一个backups目录,在这个目录上创建一个备份脚本backups_sql.sh
vi backups_sql.sh
修改并粘贴
#!/bin/bash
# 设置MariaDB连接的主机、用户名和密码
# 确保该用户拥有访问需要备份的数据库权限
MariaDB_HOST="localhost"
MariaDB_USER="username"
MariaDB_PASS="password"
# 要排除的数据库列表,用逗号分隔
EXCLUDE_DBS="database1,database2"
# 设置导出目录位置
EXPORT_DIR_BASE="/backups/auto_sql"
# 排除数据库字符串转换为数组
IFS=, read -ra EXCLUDED <<< "$EXCLUDE_DBS"
# 检测数据库连接
echo "Testing MariaDB database connection..."
if ! mysql -h ${MariaDB_HOST} -u ${MariaDB_USER} -p${MariaDB_PASS} -e ';' ; then
echo "ERROR: Unable to connect to the MariaDB database! Check your credentials and try again."
exit 1
fi
# 创建以当天日期命名的目录
EXPORT_DIR="${EXPORT_DIR_BASE}/$(date +%Y-%m-%d)"
mkdir -p "${EXPORT_DIR}"
echo "Exporting databases to directory: ${EXPORT_DIR}"
# 获取所有数据库名称
DATABASES=$(mysql -h ${MariaDB_HOST} -u ${MariaDB_USER} -p${MariaDB_PASS} -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema)")
# 遍历数据库并导出sql文件
for db in $DATABASES; do
if [[ " ${EXCLUDED[@]} " =~ " ${db} " ]]; then
echo "Skipping excluded database: ${db}"
else
echo "Exporting database: ${db}"
# 创建以数据库名称命名的导出文件
export_file="${EXPORT_DIR}/${db}.sql"
# 使用 mysqldump 导出sql文件
mysqldump -h ${MariaDB_HOST} -u ${MariaDB_USER} -p${MariaDB_PASS} --databases ${db} > "${export_file}"
echo "SQL file has been exported to: ${export_file}"
fi
done
echo "$(date +%Y-%m-%d) All databases have been exported to: ${EXPORT_DIR}"
保存退出,添加执行权限
chmod +x backups_sql.sh
可以手动执行看看是否成功导出sql文件
设置定时运行
- TrueNAS
Cron Jobs添加
设置运行用户,和执行时间周期
command修改并填入(apps的应用名为mariadb)
k3s kubectl exec `k3s kubectl get pods -n ix-mariadb |grep 1/1 |awk '{print $1}'|head -n 1` -n ix-mariadb -- /bin/bash /backups/auto_sql/backups_sql.sh
- 其它Linux系统方式
使用crontab进行配置
sudo vi /etc/crontab
或
crontab -e
添加
30 4 * * * root docker exec -u root 容器名或ID /bin/bash /backups/auto_sql/backups_sql.sh
完成