MySql全量備份和增量備份

1.檢查是log_bin是否開啓

增量備份需要開啓log_bin

若狀態爲on 則是已經開啓log_bin

mysql > show variables like '%log_bin%';
+---------------------------------+-----------------------------+
| Variable_name                   | Value                       |
+---------------------------------+-----------------------------+
| log_bin                         | ON                          |
| log_bin_basename                | /var/lib/mysql/binlog       |
| log_bin_index                   | /var/lib/mysql/binlog.index |
| log_bin_trust_function_creators | OFF                         |
| log_bin_use_v1_row_events       | OFF                         |
| sql_log_bin                     | ON                          |
+---------------------------------+-----------------------------+

若沒開啓log_bin,則修改mysql配置文件my.cnf,添加以下配置,重啓mysql使配置生效

log-bin=/var/lib/mysql/mysql-bin

查看當前正在記錄操作的日誌log_bin文件名稱

mysql > show master status;
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000017 |      155 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+

2.全量備份

只要執行下述命令,就可以進行全量備份

mysqldump -uroot -p123456 --quick --events --all-databases --flush-logs --delete-master-logs --single-transaction > data.sql

全量備份的流程如下:

  • 先創建相應目錄
  • 使用mysqldump進行全量備份
  • 對備份文件進行壓縮
  • 使用scp複製備份文件到其他服務器
  • 清理過期的全量備份文件
  • 定時任務自動進行全量備份

全量備份腳本

mysqlFullBack.sh

#!/bin/bash
# 初始化時,創建相應目錄
# mkdir -p /home/mysql/backup/daily 

# 定時任務
# 每個星期日凌晨3:00執行全量備份腳本 
# 0 3 * * 0 /bin/bash -x /root/mysqlFullBack.sh >/dev/null 2>&1
# 週一到週六凌晨3:00執行增量備份腳本
# 0 3 * * 1-6 /bin/bash -x /root/mysqlPartBack.sh >/dev/null 2>&1

BakDir=/home/mysql/backup
LogFile=/home/mysql/backup/bak.log
Date=`date +%Y%m%d`
Begin=`date +"%Y年%m月%d日 %H:%M:%S"`
cd $BakDir
DumpFile=$Date.sql
GZDumpFile=$Date.sql.tgz
mysqldump -uroot -p123456 --quick --events --all-databases --flush-logs --delete-master-logs --single-transaction > $DumpFile
/bin/tar -zvcf $GZDumpFile $DumpFile
/bin/rm $DumpFile
Last=`date +"%Y年%m月%d日 %H:%M:%S"`
echo [FullBack] 開始:$Begin 結束:$Last $GZDumpFile successful >> $LogFile
# scp重複全量備份文件到其他服務器
# scp $GZDumpFile root@xxxx:/usr/mysql/backup/$GZDumpFile
# 刪除30天前的全量備份文件
find $BakDir -mtime +30 -type f -name "*.sql.tgz" | xargs rm -f
# 刪除增量備份文件
cd $BakDir/daily
/bin/rm -f *

mysqldump參數說明

  • --quick : 該選項在導出大表時很有用,它強制 mysqldump 從服務器查詢取得記錄直接輸出而不是取得所有記錄後將它們緩存到內存中。
  • --all-databases : 導出所有數據庫
  • --flush-logs : 生成新的二進制日誌文件
  • --single-transaction : 此選項會將隔離級別設置爲:REPEATABLE READ。並且隨後再執行一條START TRANSACTION語句,讓整個數據在dump過程中保證數據的一致性,這個選項對InnoDB的數據表很有用,且不會鎖表。但是這個不能保證MyISAM表和MEMORY表的數據一致性。 爲了確保使用--single-transaction命令時,保證dump文件的有效性。需沒有下列語句ALTER TABLE, CREATE TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE,因爲一致性讀不能隔離上述語句。所以如果在dump過程中,使用上述語句,可能會導致dump出來的文件數據不一致或者不可用。

從全量備份文件恢復數據

直接執行全量備份文件sql即可

mysql > source /home/data.sql;

3. 增量備份

只要執行下述命令,就會生成相應的增量備份日誌,根據日誌可以恢復增量備份

在/var/lib/mysql下或/var/lib/mysql/mysql-bin下可查看到增量備份日誌

mysqladmin -uroot -p123456 flush-logs

增量備份流程:

  • 刷新日誌
  • 遍歷日誌索引文件
  • 備份新日誌文件,忽略已經備份的文件

增量備份腳本

mysqlPartBack.sh

#!/bin/bash
#在使用之前,請提前創建以下各個目錄
backupDir=/home/mysql/backup/daily
#增量備份時複製mysql-bin.00000*的目標目錄,提前手動創建這個目錄
mysqlDir=/var/lib/mysql
#mysql的數據目錄
logFile=/home/mysql/backup/bak.log
BinFile=/var/lib/mysql/binlog.index
#mysql的index文件路徑,放在數據目錄下的

mysqladmin -uroot -p123456 flush-logs
#這個是用於產生新的mysql-bin.00000*文件
# wc -l 統計行數
# awk 簡單來說awk就是把文件逐行的讀入,以空格爲默認分隔符將每行切片,切開的部分再進行各種分析處理。
Counter=`wc -l $BinFile |awk '{print $1}'`
NextNum=0
#這個for循環用於比對$Counter,$NextNum這兩個值來確定文件是不是存在或最新的
for file in `cat $BinFile`
do
    base=`basename $file`
    echo $base
    #basename用於截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./
    NextNum=`expr $NextNum + 1`
    if [ $NextNum -eq $Counter ]
    then
        echo $base skip! >> $logFile
    else
        dest=$backupDir/$base
        if(test -e $dest)
        #test -e用於檢測目標文件是否存在,存在就寫exist!到$logFile去
        then
            echo $base exist! >> $logFile
        else
            cp $mysqlDir/$base $backupDir
            echo $base copying >> $logFile
         fi
     fi
done
echo [PartBack] `date +"%Y年%m月%d日 %H:%M:%S"` $Next Bakup successful! >> $logFile

恢復增量備份數據

 mysqlbinlog /home/mysql/backup/daily/binlog.000008 | mysql -uroot -p123456;

4. 定時任務

定時任務

每個星期日凌晨3:00執行全量備份腳本

0 3 * * 0 /bin/bash -x /root/mysqlFullBack.sh >/dev/null 2>&1

週一到週六凌晨3:00執行增量備份腳本

0 3 * * 1-6 /bin/bash -x /root/mysqlPartBack.sh >/dev/null 2>&1

5. 常見問題

當通過linux定時任務crontab去執行備份腳本時,你會發現全量備份後的sql文件是個空文件。然而,你手動執行命令卻是正常的。

原因:mysqldump命令在crontab執行環境中並不存在,要使用絕對路徑,才能執行此命令
查看mysqldump所在位置

which mysqldump
// /usr/local/mysql/bin/mysqldump

然後把全量備份腳本中的mysqldump替換爲/usr/local/mysql/bin/mysqldump

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章