資料庫單表備份還原shell

oliver-l發表於2021-01-13

編寫了指定多表的資料庫備份的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 協議》,轉載必須註明作者和本文連結

相關文章