備份數(shù)據(jù)庫腳本mysql_backup_docker_dbname.sh
#!/bin/bash
# 設置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=15
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 在定時任務中 不執(zhí)行
# 備份指定數(shù)據(jù)庫中數(shù)據(jù)(此處假設數(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ù)庫密碼明文顯示不安全,沒關系)
cd 到腳本目錄下
執(zhí)行命令
sh mysql_daybackup.sh
看到備份出來
使用crontab 進行定時備份 每天備份一次
#新建定時任務命令
crontab -e
#查看定時任務命令
crontab -l
#刪除所有定時任務命令
crontab -r
crontab定時命令
crontab -e
編輯 定時任務表 添加下面內(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
在編輯界面 輸入i 開始輸入上面的內(nèi)容
輸入 : 退出到 命令行界面
輸入 wq 保存退出
在 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
可以使用命令查看定時任務
crontab -l
然后重啟crontab服務
service crond restart
systemctl restart crond
#Ubuntu上的服務名稱是cron不是`crond`。所以你的命令應該是:
sudo service cron start
恢復命令(這個報錯是說 數(shù)據(jù)庫密碼明文顯示不安全,沒關系)
docker exec -i docker容器ID mysql -uroot -p數(shù)據(jù)庫密碼 -D 需要恢復的數(shù)據(jù)庫名 < ./20210903_對應的備份好的數(shù)據(jù)庫名.sql
#使用減壓命令 在文件 wms_202310110205.sql.gz 目錄下
gunzip wms_202310110205.sql.gz
把備份好的sql.gz文件 減壓后 db_name_20220331.sql
執(zhí)行下面的命令
docker exec -i docker容器名或ID sh -c 'exec mysql -h8.120.152.117 -P3306 -uroot -p"root&" -D 需要恢復的數(shù)據(jù)庫名' < /mysql-backup/db_name_20220331.sql
docker exec -i mysql-3308 sh -c 'exec mysql -h192.168.1.109 -P3308 -uroot -p"root2020&" -D wms_202410' < /data/mysql-back/wms/wms_2024-10-11.sql
在 ubutn 麒麟系統(tǒng)中 命令行 前面加 sudo
使用 dbeaver 工具 還原數(shù)據(jù)庫 使用上面的 數(shù)據(jù)庫備份db_name_20220331.sql
如果不成功 打開備份sql文件
把 下面 兩句注釋了,重新還原,成功
-- CREATE DATABASE `test_db`
-- USE `test_db`;
錯誤排查
錯誤1
添加定時任務crontab -e
時出現(xiàn)了
no crontab for chenrui - using an empty one
No modification made
chenrui是我機器的名字,也就是當前用戶的username
解決方法是,根據(jù)你的系統(tǒng)確定系統(tǒng)的編輯器是什么。
我的是vim,那么解決方法是:切換到root用戶,終端輸入
export EDITOR=vim
如果是emacs,切換到root用戶,終端輸入
export EDITOR=emacs
如果是nano,切換到root用戶,終端輸入
export EDITOR=nano
知道解決方法后,這個錯誤的原因是,系統(tǒng)沒有指定默認的編輯器。上面的命令也就是選擇一個默認編輯器就可以了。
再此執(zhí)行crontab -e。
錯誤2
在linux下修改crontab,新增了一個定時任務,保存后報以下錯誤:
errors in crontab file, can’t install
檢查發(fā)現(xiàn)是新增的定時任務格式不對,在每天8:30執(zhí)行某個sh腳本的crontab命令本來應該是這樣:
30 8 * * * sh腳本
錯誤3
麒麟系統(tǒng) 中 sh文件 報錯
mysql_backup_wms.sh: 41: [: ON: unexpected operator
使用的Linux發(fā)行版為Ubuntu 22.4,根本原因是:
從Ubuntu 6.10開始,默認使用dash(theDebian Almquist Shell)而不是bash(the GNUBourne-Again Shell).
但Login Shell(一開始通過字符界面登入系統(tǒng),不是通過x window界面打開terminal終端的shell)還是bash. 原因是dash更快、更高效,而且它符合POSIX規(guī)范。Ubuntu在啟動的時候會運行很多shell腳本,使用dash可以加快啟動速度。
而Bash(GNU Bourne-Again Shell)是大多數(shù)Linux平臺的內(nèi)定Shell,也是更經(jīng)典的shell工具。
解決辦法就是將dash替換為bash
sudo dpkg-reconfigure dash
執(zhí)行命令會產(chǎn)生一個界面,英文大概意思為:是否使用dash作為默認的系統(tǒng)shell工具,我們選擇“No”