1. 備份腳本
#!/bin/bash
# MySQL連接信息
DB_HOST="localhost"
DB_USERNAME="root"
DB_PASSWORD="password"
# 要備份的數(shù)據(jù)庫名稱
DATABASES=("database1" "database2")
# 備份文件存放路徑
BACKUP_DIR="/path/to/backup/"
DATE=$(date +%Y-%m-%d)
TIMESTAMP=$(date +%H:%M:%S)
FILENAME="${BACKUP_DIR}/backup_${DATE}_${TIMESTAMP}.tar.gz"
# 創(chuàng)建備份目錄(如果不存在)
mkdir -p $BACKUP_DIR
for db in ${DATABASES[@]}; do
# 使用mysqldump命令進(jìn)行備份初坠,并重定向輸出到tar壓縮文件中
mysqldump --host=$DB_HOST --user=$DB_USERNAME --password=$DB_PASSWORD --default-character-set=utf8mb4 $db > "$BACKUP_DIR/$db.sql"
done
# 使用tar命令將每個(gè)數(shù)據(jù)庫的備份文件壓縮為一個(gè)tar.gz文件
tar -czvf "$FILENAME" -C "$BACKUP_DIR" *.sql
# 刪除單個(gè)備份文件
rm -f "$BACKUP_DIR"/*.sql
echo "數(shù)據(jù)庫備份完成世舰!"
這個(gè)腳本將使用mysqldump命令備份每個(gè)數(shù)據(jù)庫,并將結(jié)果保存為單獨(dú)的SQL文件殉簸。然后鲤氢,使用tar命令將這些文件壓縮為一個(gè).tar.gz格式的壓縮文件。最后,刪除備份的SQL文件档叔,并輸出提示消息“數(shù)據(jù)庫備份完成”。
2. 清理腳本
#刪除七天前備份蒸绩,也就是只保存7天內(nèi)的備份
#!/bin/bash
# 備份文件存放路徑
BACKUP_DIR="/path/to/backup/"
find $BACKUP_DIR -name "*.tar.gz" -type f -mtime +7 | xargs -I {} rm -rf {}
3. 設(shè)置定時(shí)任務(wù)
1.輸入 crontab -e 并按回車鍵衙四,這會(huì)打開cron定時(shí)任務(wù)的配置文件。
2.在配置文件中患亿,添加以下行來設(shè)置每天凌晨執(zhí)行備份传蹈、清理腳本:
0 1 * * * /path/to/backup_script.sh
0 2 * * * /path/to/clean_script.sh
4. 可能遇到的問題
4.1 mysql部署在容器中
docker exec mysql sh -c 'exec mysqldump --host=$DB_HOST --user=$DB_USERNAME --password=$DB_PASSWORD --default-character-set=utf8mb4 $db' > "$BACKUP_DIR/$db.sql"
腳本通過如上命令進(jìn)行備份無效,因?yàn)槿萜鲀?nèi)讀不到變量步藕,可以將腳本放置容器內(nèi)惦界,或者建mysql的時(shí)候設(shè)置env
4.2 導(dǎo)出的sql文件存在亂碼
這個(gè)可能和服務(wù)器及文件的字符集有關(guān)。
實(shí)踐過程中我遇到cat中文顯示正常咙冗,vim中文顯示異常的現(xiàn)象沾歪,通過vim中的set fileencoding 查看文件編碼,異常的sql文件編碼為latin1雾消,通過:set fileencoding=utf-8轉(zhuǎn)換仍是顯示異常灾搏?并且導(dǎo)出多個(gè)庫只有一個(gè)sql文件存在這種問題挫望?求指教
vim編碼方面的基礎(chǔ)知識(shí):
存在3個(gè)變量:
encoding—-該選項(xiàng)使用于緩沖的文本(你正在編輯的文件),寄存器确镊,Vim 腳本文件等等士骤。你可以把 ‘encoding’ 選項(xiàng)當(dāng)作是對(duì) Vim 內(nèi)部運(yùn)行機(jī)制的設(shè)定。
fileencoding—-該選項(xiàng)是vim寫入文件時(shí)采用的編碼類型蕾域。
termencoding—-該選項(xiàng)代表輸出到客戶終端(Term)采用的編碼類型拷肌。
此3個(gè)變量的默認(rèn)值:
encoding—與系統(tǒng)當(dāng)前l(fā)ocale相同,所以編輯文件的時(shí)候要考慮當(dāng)前l(fā)ocale旨巷,否則要設(shè)置的東西就比較多了巨缘。
fileencoding—vim打開文件時(shí)自動(dòng)辨認(rèn)其編碼,fileencoding就為辨認(rèn)的值采呐。如果fileencoding為空則保存文件時(shí)采用encoding的編碼珠十,如果沒有修改encoding,那值就是系統(tǒng)當(dāng)前l(fā)ocale了访娶。
termencoding—默認(rèn)空值冰寻,也就是輸出到終端時(shí)不進(jìn)行編碼轉(zhuǎn)換。
4.3 source導(dǎo)入亂碼
登錄時(shí)候加上編碼
mysql --host=$DB_HOST --user=$DB_USERNAME --password=$DB_PASSWORD --default-character-set=utf8mb4
4.4 高版本mysqldump導(dǎo)出低版本mysql數(shù)據(jù)報(bào)錯(cuò)
出現(xiàn)如下報(bào)錯(cuò)信息:
Unknown table 'COLUMN_STATISTICS' in information_schema (1109)
這是由于在mysqldump 8中默認(rèn)啟用了一個(gè)新標(biāo)志煤率,
可以通過添加--column-statistics=0 來禁用它
4.5 crontab不生效
現(xiàn)象:手動(dòng)執(zhí)行命令可以成功仰冠,cron定時(shí)任務(wù)發(fā)現(xiàn)失敗
原因:傳入了一個(gè)日期參數(shù)$(date +%Y%m%d),但是 %在crontab文件里是個(gè)特殊符號(hào)蝶糯,相當(dāng)于回車洋只,因此命令不能正常執(zhí)行
解決:在%前加上反斜杠\,進(jìn)行轉(zhuǎn)義就可以了
另外cron執(zhí)行docker失敗是可能因?yàn)閑xec加了-it參數(shù)