数据库单表备份还原shell

编写了指定多表的数据库备份的mysql_backup.sh,方便对数据库进行运维,顺便复习一下shell语法

#! /bin/bash

#数据库用户名
user="test"
#数据库密码
passwd="test"
#数据库名
database="test"
#数据库ip
host="127.0.0.1"
#需要备份的表名,以字符串的形式通过空格隔开
backup_table="test test1 test2"

BCK_DIR="/root/mysql-backups"  #备份文件目录
DATE=`date +%F`

now=`date "+%Y-%m-%d %H:%M:%S"`

#判断文件是否存在
if [ ! -d $BCK_DIR/$DATE ]; then
    # 创建目录
    mkdir -p $BCK_DIR/$DATE
fi

#插入一条备份记录
function insertOneRecord()
{
    #插入数据
    insert="insert into backup (table_name,status,created_at,updated_at) values ('$1',0,'$now','$now')"
    mysql -h$host -u$user -p$passwd $database -e "${insert}"
}

#备份单表
function backupTable()
{
    mysqldump -h$host -u$user -p$passwd --databases $database --tables $1 > "${BCK_DIR}/${DATE}/${database}_$1.sql"
}

#检查单表备份是否成功
function checkBackupIsSuccess()
{
    if [ ! -f "${BCK_DIR}/${DATE}/${database}_$1.sql" ]; then
        update="update backup set status = -1 where created_at = '$now'"
        mysql -h$host -u$user -p$passwd $database -e "${update}"
        echo '备份失败'
    else
        update="update backup set status = 1 where created_at = '$now'"
        mysql -h$host -u$user -p$passwd $database -e "${update}"
        echo '备份成功'
    fi
}

#执行流程
for item in $backup_table
do
    insertOneRecord $item
    backupTable $item
    checkBackupIsSuccess $item
done

这里还添加了一张备份数据表,每次备份都会产生记录,可以便于记录备份数据,这里还设想将备份文件上传到oss,目前还没弄,但是字段有添加。

CREATE TABLE `backup` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `table_name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '备份表名',
  `status` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '备份状态',
  `dir_name` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文件路径',
  `is_upload` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '是否上传oss',
  `oss_dir` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'oss文件路径',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

可通过配置crontab进行定期备份指定重要的数据表

* * * * * sh /root/mysql_backup.sh > /dev/null 2>&1每分钟都执行这个备份脚本,可以按照你的需求去定义定时任务

有备份就有还原,还添加了mysql_restore.sh,备份逻辑就相对比较简单

#! /bin/bash

#数据库用户名
user="test"
#数据库密码
passwd="test"
#数据库名
database="test"
#数据库ip
host="127.0.0.1"

BCK_DIR="/root/mysql-backups"  #备份文件目录

#在备份数据表中,是通过定义文件目录+日期目录+数据库名_数据表名.sql为命名规范,如今天备份的test表存储于/root/mysql-backups/2021-01-12/test_test.sql文件中
#所以在执行时需要传入指定日期和指定表参数,如需要还原2021-01-12号的test表,需执行sh mysql_restore.sh 2021-01-12 test
mysql -h$host -u$user -p$passwd $database < "${BCK_DIR}/${1}/${database}_${2}.sql"
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!