1. 程式人生 > >MySQL資料庫的備份和日誌binlog

MySQL資料庫的備份和日誌binlog

資料備份

資料備份是容災的基礎,是指為防止系統出現操作失誤或系統故障導致資料丟失,而將全部或部分資料集合從應用主機的硬碟或陣列複製到其它的儲存介質的過程。

重要性

由於對資料的威脅通常比較難於防範,毀壞資料的同時也會毀壞訪問資料的系統。原因主要有平臺故障,系統設計漏洞或者設計者本身預置的“黑洞”,硬體故障,人為失誤,非法者的惡意破壞,系統供電故障等

計算機裡面重要的資料、檔案或歷史紀錄,不論是對企業使用者還是對個人使用者,都是至關重要的,一時不慎丟失,都會造成不可估量的損失。為了保障生產、銷售、開發的正常執行,我們需要對資料進行備份、防範於未然。

備份方式

物理備份

  1. 熱備
    :採用archivelog mode方式備份資料庫的方法。為了保證服務不間斷執行,兩臺機器正常運轉,一臺裝置出現故障時,另一臺裝置馬上開始進行服務。比如路由器的熱備份協議(cisco的hsrp)
  2. 冷備也叫cold backup,也被稱為離線備份,是指在關閉資料庫並且資料庫不能更新的狀況下進行的資料庫完整備份。並可對資料進行指定恢復。例如:cp 、tar 

注意:適用於myisam 如果是innodb,必須備份整個資料庫

備份操作

[[email protected] ~]cp -rp /var/lib/mysql    // 備份目錄/檔名    
[[email protected]
~]tar -zcvf xxx.tar.gz /var/lib/mysql/*

恢復操作

[[email protected] ~]cp -rp 備份目錄/檔名    /var/lib/mysql
[[email protected] ~]tar -zxvf  xxx.tar.gz  -C  /var/lib/mysql/*

缺點:跨平臺性差,備份時間長,冗餘備份、浪費儲存空間

邏輯備份

[[email protected] ~]mysqldump  -uroot -p密碼 庫名 >  路徑/xxx.sql   //備份資料

[[email protected]
~]mysql -uroot -p密碼 庫名 < 路徑/xxx.sql //恢復資料 庫名錶示方式 --all-databases 或 -A 所有庫 資料庫名 單個庫 資料庫名 表名 單張表 -B 資料庫1 資料庫2 多個庫

注意事項

  •    無論備份還是恢復,都要驗證使用者許可權
  •    恢復時,如果備份檔案裡沒有建庫的命令,需要寫庫名,需要建庫
  •    多個庫備份時,可以省去庫名

缺點:

效率較低,備份和還原速度慢

備份過程中,資料插入和更新系統會被掛起

資料備份策略

  1. 完全備份    備份所有資料   缺點: 備份資料表是寫鎖,備份完才解鎖       
  2. 增量備份    備份上次備份後,所有新產生的資料
  3. 差異備份    備份完全備份後,所有新產生的資料

binlog日誌及其用途

binlog二進位制日誌是mysql中最重要的日誌

好處

記錄除查詢之外的所有SQL命令

可用於資料恢復

配置mysql主從同步的必要條件

配置

vim /etc/my.cnf
[mysqld]
...
log_bin=[路徑/檔名]             //啟用binlog日誌(可以指定檔案路徑)
server_id                       //指定id值(一般為0~255之間)

相關檔案

主機名-bin.index                     //記錄已有日誌檔名

主機名-bin.000001                  //第一個二進位制日誌

......

手動生成新的日誌的四種方式:

[[email protected] ~]# systemctl restart mysqld    //重啟服務生成新的日誌檔案
[[email protected] ~]# mysqldump   --flush-logs    
[[email protected] ~]# mysql -uroot -p密碼  -e  'flush logs'     
 mysql> flush  logs;                          

清理binlog

mysql> show master status;                   //顯示當前正在使用的日誌檔案
mysql> purge  master logs to “日誌檔名”;    //刪除早於指定版本前的日誌
mysql> reset master;                         //刪除所有日誌 重新建立新日誌

分析binlog

mysql> show variables like "binlog_format";             //檢視當前日誌記錄格式
+---------------+-------+
| Variable_name | Value |     
+---------------+-------+
| binlog_format | ROW   |                      
+---------------+-------+
//1.statement  每一條修改資料的sql命令都會記錄在binlog日誌中
  2.row        不記錄sql語句上下文相關資訊,僅儲存那條記錄被修改
  3.mixed      是以上兩種格式的混合使用

[[email protected] ~]# vim /etc/my.cnf            
[mysqld]
...
binlog_format=mixed                                       //修改日誌檔案格式
[[email protected] ~]#systemctl  restart mysqld 
[[email protected] ~]#mysqlbinlog    [選項]  binlog日誌檔名    //檢視日誌檔案內容
常用選項 
--start-datetime=“yyyy-mm-dd hh:mm:ss”                   //起始時間點
--stop-...
--start-position=數字                                     //起始偏移量
--stop-...   
[[email protected] ~]# mysqlbinlog /var/lib/mysql/vm50-bin.000001
...    
# at 1551                                                //起始偏移量號
#181212 17:39:55 server id 50  end_log_pos 1650 CRC32 0xe320fe14 	Query	thread_id=4	exec_time=0	error_code=0              //前面為起始時間點
SET TIMESTAMP=1544607595/*!*/;
insert into b values("tom")                              //插入命令(除查詢之外都有顯示)
/*!*/;
# at 1650
#181212 17:39:55 server id 50  end_log_pos 1681 CRC32 0x53c06111 	Xid = 23
COMMIT/*!*/;                                             //結束時間點
# at 1681                                                //此條命令結束偏移量    
...

恢復資料

使用mysqlbinlog提取歷史SQL操作  ,通過管道交給mysql命令執行

mysql> delete from user where name="tom";
[[email protected] ~]#mysqlbinlog --start-position=1551 --stop-position=1681   \
/var/lib/mysql/vm50-bin.000001   | mysql -uroot -p123456    //恢復資料"tom"(參看前面例子)