基于 mysql 鏡像的定時自動備份數(shù)據(jù)和清除過期備份

0. 環(huán)境

CentOS 7
mysql8鏡像
備份方式:mysqldump 命令

1. 實(shí)現(xiàn)

1.1 自動備份、清除腳本

mysql_backup.sh 腳本,本例將其放置在 /home/test/db_bk 文件夾下

#!/bin/bash
#備份日期
DATE=`date +%F`
#打印日志的時間
LOG_TIME=`date '+%c'`
#備份有效期30天
DATA_KEEP_ALIVED=30
#當(dāng)前日期時間戳,用于判斷備份是否過期
TODAY_TIMESTAMP=`date -d "-$DATA_KEEP_ALIVED day" +%s`
DB_USER="test_user"
DB_PASS="test_user2021@mysql"
DB_HOST="127.0.0.1"
DB_NAME="testdb"
DB_NAME1="testdb1"
DB_NAME2="testdb2"
#備份文件夾名稱
BACK_PATH="backup"
#數(shù)據(jù)掛載備份路徑,這個就是 mysql 鏡像啟動時掛載的路徑
BACK_DIR="/data/mysql/data_bak"
#容器中備份路徑,無需變動
CONTAINER_DIR="/var/lib/mysql/${BACK_PATH}"
#日志文件夾,就是想要存放 dumplog 的位置,自定義,文件夾不存在的話要自己建
LOG_PATH="/home/test/db_bk"

#創(chuàng)建備份文件夾,以日期為文件夾名進(jìn)行區(qū)分
sudo docker exec -i mysql bash -c "mkdir -p /var/lib/mysql/${BACK_PATH}/${DATE}"
#開始備份文件
sudo docker exec -i mysql bash -c "mysqldump --no-defaults -u${DB_USER} -p${DB_PASS} ${DB_NAME} > ${CONTAINER_DIR}/${DATE}/${DB_NAME}.sql"
sudo docker exec -i mysql bash -c "mysqldump --no-defaults -u${DB_USER} -p${DB_PASS} ${DB_NAME} > ${CONTAINER_DIR}/${DATE}/${DB_NAME1}.sql"
sudo docker exec -i mysql bash -c "mysqldump --no-defaults -u${DB_USER} -p${DB_PASS} ${DB_NAME} > ${CONTAINER_DIR}/${DATE}/${DB_NAME2}.sql"
sudo echo -e "\nMysql auto dump completed databese from ${DB_HOST} at ${LOG_TIME}" >> "${LOG_PATH}/dumplog"
#刪除過期備份
for back_path in `ls $BACK_DIR/$BACK_PATH`; do
     #日期轉(zhuǎn)換為時間戳
    file_time=`date -d "$back_path" +%s`
    if [ $file_time -lt $TODAY_TIMESTAMP ]
    then
        echo `sudo rm -rf $BACK_DIR/$BACK_PATH/$back_path`
        sudo echo "Mysql auto delete overdue data: ${back_path}  at ${LOG_TIME}" >> "${LOG_PATH}/dumplog"
    fi
done

執(zhí)行以上腳本后,會在掛在路徑下生成 “/backup/日期” 的文件夾,文件夾內(nèi)存著備份的 sql 文件,當(dāng)需要恢復(fù)備份時,執(zhí)行對應(yīng)的 sql 文件即可。

1.2 定時任務(wù)

Linux 內(nèi)置的 cron 進(jìn)程可以用于開啟定時任務(wù)
cron進(jìn)程簡介
進(jìn)入 cron 編輯器:

#進(jìn)入 cron 編輯器,使用方法和 vim 相同
crontab -e

編輯cron命令:

#每天凌晨 3:00 進(jìn)行數(shù)據(jù)備份,格式就是: cron 表達(dá)式 + shell 命令;值得注意的是,這里得 cron 表達(dá)式是沒有秒的,從分開始
0 3 * * * sh /home/test/db_bk/mysql_backup.sh

可以通過以下命令,查看定時任務(wù)情況:

cat /var/spool/mail/test

1.3 執(zhí)行 sql 文件,恢復(fù)備份數(shù)據(jù)

執(zhí)行以上腳本后,會在掛在路徑下生成 “/backup/日期” 的文件夾,文件夾內(nèi)存著備份的 sql 文件,當(dāng)需要恢復(fù)備份時,執(zhí)行對應(yīng)的 sql 文件即可。

1.3.1 第三方工具實(shí)現(xiàn)

可以把備份的 sql 文件導(dǎo)出,然后用 navicat 之類的工具執(zhí)行 sql 文件即可。

1.3.2 連接 mysql 執(zhí)行

1.3.2.1
*注意:需要設(shè)置字符集,否則會亂碼,mysql -u [用戶] -p --default-character-set=utf8mb4

#目前執(zhí)行報錯,未解決,ERROR 3546 (HY000) at line 24: @@GLOBAL.GTID_PURGED cannot be changed: the added gtid set must not overlap with @@GLOBAL.GTID_EXECUTED,
sudo docker exec -i mysql bash -c "mysql -utest_user -ptest_user2021@mysql -Dtestdb < /var/lib/mysql/backup/2021-08-18/testdb.sql"

1.3.2.2

#1.進(jìn)入容器
sudo docker exec -it bash mysql bash
#2.連接 mysql, 并通過 -D 選擇數(shù)據(jù)庫,也可以不用 -D,進(jìn)入數(shù)據(jù)庫后,通過 use testdb 數(shù)據(jù)庫也行
mysql -utest_user -ptest_user2021@mysql -Dtestdb
#3.執(zhí)行 sql 文件
source /var/lib/mysql/backup/2021-08-18/testdb.sql
#或者用這個命令執(zhí)行 sql 文件,效果相同
\. /var/lib/mysql/backup/2021-08-18/testdb.sql

2. mysqldump

#適用于手動備份,輸入命令后還要輸入密碼,相對安;但是寫在腳本中,需要把密碼加載 -p 之后
#dbnames,tables 都可以指定多個
mysqldump -u username -p dbnames [tables] > BackupName.sql;

數(shù)據(jù)庫備份方式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容