mysql定時備份

2021-09-19 09:37:10 字數 4200 閱讀 8440

#!/bin/bash

#每天早上4點, mysql備份資料

#chmod 700 backup.sh

#crontab -e

#0 4 * * * /home/mysqlbackup/mysql_backup.sh

user="root"

password="root"

host="127.0.0.1"

db_name="shop-parent"

#backup directory 

base_dir="/home/mysqlbackup"

backup_log="$/mysql_backup.log"

backup_path=$

#file info

date=$(date +"%y-%m-%d")

filename=$backup_path/$db_name-$date.sql.gz

umask 177

#back up 

mysqldump --user=$user --password=$password --host=$host $db_name | gzip > $filename

#delete files older than 10 days

find $backup_path/* -mtime +10 -exec rm {} \;

echo "backup finished at $(date +'%y-%m-%d %h:%m:%s')" >> "$backup_log"

重啟:service crond restart

以下為遇到的問題:

一些人喜歡用vim來寫linux shell script, 但是, 有的人喜歡在windows下用一些方便的編輯器(比如鼎鼎大名的notepad++)寫好, 然後拷貝檔案到linux下, 結果呢, 在執行指令碼a.sh的時候, 會出現如下問題:

[plain]view plain

copy

[taoge@localhost learn_shell]$ ./a.sh   

bash: ./a.sh: /bin/bash^m: bad interpreter: no such file or directory  

[taoge@localhost learn_shell]$   

什麼原因呢, 我們有理由懷疑是檔案格式問題? 我們用vim a.sh進入a.sh這個檔案, 然後在底部模式下, 執行:set ff檢視一下, 結果發現fileformat=dos, 看看, 果然是檔案格式問題, 那怎麼解決呢?

方法一:vim a.sh進入a.sh後, 在底部模式下, 執行:set fileformat=unix後執行:x或者:wq儲存修改。 然後就可以執行./a.sh執行指令碼了。(我親自試過, 是ok的)

方法二:直接執行sed -i "s/\r//" a.sh來轉化, 然後就可以執行./a.sh執行指令碼了。(我親自試過, 是ok的)

方法三:直接執行dos2unix a.sh來轉化, 然後就可以執行./a.sh執行指令碼了。(我的linux上執行dos2unix ./a.sh失敗, 但是不要放棄啊, 加個busybox就可以了), 如下:

[plain]view plain

copy

dos2unix a.sh   

bash: dos2unix: command not found  

[taoge@localhost learn_shell]$ busybox dos2unix a.sh   

[taoge@localhost learn_shell]$  

先用一條find命令查詢mysqldump的所載路徑

find  / -name mysqldump -print

然後再用ln命令鏈結到/usr/bin下面

ln -fs /usr/local/mysql/bin/mysqldump /usr/bin

注意 /usr/local/mysql/bin/mysqldump要為剛才輸出的路徑。

原理:直接輸入命令mysqldump會發現提示命令不存在,是由於系統缺省會查詢/usr/bin下的命令,如果這個命令不在這個目錄下,自然會找不到命令,並報錯。

檢視crontab 日誌

tail -f /var/log/cron

可是我的mysql是用docker安裝的,所以以上解決方法不可以解決

docker中備份mysql

定時備份:

#!/bin/bash

#每天早上2點, mysql備份資料

#chmod 700 backup.sh

#crontab -e

#0 0 2 * * ? /home/mysqlbackup/mysql_backup.sh

user="root"

password="root"

host="localhost"

db_name="shop-parent"

#backup directory 

base_dir="/home/mysqlbackup/shop"

backup_log="$/mysql_backup.log"

backup_path=$

#file info

date=$(date +"%y-%m-%d")

filename=$backup_path/$db_name-$date.sql

umask 177

#back up 

#docker exec -it mysql3306 mysqldump -u$user -p$password $db_name > $filename

#加 -it 每次輸出的大小都為0,mysqldump 也要指定一下絕對路徑 /usr/bin/mysqldump

#或用/usr/bin/docker exec mysql3306 /usr/bin/mysqldump -u$user -p$password $db_name > $filename

docker exec mysql3306 /usr/bin/mysqldump -u$user -p$password $db_name > $filename

#delete files older than 10 days

find $backup_path/* -mtime +10 -exec rm {} \;

echo "backup finished at $(date +'%y-%m-%d %h:%m:%s')" >> "$backup_log"

今天遇到個問題,在定時備份時 去檢視備份檔案,發現大小竟然為0,執行 備份s**件備份, 備份的sql檔案大小正常.試了幾種辦法。

最終解決辦法:

問題原因:

因為我設定的環境變數 就直接在sh中 使用 mysqldump *** 備份.  在其他目錄可以 但是在定時任務中 它是在/etc/crontab中執行 

解決辦法:

將mysqldum 設定為絕對路徑  mysql安裝目錄/bin/mysqldum  ***x.

crontab執行的mysqldump要把命令的絕對路徑寫全,比如:

/usr/local/mysql/bin/mysqldump ...

這樣就能正確執行了。

或docker exec -it mysql3306 /usr/bin/mysqldump -uroot -proot shop-parent > /home/mysqlbackup/shop/shop-parent.sql

或  但是crontab定時執行的時候dump出來的檔案大小始終是0,後來發現去掉-it就可以了,按照文件解釋-t是分配乙個偽終端,但是crontab執行的時候實際是不需要的

docker exec mysql3306 /usr/bin/mysqldump -uroot -proot shop-parent > /home/mysqlbackup/shop/shop-parent.sql

mysql定時備份指令碼 MySql定時備份指令碼

最近需要對某服務的資料庫資料進行備份,因此參考網上教程完成資料庫備份指令碼.因為服務的使用頻率較低,因此設定定時任務,在每天的中午以及午夜時分進行備份操作.bin bash 設定mysql的登入使用者名稱和密碼 根據實際情況填寫 mysql user mysql password mysql hos...

MySql 定時備份

mysql bat echo off set month date 3,2 set day date 0,2 set year date 6,4 d redmine bitnam 1 mysql bin mysqldump opt ubackup pbackup h 192.168.122.111 ...

mysql定時備份

2009 01 191.cron介紹 分 時 日 月 星期 要執行的命令 crontab命令的一般形式為 crontab u user e l r 其中 u 使用者名稱。e 編輯crontab檔案。l 列出crontab檔案中的內容。r 刪除crontab檔案。2.mysqldump介紹 add d...