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;