簡體   English   中英

Crontab 和 bash 文件中的 mysqldump 問題

[英]mysqldump problem in Crontab and bash file

我創建了一個 cron 選項卡來每 30 分鍾備份一次我的數據庫...

*/30 * * * * bash /opt/mysqlbackup.sh > /dev/null 2>&1

cron 選項卡運行良好.. 每 30 分鍾我都會使用下面的腳本進行備份。

#!/bin/sh
find /opt/mysqlbackup -type f -mtime +2 -exec rm {} +
mysqldump --single-transaction --skip-lock-tables --user=myuser -- 
password=mypass mydb | gzip -9 > /opt/mysqlbackup/$(date +%Y-%m-%d-%H.%M)_mydb.sql.gz

但我的問題是刪除舊數據的 rm 函數不起作用..這永遠不會被刪除..你知道為什么嗎?

還有...我的備份名稱是 2020-02-02-12.12_mydb.sql.gz?

我總是有一個? 在我的文件名末尾.. 你知道為什么嗎?

感謝您的幫助

問號通常表示無法顯示的字符; 它位於行尾這一事實讓我認為您的腳本具有 Windows 行尾而不是 Unix。 您可以使用dos2unix命令修復該問題: dos2unix /path/to/script.sh

不要在 CLI 上亂扔 MySQL 密碼或將它們存儲在可執行腳本中也是一個好習慣。 您可以通過使用MySQL 選項文件來完成此操作,特別是定義用戶級選項 ( ~/.my.cnf ) 的文件。

然而,這需要我們弄清楚哪個用戶正在執行該 cronjob。 我的假設是您沒有在系統級 crontab 中進行該定義; 如果有,您實際上會嘗試以用戶bash身份執行/opt/mysqlbackup.sh > /dev/null 2>&1 該用戶很可能不(也不應該)存在,因此 cron 將無法完全執行腳本。

由於情況並非如此(您說它正在執行 mysqldump 就好了),這讓我相信您在用戶級 crontab 中有定義。 一旦我們確定了我在評論中要求的實際用戶,我們就可以確定文件權限問題並創建上述 MySQL 選項文件。

findmtime一起使用並不是最佳選擇。 如果由於某種原因 mysqldump 停止創建備份,那么在兩天內所有備份將被刪除。

您可以使用我的 Python 腳本“rotate-archives”進行智能刪除備份。 https://gitlab.com/k11a/rotate-archives )。 該腳本在文件或目錄名稱的開頭添加當前日期。 像 2020-12-31_filename.ext。 隨后使用此日期來決定刪除。

針對您的問題運行腳本:

rotate-archives.py test_mode=off age_from-period-amount_for_last_timeslot=0-0-48 archives_dir=/mnt/archives

在這種情況下,將始終保存 48 個新檔案。 超過此數量的舊檔案將被刪除。

更靈活的檔案刪除示例:

rotate-archives.py test_mode=off age_from-period-amount_for_last_timeslot=7-5,31-14,365-180-5 archives_dir=/mnt/archives

因此,將保留 7 到 30 天的存檔,存檔時間間隔為 5 天,31 到 364 天的存檔時間間隔為 14 天,存檔時間間隔為 365 天,存檔時間間隔為 180 天和5的數量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM