MySql資料庫備份與還原
備份(mysqldump)
實現功能:
1、備份指定的資料庫
2、刪除指定天數前的備份檔案,預設設定了1天
指令碼示例(mysql_bak.sh)
# 資料庫備份根目錄 BACKUP_DIR="/usr/local/mysqlbackups/tsmbak/" #指定mysql所在主機的主機名 DB_HOSTNAME='hostname' #指定mysql登入使用者名稱 DB_USERNAME='root' #指定mysql登入密碼 DB_PASSWORD='xxxx' #指定備份的資料庫名 DB_NAME="xxxx" #定義當前日期為變數 CURRENT_DATE=$(date +"%Y%m%d$H") #定義刪除N天前的檔案變數 DEL_DAYS_BEFORE_FILES=1 #指定mysqldump所在目錄 MYSQLDUMP_DIR="/usr/bin" #按日期建立目錄(資料庫備份目錄) BASH_PATH=${BACKUP_DIR}/${CURRENT_DATE} echo "---------------------------------------------------------" # 判斷目標路徑是否存在 if [ ! -d ${BASH_PATH} ];then echo "檔案不存在,建立資料夾" mkdir -p ${BASH_PATH} else echo "${BASH_PATH} 資料夾已存在" fi echo "開始備份 ${DB_NAME} 資料庫" #備份指定資料庫 if $($MYSQLDUMP_DIR/mysqldump -h ${DB_HOSTNAME} -u${DB_USERNAME} -p${DB_PASSWORD} ${DB_NAME} > "${BASH_PATH}/${DB_NAME}_${CURRENT_DATE}.sql");then cd ${BASH_PATH} gzip ${DB_NAME}_${CURRENT_DATE}.sql echo "---------------------------------------------------------" echo "${CURRENT_DATE}--Backup database ${DB_NAME} successfully!" echo "---------------------------------------------------------" else echo "----------------------------------------------------------" echo "${CURRENT_DATE}--Backup database ${DB_NAME} unsuccessfully" echo "----------------------------------------------------------" fi #刪除指定N天前的備份檔案及目錄 #如 +2:表示3天以前 -2:2天以內 1:1天以前的24小時 0:表示1天以內 find ${BACKUP_DIR} -name "*" -type f -mtime ${DEL_DAYS_BEFORE_FILES} -exec rm -rf {} \; echo "已刪除${DEL_DAYS_BEFORE_FILES}天前的備份檔案及目錄" echo "---------------------------------------------------------"
賦予檔案執行許可權
chmod +x mysql_bak.sh
執行測試
# 當前目錄下
./mysql_bak.sh
如果報/bin/bash^M: 壞的直譯器:沒有那個檔案或目錄 ”換了幾種編譯方法就解決了,但這次還是不行,於是又換:
bash mysql_bak.sh
原因可能是因為我在win下操作的時候,修改到了此檔案。
在win下編輯的時候,換行結尾是\n\r , 而在linux下 是\n,所以才會有 多出來的\r
# 將檔案中\r替換為空白
sed -i 's/\r$//' mysql_bak.sh
再次編譯!成功!!
find -mtime 介紹
find為查詢命令,-time是根據時間查詢,可作為條件,具體設定不同,查詢結果不同
mtime引數的理解應該如下:
-mtime n 按照檔案的更改時間來找檔案,n為整數。
n 表示檔案更改時間距離為n天
-n 表示檔案更改時間距離在n天以內
+n 表示檔案更改時間距離在n天以前
示例:
-mtime 0 表示檔案修改時間距離當前為0天的檔案,即距離當前時間不到1天(24小時)以內的檔案。
-mtime 1 表示檔案修改時間距離當前為1天的檔案,即距離當前時間1天(24小時-48小時)的檔案。
-mtime+1 表示檔案修改時間為大於1天的檔案,即距離當前時間2天(48小時)之外的檔案
-mtime -1 表示檔案修改時間為小於1天的檔案,即距離當前時間1天(24小時)之內的檔案
為什麼-mtime+1 表示檔案修改時間為大於1天的檔案,即距離當前時間48小時之外的檔案,而不是24小時之外的呢? 因為n值只能是整數,即比1大的最近的整數是2,所以-mtime+1不是比當前時間大於1天(24小時),而是比當前時間大於2天(48小時)
定時任務
建立定時任務,比如每天凌晨兩點執行備份操作
# Linux內建的用於定期執行程式的命令 -l 檢視當前所有定時程式任務
crontab -e
編輯一下內容並儲存退出:
# 定時執行程式,且將日誌儲存到指定目錄
*2 * * * /usr/local/mysqlbackups/mysql_bak.sh &> /usr/local/mysqlbackups/tsmbak/mysql_bak.log
編輯完之後按下Esc鍵,輸入:冒號,輸入wq 儲存退出即可
還原
由於備份後的檔案是經過壓縮的如下,所以先解壓
使用gunzip命令如下:
gunzip xxxxxx_20220303.sql.gz
解壓後為.sql字尾檔案,沒錯檢視內容其實就是sql語句,如下
接下來就是執行sql語句了
1、進入mysql資料庫
mysql -u root -p 回車,然後輸入密碼
2、檢視當前所有資料庫,並指定需要還原的資料庫
show databases; ------ 檢視所有資料庫
use 'databaseName'; -----指定使用的資料庫
create database test01; ----- 建立新庫
3、使用source呼叫sql進行
source /usr/local/mysqlbackups/tsmbak/xxxxxxx_20220303.sql ----- 等待執行完成
4、檢視還原的表或資料
show tables; ----- 檢視當前庫所有的表
至此,就完成啦
部分操作截圖如下:
無論風雨,和自己一決勝負吧