一、mysql 全量備份以及增量備份
1、全量備份命令:
- /application/mysql/bin/mysqldump -uroot -p123456 --lock-all-tables -A -B -F --master-data=2 --single-transaction --events|gzip > /opt/MysqlBackup/allbackup/allbackup.sql.gz*
如上一段代碼所示,其功能是將所有數據庫全量備份。
其中 MySQL 用戶名爲:root ,密碼爲:123456。
備份的文件路徑爲:/opt/Mysql_Backup/all_backup,當然這個路徑是按照個人意願修改的。
備份的文件壓縮包名爲 all_backup.sql.gz
參數 --lock-all-tables:鎖定所有數據庫;
參數 -A:備份所有庫;
參數 -B:指定多個庫,增加建庫語句和 use 語句;
參數 -F:刷新 binlog 日誌;
參數 --master-data=0|1|2:
0: 不記錄
1:記錄爲CHANGE MASTER語句
2:記錄爲註釋的CHANGE MASTER語句;
參數 --single-transaction:適合 innodb 事務數據庫備份;
參數 --events:導出事件;
參數 gzip:備份壓縮文件。
2、全量備份腳本:
- #!/bin/bash
. /etc/init.d/functions
user=root
password="123456"
BackupTools=/application/mysql/bin/mysqldump
BackupDir=/opt/MysqlBackup
AllBackup=$BackupDir/allbackup
mkdir -p $AllBackup
echo '=========='$(date +"%Y-%m-%d %H:%M:%S")'==========' “備份開始” >>$AllBackup/allbackup.log
$BackupTools -u$user -p$password -A -B -F --master-data=2 --single-transaction --events|gzip >$AllBackup/allbackup$(date +%Y%m%d).sql.gz
if [ $? -eq 0 ]
then
echo '=========='$(date +"%Y-%m-%d %H:%M:%S")'==========' "備份完成" >>$AllBackup/allbackup.log
action "Mysql full backup is ok" /bin/true
else
action "Mysql full backup is not ok" /bin/false
fi
3、恢復全量備份命令:
cd /opt/MysqlBackup/allbackup
gzip -d allbackup.sql.gz
mysql -uroot -p123456 < allbackup.sql
或者:
*mysql> source /opt/MysqlBackup/allbackup/allbackup.sql *
4、增量備份
首先在進行增量備份之前需要查看一下配置文件,查看 logbin 是否開啓,因爲要做增量備份首先要開啓 logbin 。
首先,進入到 myslq 命令行,輸入如下命令:
mysql> show variables like '%logbin%';
+---------------------------------+-------+
| Variablename | Value |
+---------------------------------+-------+
| logbin | ON |
| logbintrustfunctioncreators | OFF |
| sqllogbin | ON |
+---------------------------------+-------+
如上已經開啓了binlog,如果沒有開啓,執行如下命令:
vim /etc/my.cnf
開啓:
[mysqld]
log-bin=mysql-bin
查看當前使用的 mysql_bin.000 日誌文件:
mysql> show master status;``
+------------------+----------+--------------+------------------+
| File | Position | BinlogDoDB | BinlogIgnoreDB |
+------------------+----------+--------------+------------------+
| mysql-bin.000019 | 533039 | | |
+------------------+----------+--------------+------------------+
當前正在記錄日誌的文件名爲 mysql-bin.000019。
增量備份腳本
#!/bin/bash
export LANG=enUS.UTF-8
BackupDir=/opt/MysqlBackup/binlogbackup/
BinDir=/application/mysql/data/
LogFile=/opt/MysqlBackup/binlog.log
BinFile=/application/mysql/data/mysql-bin.index
mkdir -p $BackupDir
/application/mysql/bin/mysqladmin -uroot -p123456 flush-logs
Counter=wc -l $BinFile|awk '{print $1}'
NextNum=0
for file incat $BinFile
do
base=basename $file
NextNum=expr $NextNum + 1
if [ $NextNum -eq $Counter ]
then
echo $base skip! >> $LogFile
else
dest=$BackupDir/$base
if [ -e $dest ]
then
echo $base exist! >> $LogFile
else
cp $BinDir/$base $BackupDir
echo $base copying >> $LogFile
fi
fi
done
echodate +"%Y年%m月%d日 %H:%M:%S"
Backup succ!>> $LogFile
二、增量數據恢復案例
1、場景概述
a、MySQL數據庫每日零點自動全備
b、某天上午10點,小明莫名其妙地drop了一個數據庫
c、我們需要通過全備的數據文件,以及增量的binlog文件進行數據恢復
2、主要思想
a、利用全備的sql文件中記錄的CHANGE MASTER語句,binlog文件及其位置點信息,找出binlog文件增量的部分
b、用mysqlbinlog命令將上述的binlog文件導出爲sql文件,並剔除其中的drop語句
c、通過全備文件和增量binlog文件的導出sql文件,就可以恢復到完整的數據
3、過程示意圖
4、操作過程
1)、模擬數據
*CREATETABLEstudent(
id
int(11)NOT NULLAUTOINCREMENT,
name
char(20)NOT NULL,
age
tinyint(2)NOT NULLDEFAULT'0',PRIMARY KEY(
id
),KEY
indexname
(name
))ENGINE=InnoDBAUTOINCREMENT=8DEFAULTCHARSET=utf8
mysql>insertstudentvalues(1,'zhangsan',20);
mysql>insertstudentvalues(2,'lisi',21);
mysql>insertstudentvalues(3,'wangwu',22);
*
2)、全備命令
/application/mysql/bin/mysqldump -uroot -p123456 --lock-all-tables -A -B -F --master-data=2 --single-transaction --events|gzip > /opt/MysqlBackup/allbackup/allbackup.sql.gz
3)、繼續插入數據
*mysql>insertstudentvalues(6,'xiaoming',20);
mysql>insertstudentvalues(6,'xiaohong',20);
此時誤操作,刪除了test數據庫
mysql>dropdatabasetest;
*
此時,全備之後到誤操作時刻之間,用戶寫入的數據在binlog中,需要恢復出來
4)、查看全備之後新增的binlog文件
cd /opt/MysqlBackup/allbackup/
ls
allbackup20180831.sql.gz
gzip -d allbackup20180831.sql.gz
grep CHANGE allbackup20180831.sql
-- CHANGE MASTER TO MASTERLOGFILE='mysql-bin.000003', MASTERLOGPOS=107;
這是全備時刻的binlog文件位置,即mysql-bin.000003的107行,因此在該文件之前的binlog文件中的數據都已經包含在這個全備的sql文件中了
5)、移動binlog文件,並讀取sql,剔除其中的drop語句
cp mysql-bin.000003 /tmp/
mysqlbinlog -d test mysql-bin.000003 > bin.log
用vim編輯文件,剔除drop語句
在恢復全備數據之前必須將該binlog文件移出,否則恢復過程中,會繼續寫入語句到binlog,最終導致增量恢復數據部分變得比較混亂
6)、恢復數據
mysql -uroot -p < all_backup_20180831.sql <全備恢復>
mysql -uroot -p -e "select * from test.student;"
+----+----------+-----+
|id|name |age|
+----+----------+-----+
| 1|zhangsan| 20|
| 2|lisi | 21|
| 3|wangwu | 22|
+----+----------+-----+
//此時恢復了全備時刻的數據
//然後使用003bin.sql文件恢復全備時刻到刪除數據庫之間,新增的數據
mysql -uroot -p test< /tmp/bin.sql <增量 binlog 語句恢復>
</span># mysql -uroot -p -e "select * from test.student;"
+----+----------+-----+
|id|name |age|
+----+----------+-----+
| 1|zhangsan| 20|
| 2|lisi | 20|
| 3|wangwu | 20|
| 4|xiaoming| 20|
| 5|xiaohong| 20|
+----+----------+-----+
完成
5、小結
a、適合人爲SQL語句造成的誤操作或者沒有主從複製等的熱備情況宕機時的修復
b、恢復條件要全備和增量的所有數據
c、恢復時建議對外停止更新,即禁止更新數據庫
d、先恢復全量,然後把全備時刻點以後的增量日誌,按順序恢復成SQL文件,然後把文件中有問題的SQL語句刪除(也可通過時間和位置點),再恢復到數據庫
三、定時清理 binlog 日誌
最近磁盤增長的非常快,發現binlog日誌佔用很大的磁盤資源。我們採用手動清理,後面設置一下自動清理。
查看指定刪除日誌
mysql >show binary logs; 查看多少binlog日誌,佔用多少空間。
mysql> PURGE MASTER LOGS TO 'mysql-bin.002467'; 刪除mysql-bin.002467以前所有binlog,這樣刪除可以保證*.index信息與binlog文件同步。
手動清理
mysql>PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 5 DAY); 手動刪除5天前的binlog日誌
自動設置清理
mysql> set global expire_logs_days = 5; 把binlog的過期時間設置爲5天; mysql> flush logs; 刷一下log使上面的設置生效,否則不生效。
爲保證在MYSQL重啓後仍然有效,在my.cnf中也加入此參數設置
expire_logs_days = 5