昨天做了MySQL數據庫的備份基本操作的實驗,今天試一下MySQL數據庫的定時自動備份。
大概思路就是,首先為備份文件單獨創建一個目錄,然后再目錄下創建Shell腳本里寫上執行數據庫備份的命令,並且給這個Shell腳本添加可執行的權限,最后給這個Shell腳本添加到crond計划任務,讓它每天定時執行。
1、首先進入home目錄,創建一個mysqlBackup的目錄,然后進入這個目錄
2、創建一個.sh后綴的文件,
3、編輯Shell腳本,備份所有數據庫到/home/mysqlBackup目錄下,並命名為Back_年月日_時分秒.sql
4、為備份文件添加X執行操作,並且我取消了同組、其他用戶的讀權限,因為腳本里面有數據庫密碼=..=
5、執行一下康康
成功了
6、下面刪倆庫,拿這個恢復備份測試一下
當前狀態:
把兩測試用的庫刪了
恢復備份
但是這里報錯了,我又試了一下手工備份,發現是可以恢復的
這個問題花了我半天時間,最后發現原因是出在了腳本上,腳本里面的sql語句是將密碼直接寫在了參數-p 后面,而之前的操作都是-p后面沒有輸入密碼通過后面密碼出入窗輸入的。
下面對比一下不直接輸入密碼和直接輸入密碼生成的兩個文件a.sql和b.sql
下面圖片可以明顯看出來a.sql文件文件大小為849000+,而b.sql只有203
所以想要用.sh完成備份數據庫就需要解決腳本與服務器輸入數據庫密碼這個交互的過程,我覺得用expect這個工具應該也是可以實現的,但我搜了一波別人是怎解決的發現,發現好像別人的腳本里都是將一些數據庫的信息賦值給了變量,然后調用變量來備份的,然后我修改了一下Shell腳本。
這次執行也報錯了
原因是因為在MySQL5.6之后版本的數據庫的安全機制,大概意思就是在命令行使用密碼可能不安全,所以這個也是用不了的。
解決這個問題需要修改數據庫的my.cnf配置文件
這樣備份數據庫可以使用:
mysqldump --defaults-extra-file=/etc/my.cnf --all-databases > bak.sql
還原備份也可以用:
mysql --defaults-extra-file=/etc/my.cnf < bak.sql;
其實回復備份呢,輸密碼也無所謂了
然后再編輯一個.sh腳本
添加權限執行一下
這次測試一下能不能還原,添加一個數據庫
進行備份
刪除測試的數據庫
用不輸入密碼的方式試一下能不能恢復備份
這樣被刪除的數據庫就已經恢復了
7、將Shell腳本添加到計划任務
首先看一下crond的狀態,發現是開着的
然后編輯/etc/crontab這個文件,將shell腳本添加到配置文件中
這個規則也比較簡單
* * * * * 用戶 腳本
*表示一個小時的第幾分鍾,可以輸入0-59
*表示一天的第幾個小時,可以輸入0-23
*表示一個月的第幾天,可以輸入1-31
*表示一年的第幾個月,可以輸入1-12
*表示星期幾,可以輸入0-6,0或者7表示周日
0 2 * * * 用戶 腳本 //表示每天兩點執行
0 2 * * 7 用戶 腳本 //表示每周日兩點執行
0 2 10,20,30 * * 用戶 腳本 //表示每周月10號、20號、30號執行
*/1 * * * * 用戶 腳本 //每分鍾執行一次
0 * * * * 用戶 腳本 //表示每天整點執行
然后星期幾的那個和與月日感覺不是很搭,還是看自己需要吧
下面試一下,先把備份刪了,然后定個時試執行備份腳本
現在是38,定個40看看
誒,成功了
總結一下就是
1、將密碼寫在數據庫配置文件my.cnf中(或許還有其他更好的辦法)
2、使用Shell腳本編寫備份語句,並且給這個shell腳本可以執行的權限
3、通過crond計划任務,定時執行Shell腳本
但是這樣會不會不符合數據保密性呢?