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 "文件不存在,創建文件夾:${BASH_PATH}"
 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;  ----- 查看當前庫所有的表

至此,就完成啦

部分操作截圖如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM