#!/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...