備份數(shù)據(jù)庫腳本mysql_backup_docker_dbname.sh
#!/bin/bash
# 設(shè)置mysql的登錄用戶名和密碼(根據(jù)實際情況填寫)
mysql_user="root"
mysql_password="root&"
mysql_host="6.135.32.78"
mysql_port="3306"
mysql_charset="utf8mb4"
mysql_database="db_name"
mysql_docker_name="mysql_docker"
# export MYSQL_PWD=${mysql_password}
# 備份文件存放地址(根據(jù)實際情況填寫)
backup_location=/mysql-backup/dbname
#如果文件夾不存在,創(chuàng)建文件夾
if [ ! -d $backup_location ]; then
mkdir $backup_location
fi
# 是否刪除過期數(shù)據(jù)
expire_backup_delete="OFF"
expire_days=30
backup_time=`date +%Y%m%d%H%M`
backup_dir=$backup_location
backup_file_name=$mysql_database"_"$backup_time".sql"
backup_file_name_zip=$mysql_database"_"$backup_time".sql.gz"
welcome_msg="Welcome to use MySQL backup tools!"
# 加上參數(shù) -t 在定時任務(wù)中 不執(zhí)行
# 備份指定數(shù)據(jù)庫中數(shù)據(jù)(此處假設(shè)數(shù)據(jù)庫是mysql_backup_test)
# docker exec -i mysql_docker mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -B $mysql_database > $backup_dir/mysql_backup_test-$backup_time.sql
# 正常備份
# docker exec -i $mysql_docker_name mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password --default-character-set $mysql_charset --databases $mysql_database > $backup_dir/$backup_file_name
# 壓縮 備份
docker exec -i $mysql_docker_name mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password --default-character-set $mysql_charset --databases $mysql_database | gzip> $backup_dir/$backup_file_name_zip
# 刪除過期數(shù)據(jù)
if [ "$expire_backup_delete" == "ON" -a "$backup_location" != "" ];then
`find $backup_location/ -type f -mtime +$expire_days | xargs rm -rf`
echo "Expired backup data delete complete!"
fi
可以執(zhí)行一下腳本看看 mysql_backup_file 文件會不會有備份出來的sql文件
執(zhí)行腳本命令 - (這個報錯是說 數(shù)據(jù)庫密碼明文顯示不安全,沒關(guān)系)
cd 到腳本目錄下
執(zhí)行命令
sh mysql_daybackup.sh
看到備份出來
使用crontab 進行定時備份 每天備份一次
#新建定時任務(wù)命令
crontab -e
#查看定時任務(wù)命令
crontab -l
#刪除所有定時任務(wù)命令
crontab -r
crontab定時命令
crontab -e
編輯 定時任務(wù)表 添加下面內(nèi)容
每5分鐘執(zhí)行一次
*/5 * * * * sh /mysql-backup/mysql_backup_docker_dbname.sh
每天的 2:05 執(zhí)行
5 2 * * * sh /mysql-backup/mysql_backup_docker_dbname.sh
在 crontab 命令中只有 “絕對路徑”,不存在相對路徑,故執(zhí)行任何命令都需要寫絕對路徑
1、每小時的第5分鐘執(zhí)行 ls 命令
5 * * * * ls
2、每5分鐘執(zhí)行 ls 命令
*/5 * * * * ls
3、每天的 4:30 執(zhí)行 ls 命令
30 4 * * * ls
4、每小時執(zhí)行 ls 命令
0 * * * * ls
5、每天執(zhí)行 ls 命令
0 0 * * * ls
可以使用命令查看定時任務(wù)
crontab -l
然后重啟crontab服務(wù)
service crond restart
systemctl restart crond
恢復(fù)命令(這個報錯是說 數(shù)據(jù)庫密碼明文顯示不安全,沒關(guān)系)
docker exec -i docker容器ID mysql -uroot -p數(shù)據(jù)庫密碼 -D 需要恢復(fù)的數(shù)據(jù)庫名 < ./20210903_對應(yīng)的備份好的數(shù)據(jù)庫名.sql
把備份好的sql 減壓后 db_name_20220331.sql
減壓命令如下
gzip -d -k db_name_20230331.sql.gz
執(zhí)行下面的命令
docker exec -i docker容器名或ID sh -c 'exec mysql -h8.120.152.117 -P3306 -uroot -p"root&"' -D 需要恢復(fù)的數(shù)據(jù)庫名 < /mysql-backup/db_name_20220331.sql
錯誤排查
錯誤1
添加定時任務(wù)crontab -e
時出現(xiàn)了
no crontab for chenrui - using an empty one
No modification made
chenrui是我機器的名字,也就是當(dāng)前用戶的username
解決方法是,根據(jù)你的系統(tǒng)確定系統(tǒng)的編輯器是什么。
我的是vim,那么解決方法是:切換到root用戶,終端輸入
export EDITOR=vim
如果是emacs,切換到root用戶,終端輸入
export EDITOR=emacs
如果是nano,切換到root用戶,終端輸入
export EDITOR=nano
知道解決方法后,這個錯誤的原因是,系統(tǒng)沒有指定默認(rèn)的編輯器。上面的命令也就是選擇一個默認(rèn)編輯器就可以了。
再此執(zhí)行crontab -e。
錯誤2
在linux下修改crontab,新增了一個定時任務(wù),保存后報以下錯誤:
errors in crontab file, can’t install
檢查發(fā)現(xiàn)是新增的定時任務(wù)格式不對,在每天8:30執(zhí)行某個sh腳本的crontab命令本來應(yīng)該是這樣:
30 8 * * * sh腳本