數據庫的異地備份恢復及恢復

文中多數參考網友,恢復未測試其他均已測試。
如需完整版內容留下郵箱我給你發
Mysql數據庫異地備份
一、 簡介
1.1 增量備份簡介
增量備份是指在一次全備份或上一次增量備份后,以后每次的備份只需備份與前一次相比增加或者被修改的文件。這就意味著,第一次增量備份的對象是進行全備后所產生的增加和修改的文件;第二次增量備份的對象是進行第一次增量備份后所產生的增加和修改的文件,如此類推。這種備份方式最顯著的優點就是:沒有重復的備份數據,因此備份的數據量不大,備份所需的時間很短。但增量備份的數據恢復是比較麻煩的。您必須具有上一次全備份和所有增量備份磁帶(一旦丟失或損壞其中的一個增量,就會造成恢復的失敗),并且它們必須沿著從全備份到依次增量備份的時間順序逐個反推恢復,因此這就極大地延長了恢復時間。
假如我們有一個數據庫,有20G的數據,每天會增加10M的數據,數據庫每天都要全量備份一次,這樣的話服務器的壓力比較大,因此我們只需要備份增加的這部分數據,這樣減少服務器的負擔。
1.2 binlog簡介
binlog日志由配置文件的log-bin選項負責啟用,Mysql服務器將在數據根目錄創建兩個新文 件XXX-bin.001和xxx-bin.index,若配置選項沒有給出文件名,Mysql將使用主機名稱命名這兩個文件,其中.index文件包含一份全體日志文件的清單。 Mysql會把用戶對所有數據庫的內容和結構的修改情況記入XXX-bin.n文件,而不會記錄 SELECT和沒有實際更新的UPDATE語句。
當MySQL數據庫停止或重啟時,服務器會把日志文件記入下一個日志文件,Mysql會在重啟時生成一個新的binlog日志文件,文件序號遞增,此外,如果日志文件超過max_binlog_size系統變量配置的上限時,也會生成新的日志文件。
二、 mysql的binlog操作
2.1開啟
修改mysql的my.cnf(Linux)或者my.ini(Windows)文件

圖 1 mysqld配置
[mysqld]

skip-grant-tables

lower_case_table_names = 1 #set case insensitivity
log-bin = logbin.log #log-bin若不顯示制定存儲目錄,則默認存儲在mysql的data目錄下
log-bin-index = logindex
expire_logs_days = 7#日志保留天數為七天
server-id=1 #在設置log-bin的同時需要設置server-id,否則會報錯
binlog_format=row #row基于行的存儲,啟動后會產生mysql-bin.這樣的文件,每啟動一次就會增加一個
【存在的問題】在配置的過程中嘗試使用自定義路徑,但是重啟mysql一直報錯,未找到原因,所以咱配置默認的目錄下。
【補充】log-bin若不顯示指定存儲目錄,則默認存儲在mysql的data目錄下
binlog_format的幾種格式:(STATEMENT,ROW和MIXED)
STATEMENT:基于SQL語句的復制(statement-based replication, SBR)
ROW:基于行的復制(row-based replication, RBR)
MIXED:混合模式復制(mixed-based replication, MBR)
啟動后會產生logbin.log.
這樣的文件,每啟動一次,就會增加一個或者多個。
2.2 查看binlog的開啟情況
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show variables like '%log_bin%';
+---------------------------------+-------------------------------+
| Variable_name | Value |
+---------------------------------+-------------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/logbin |
| log_bin_index | /var/lib/mysql/logindex.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+-------------------------------+
6 rows in set (0,01 sec)
mysql> show variables like '%binlog%';
+-----------------------------------------+----------------------+
| Variable_name | Value |
+-----------------------------------------+----------------------+
| binlog_cache_size | 32768 |
| binlog_checksum | CRC32 |
| binlog_direct_non_transactional_updates | OFF |
| binlog_error_action | ABORT_SERVER |
| binlog_format | ROW |
| binlog_group_commit_sync_delay | 0 |
| binlog_group_commit_sync_no_delay_count | 0 |
| binlog_gtid_simple_recovery | ON |
| binlog_max_flush_queue_time | 0 |
| binlog_order_commits | ON |
| binlog_row_image | FULL |
| binlog_rows_query_log_events | OFF |
| binlog_stmt_cache_size | 32768 |
| innodb_api_enable_binlog | OFF |
| innodb_locks_unsafe_for_binlog | OFF |
| log_statements_unsafe_for_binlog | ON |
| max_binlog_cache_size | 18446744073709547520 |
| max_binlog_size | 104857600 |
| max_binlog_stmt_cache_size | 18446744073709547520 |
| sync_binlog | 1 |
+-----------------------------------------+----------------------+
20 ows in set (0,00 sec)
2.3 查看binlog中的內容
root@yyd-Lenovo:/var/lib/mysql# mysqlbinlog logbin.000001
/!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1/;
/!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0/;
DELIMITER /!/;

at 4

171026 15:41:32 server id 1 end_log_pos 123 CRC32 0x8b1b5abe Start: binlog v 4, server v 5.7.20-0ubuntu0.16.04.1-log created 171026 15:41:32 at startup

ROLLBACK/!/;
BINLOG '
rJHxWQ8BAAAAdwAAAHsAAAAAAAQANS43LjIwLTB1YnVudHUwLjE2LjA0LjEtbG9nAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACskfFZEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
Ab5aG4s=
'/!/;

at 123

171026 15:41:32 server id 1 end_log_pos 154 CRC32 0xbfc1fab3 Previous-GTIDs

[empty]

at 154

171026 15:41:39 server id 1 end_log_pos 177 CRC32 0x6d390fdc Stop

SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog / /!*/;
DELIMITER ;

End of log file

/!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE/;
/!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0/;
信息描述:
Position:位于文件中的位置,即第一行的(#at 4)和第二行的(log_pos 4),說明該事件記錄從文件第4字節開始。
Timestamp:事件發生的時間戳,即第二行的(#070813 14:16:36)
Exec_time:事件的執行花費時間
Error_code:錯誤碼
Type 事件類型:
Master ID:創建二進制事件的主機服務器ID
Master Pos:事件在原始二進制文件中的位置
Flags:標志信息
2.4 數據庫的常用操作
? mysql> show master logs; #查看數據庫所有日志文件。
? mysql> show binlog events \g; #查看當前使用的binlog文件信息。
? mysql> show binlog events in 'mysql-bin.000016'; #查看指定的binlog文件信息。
? mysql> flush logs; #將內存中log日志寫磁盤,保存在當前binlog文件中,并產生一個新的binlog日志文件。
? mysql> flush logs; reset master; #刪除所有二進制日志,并重新(mysql-bin.000001)開始記錄。
三、 腳本編寫
3.1 全量備份腳本
運行source databak.sh,進行全量備份,其中bucket_water_db為數據庫的名稱,/opt/mysql_log_data為數據庫的備份路徑,’date+%Y%m%d’.sql為備份的數據庫腳本的名稱。后面的兩行是定期刪除備份內容的實現,實際中可以刪除。

圖 2 全量備份腳本內容

圖 3 腳本文件存放位置
3.2 增量備份腳本
運行圖 3 腳本文件存放位置中的binlogbak.sh的腳本,source binlogbak.sh。其中BakDir的位置設置為本地要存儲的位置,BinDir的位置設置為數據庫數據存放的文件(logbin文件的存放路徑),LogFile為binlog.log存放的位置+文件名,BinFile為index文件的絕對路徑。在修改時只修改這四個參數就可以。

圖 4 增量備份腳本
四、 定時器開啟
在終端輸入命令:vi /etc/crontab
在最后一行添加
00 00 * * * /home/yyd/data_backup/binlogbak.sh >/dev/null 2>&1
保證每天的0點0分執行腳本,【00 00 * * *】分別對應分 時 周 月 年,【/home/yyd/data_backup/binlogbak.sh】為腳本存放的絕對路徑。

圖 5 定時器配置
輸入以下命令使定時器生效。
crontab /etc/crontab
查看定時器是否生效
crontab –l
五、 數據庫的還原
5.1 全量數據的恢復
方法1:進入數據庫,通過source

  1. mysql> use backup_full;
  2. mysql> source /tmp/backup_full.sql;
  3. mysql> select * from backup_full.full;
  4. +-----------+----------+
  5. | c1 | c2 |
  6. +-----------+-----------+
  7. | 1 | full1 |
  8. | 2 | full2 |
  9. | 3 | full3 |
  10. | 4 | full4 |
  11. | 5 | full5 |
  12. | 6 | full6 |
  13. | 7 | full7 |
  14. | 8 | full8 |
  15. | 9 | full9 |
  16. | 10 | full10 |
  17. +-----------+-----------+
    全量數據恢復成功。
    5.2 直接還原數據文件

圖 6 數據恢復

圖 7 恢復第一個文件
以此類推全部回復完成
5.3 借助position來還原
那么如何借助position來還原操作呢?
假設我們現在向 testdb 數據庫下的表chinesetset中插入數據段('游戲','男','2017-4-3'),然后再刪除這一段數據,再借助mysqlbinlog恢復到刪除之前的狀態~
插入數據段:
可見插入新的數據段在位置戳2285到2564之間,現在我們刪掉('游戲','男','2017-4-3') :

用mysqlbinlog恢復到刪除數據段之前:
mysqlbinlog --start-position = P1 --stop-position=P2 E:/hostname.00000x >E:/filename.sql
mysql -u root -pdatabase_name <E:/filename.sql
P1,P2為E:/hostname.00000x中位置戳的開始點和結束點,該語句就是將P1到P2之間的操作轉存為 E:/filename.sql ,注意此時要指明logbin的文件路徑。實踐走一波:

最后要說的是,mysqlbinlog還有有很多用法,比如 :利用時間戳,利用xid等

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容