由於一些練手的小項目和我的博客可能會隨時用到MySQL,就在雲服務器上安裝了MySQL,有時候程序出bug或者本身誤刪了數據還真很差找回,就想寫個腳本實現MySQL數據庫數據自動備份,並按期刪除以前的備份文件。這篇文章寫的十分詳細,適用於小白。固然,這只是很是簡單數據備份而已,不適用於企業項目,有關數據安全的文章能夠看我以前發的:由最近的刪庫事件聯想到「更改rm命令實現Linux下的回收站機制」
mysql
備份以前儘可能選擇空間充足的磁盤,咱們用df命令查看磁盤空間:sql
df -h
由上能夠看出,主目錄 / 下空間充足shell
cd /mkdir backup
也可自行選擇建立目錄:
數據庫
建立backup.sh腳本並編輯vim
vim backup.sh 或vi backup.sh
這裏是直接在shell當前所處目錄建立,我將腳本文件建立在 /目錄下segmentfault
enter以後按i進入insert模式,就能夠開始編寫腳本文件了 。安全
注意:編輯模式下的案件都是在英文輸入模式下的 。bash
首先,咱們要知道MySQL的備份命令:服務器
mysqldump
這裏主要有兩種寫法,但原理相同:測試
mysqldump -uusername -ppassword database_name > /backup/database_name_$(date +%Y%m%d%H%M%S).sql
注: 1.username、password、database_name替換爲本身的數據庫用戶名、密碼、須要備份的數據庫名
2. database_name_$(date +%Y%m%d%H%M%S)爲生成的備份文件名稱,可自定義,這裏文件名是數據庫名 + 下劃線 + 具體時間,$(date +%Y%m%d%H%M%S)可獲取到當前日期,%Y %m %d %H %M %S 分別對應年、月、日、時、分、秒 壓縮備份:
mysqldump -uusername -ppassword database_name | gzip > /backup/database_name$(date +%Y%m%d%H%M%S).sql.gz
也能夠選擇備份全部數據:
mysqldump -uusername -ppassword --all-databases > /backup/database_name_$(date +%Y%m%d%H%M%S).sql mysqldump -uusername -ppassword --all-databases | gzip > /backup/database_name$(date +%Y%m%d%H%M%S).sql.gz
請複製以上代碼時候注意空格和回車。
db_user="username" db_password="password" db_name="database_name" # the directory for story your backup file.you shall change this dir backup_dir="/backup" # date format for backup file (dd-mm-yyyy) time="$(date +"%Y%m%d%H%M%S")" #!/bin/bash mysqldump -u$db_user -p$db_password --all-databases > $backup_dir/sqldata_$time.sql #!/bin/bash mysqldump -u$db_user -p$db_password --all-databases | gzip > $backup_dir/$db_name"_"$time.sql.gz
備份全部數據:
#!/bin/bash mysqldump -u$db_user -p$db_password --all-databases > $backup_dir/sqldata_$time.sql #!/bin/bash mysqldump -u$db_user -p$db_password --all-databases | gzip > $backup_dir/$db_name"_"$time.sql.gz
腳本編輯完成後,按ESC退出編輯模式,直接鍵入 :wq保存並退出。
chmod u+x backup.sh 或chmod +x backup.sh
這個命令要在文件存在的路徑下執行才行,或者
chmod u+x /direction/backup.shchmod +x /direction/backup.sh
u 表明用戶.
g 表明用戶組.
o 表明其餘.
a 表明全部.
chmod是權限管理命令change the permissions mode of a file的縮寫 。chmod u+x file.sh 表示對當前目錄下的file.sh文件的全部者增長可執行權限chmod +x 和 chmod a+x 同樣,表示爲全部用戶增長可執行權限。
先手動測試咱們所寫腳本的正確性和可執行性 找到文件所在位置,或者添加路徑,啓動命令:
./backup.sh
./backup.sh
而後彈出兩行警告:不要緊的,這是MySQL警告咱們明文使用了密碼,哈哈。滅有關係滴。
這個時候咱們切換到/backup目錄下,查看腳本是否執行成功!
腳本執行成功!
可見,已經有了備份文件,證實咱們的腳本是沒有問題的。
執行crontab 命令,若是輸出 command not found,就代表沒有安裝 這是要先安裝crontab,網上有教程,這裏再也不贅述 個人Linux服務器系統爲Centos7,crontab 已經安裝好 執行命令:
crontab -e
和 vim 編輯同樣,英文輸入下按 i 進入insert模式,就能夠添加定時任務了
分 時 日 月 周 執行命令
第 1 列分鐘 1~59,每分鐘用 *或者*/1表示,整點分鐘數爲00或0
第 2 列小時 1~23(0 表示 0 點)
第 3 列日 1~31
第 4 列月 1~12
第 5 列星期 0~6(0 表示星期天)
第 6 列要運行的命令 。
0 3 * * * /backup.sh,此命令表示在天天的凌晨三點執行一次腳本,可自行調整時間,注意要使用腳本的絕對路徑。
只是一味地備份是不行的,磁盤再大,也有用完的時候,何況保存好久之前的數據也沒有任何意義,咱們須要備份的是近期最新的數據,因此按期刪除文件就頗有必要了 按期刪除,咱們只須要在腳本文件中添加如下命令:
#刪除七天以前的備份find /backup/mysql/ -name $db_name"*.sql.gz" -type f -mtime +7 -exec rm -rf {} \; > /dev/null 2>&1 #刪除一分鐘以前的備份find /backup/mysql/ -name $db_name"*.sql.gz" -type f -mmin +1 -exec rm -rf {} \; > /dev/null 2>&1
-type f 表示查找普通類型的文件,f 表示普通文件,可不寫 。
-mtime +7 按照文件的更改時間來查找文件,+7表示文件更改時間距如今7天之前;若是是-mmin +7表示文件更改時間距如今7分鐘之前 。
-exec rm {} ; 表示執行一段shell命令,exec選項後面跟隨着所要執行的命令或腳本,而後是一對{ },一個空格和一個\,最後是一個分號;
/dev/null 2>&1把標準出錯重定向到標準輸出,而後扔到/DEV/NULL下面去。通俗的說,就是把全部標準輸出和標準出錯都扔到垃圾桶裏面;其中的& 表示讓該命令在後臺執行。
這是所有命令的截圖:
這是所有代碼,沒有格式,適合複製粘貼:
mysqldump -uusername -ppassword --all-databases > /backup/mysql/mbook_$(date +%Y%m%d%H%M%S).sql mysqldump -uusername -ppassword --all-databases | gzip > /backup/mysql/mbook_$(date +%Y%m%d%H%M%S).sql.gz find /backup/mysql/ -name $mbook"*.sql.gz" -type f -mtime +30 -exec rm -rf {} \; > /dev/null 2>&1 find /backup/mysql/ -name $mbook"*.sql" -type f -mtime +30 -exec rm -rf {} \; > /dev/null 2>&1