2012-11-05 42 views
7

以下工作:將時間添加到mysqldump cron job?

/usr/bin/mysqldump -u[username] -p[password] --all-databases --single-transaction > /home/[domain]/public_html/backups/full_backup_`date -I`.sql 

它導致「full_backup_2012-11-04.sql」

cron作業會每分鐘,但文件名是隻爲一天一次......我想以包括小時和分鐘的文件名以及....(最終的cron作業可能會運行每小時左右)

因此,日期-I工作...日期其他典型選項似乎工作......是否有任何文件說,我是有效的?如果這樣,文檔可能也有其他選項可行。

+1

我不確定爲什麼這個問題關閉。這似乎是一個很好的問題。 – ryvantage

回答

2

date -Iminutes可能是要走的路,它使用ISO 8601格式。 Wiki page有一些信息。

+0

我有一個cron作業每天運行兩次,至今已添加: 「full_backup_2012-11-14T00:00-0600.sql」 我只是檢查它是否繼續工作... –

3

使用date +%Y-%m-%d_%H-%M-%S代替(或任何其他形式):

EDITED

爲了避免從cron電子郵件長學科,使用創建一個文件/home/<your user>/mycron.sh(文件名和位置只是一個例子):

#!/bin/sh 
/usr/bin/mysqldump -u[username] -p[password] --all-databases --single-transaction > /home/[domain]/public_html/backups/full_backup_`date +%Y-%m-%d_%H-%M-%S`.sql 

確保你的chmod +x /home/<your user>/mycron.sh

此日期格式將輸出:

full_backup_2012-11-05_08-49-19.sql 

然後在你的cron腳本的名稱中使用,即:

[cron parameters] /home/<your user>/mycron.sh 
+1

嗨我正在使用cPanel X,並通過電子郵件發送以下內容: /bin/sh:-c:第0行:意外的EOF,同時尋找匹配的「'」 /bin/sh:-c:第1行:語法錯誤:意外的文件結尾 –

+0

在我之前的文章中,您可能想刪除新行和'\\'反斜槓。我只把它們放在這裏用於論壇的可讀性。我在編輯。 – JScoobyCed

+0

是的,我刪除了反斜槓。順便說一句,在它發送給我的電子郵件的主題行中,它最初表示「.../public_html/backups/full_backup_'date -I'.sql」,但現在它說「.../public_html/backups/full_backup_'date + 「 –

1

的日期(1)命令具有「+ [格式化] 「 選項。我相信你想要的選項是'%s'或'%N'選項,它們會分別給你秒或納秒。從您的MySQL路徑中,我將假設您在Linux上。如果確實如此,您可以找到幫助頁面here,它會給你更多的細節。

+0

我正在使用cPanel X .... BTW當前日期選項是-I ...我似乎無法在該聯機幫助頁上看到該選項。 –

1

雖然我原來的劇本的作品,這樣的事情可能會簡單得多:

mysqldump [options] | gzip -c > /backups/data-$(date +%a-%H00).sql.gz 

具體地說,這將讓7天值得備份。它通過使用星期幾加小時來工作。所以它看起來像data-Mon-00.sql.gz(星期一午夜)。當一週回滾時,先前的備份會被覆蓋。

如果您將您的cron設置爲每6小時運行一次,您將獲得多達28個備份(24/6) * 7 = 28

要使用mysqldump獲得一致的備份,您必須鎖定表,因此只能從副本或低容量服務器完成。 mysqldump也會創建一個完整的快照,因此最終會爲每個備份創建一個完整的快照,最終會佔用大量的磁盤空間。使用大型數據庫可能會很快變得無法管理。您也可能不想信任副本進行備份,因爲副本也必須保持同步。

更好的選擇是xtrabackup by Percona。它是開源的,所以它是免費的。它需要InnoDB表,並且能夠在不停機或鎖的情況下對主MySQL服務器進行熱備份(不應該使用MyISAM)。它使用帶有InnoDB崩潰恢復功能的經過修改的InnoDB引擎,以確保備份的一致性。它甚至可以對基本快照進行增量備份,因此您可以創建數百個備份並使其佔用單個快照的大小。它可以與MySQL,MariaDB,PerconaDB(MySQL forks)以及InnoDB和XtraDB(在MariaDB和Percona中都改進了InnoDB)一起使用。

就我個人而言,我會堅持xtrabackup,甚至不打擾與mysqldump。您必須以命令行的方式完成同樣多的工作,並且您還可以享受小增量備份帶來的額外好處。有些工具可以自動使用xtrabackup,即使在Galera集羣中也是如此。 Facebook uses it


原創劇本:

下面的腳本以「backup.sql.gz」,例如,並且把它變成像備份13Nov2012-01_30.sql.gz,然後用硬文件旋轉鏈接。

#!/bin/bash 
########################################################################### 
# snapshot 
# 
#  Rotates snapshots of backups using hard links 
# 
#  Keeps track of: 
#   - 48 hours of snapshots (48*60/interval) 
#   - 60 days worth of midnight snapshots 
#   - 24 months of snapshots from the 1st 
#  Ussage: 
#   snapshot /path/to/backup.sql.gz 
#   mysqldump ... | gzip -c | snapshot /path/to/backup.sql.gz 
# 
########################################################################### 

if ! hash date 2> /dev/null; then 
     echo "-snapshot: date command not found" 1>&2 
     exit 1 
fi 

if ! hash ln 2> /dev/null; then 
     echo "-snapshot: ln: command not found" 1>&2 
     exit 1 
fi 

# Date Info 

month=$(date +"%b") 
day=$(date +"%d") 
year=$(date +"%Y") 
time=$(date +"%H_%M") 
date=$(date +"%d%b%Y") 
dateFirst=$(date --date="$month 01" +"%d%b%Y" 2> /dev/null) 

# Test to see if we're using GNU date or BSD date 

if [ "$dateFirst" == "" ]; then 
     dateFirst=$(date -v1d +"%d%b%Y") 
     back2date=$(date -v-2d +"%d%b%Y") 
     back2monthY=$(date -v-2m +"%b%Y") 
     back2year=$(date -v-2y +"%Y") 
else 
     back2date=$(date --date="-2 day" +"%d%b%Y") 
     back2monthY=$(date --date="-2 month" +"%b%Y") 
     back2year=$(date --date="-2 year" +"%Y") 
fi 

if [ "$dateFirst" == "" ]; then 
     echo "-snapshot: Unknown version of date command." 1>&2 
     exit 1 
fi 

# Directories 

filepath=$1 
backup=$2 

if [ "$filepath" == "" ]; then 
     echo "-snapshot: Expecting filename as first argument" 1>&2 
     exit 1 
fi 

if [ "$backup" == "" ]; then 
     backup=/backup 
fi 

if [ ! -d "$backup" ]; then 
     echo "-snapshot: Directory "$backup" doesn't exist" 1>&2 
     exit 1 
fi 

snapshots=$backup/snapshots 
daily=$backup/daily 
monthly=$backup/monthly 
basename=${filepath##*/} 
ext=${basename#*.} 
basename=${basename%%.*} 
filename=$basename-$date-$time.$ext 

############################## 
# Make new snapshot 
############################## 

if [ ! -d "$snapshots/$date" ]; then 
     mkdir -p "$snapshots/$date" 
fi 

if [ -t 0 ]; then 
     if [ ! -f "$filepath" ]; then 
       echo "-snapshot: '$filepath' doesn't exist" 1>&2 
       exit 1 
     fi 

    ln "$filepath" "$snapshots/$date/$filename" 
else 
    cat > "$snapshots/$date/$filename" 
fi 

############################## 
# Daily/monthly snapshots 
############################## 

if [ "$time" == "00_00" ]; then 
     if [ ! -d "$daily/$month$year" ]; then 
       mkdir -p "$daily/$month$year" 
     fi 

     ln "$snapshots/$date/$filename" "$daily/$month$year/$filename" 

     if [ "$day" == "01" ]; then 
       if [ ! -d "$monthly/$year" ]; then 
         mkdir -p "$monthly/$year" 
       fi 

       ln "$snapshots/$date/$filename" "$monthly/$year/$filename" 
     fi 
fi 

############################## 
# Clean up old snapshots 
############################## 

if [ -d "$snapshots/$back2date" ]; then 
     rm -fr "$snapshots/$back2date" 
fi 

if [ -d "$daily/$back2monthY" ]; then 
     rm -fr "$daily/$back2monthY" 
fi 

if [ -d "$monthly/$back2year" ]; then 
     rm -fr "$monthly/$back2year" 
fi 
0

如果你想要做的這一切在crontab條目(而不是一個shell腳本),這裏是如何:

/usr/bin/mysqldump -u[username] -p[password] --all-databases --single-transaction > /home/[domain]/public_html/backups/full_backup_`date +\%F_\%R`.sql 

文件名將作爲輸出:full_backup_2017-08-18_17:52。 SQL

從您的命令關鍵的變化是這樣的:date +\%F_\%R

注:在date命令%必須在crontab中進行轉義,否則你可能會得到一個EOF錯誤。它將在命令行上工作而不會溢出%,但不會在crontab中。希望這可以幫助。