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