MySQL邏輯備份mysqldump
MySQL 備份之 mysqldump
mysqldump
mysqldump工具備份:
本質:匯出的是SQL語句檔案
優點:不論是什麼儲存引擎,都可以用mysqldump備成SQL語句
缺點:速度較慢,匯入時可能會出現格式不相容的突發情況,無法做增量備份和累計增量備份
提供三種級別的備份,表級,庫級和全庫級
Usage: mysqldump [OPTIONS] database [tables] OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] OR mysqldump [OPTIONS]--all-databases [OPTIONS]
說明:
如果備份物件下的資料庫絕大多數都是myisam型別表,為了保證資料的一致性,備份時需要鎖定表
如果是針對innodb的表進行備份由於innodb是事務型的引擎,會話與會話之間是隔離的,所以備份的時候不影響資料庫的正常使用,無需鎖表
--lock-tables 如果備份的資料庫裡的表與其他庫沒有關係的話,那麼只需要鎖定該庫下的表就可以了 --lock-all-tables 如果備份的資料庫裡的表與其他庫有關係的話,那麼需要鎖定整個mysql資料庫的所有庫下的所有表 --flush-logs, -F 開始備份前重新整理日誌--flush-privileges 備份包含mysql資料庫時重新整理授權表 --lock-all-tables, -x MyISAM 一致性 服務可用性 --lock-tables, -l 備份前鎖表 --single-transaction 適用InnoDB引擎,保證一致性 服務可用性 --master-data=1|2 該選項將會記錄binlog的日誌位置與檔名並追加到檔案中
表級備份 / 恢復
表級備份:
[[email protected] ~]# mysqldump -p123 db01 table01 > /tmp/mysqlback/table01.sql # 備份單個表[[email protected] ~]# mysqldump -p123 db01 table01 table02 > /tmp/mysqlback/table01_02.sql # 備份多個表
表級恢復:
[[email protected] ~]# mysql -p123 db01 < /tmp/mysqlback/table01.sql 或者在mysql資料庫內使用source命令來執行外部的sql檔案 mysql> source /tmp/mysqlback/table01.sql
庫級備份 / 恢復
庫級備份:
[[email protected] ~]# mysqldump --databases db01 -p123 > /tmp/mysqlback/db01.sql # 備份單個庫 [[email protected] ~]# mysqldump --databases db01 db02 -p123 > /tmp/mysqlback/db01_02.sql # 備份多個庫
表級恢復:
[[email protected] ~]# mysql -p123 < /tmp/mysqlback/db01.sql mysql> source /tmp/mysqlback/db01_02.sql說明: 不要從操作層面刪除任何一個庫和任何一個表,如果真的這麼做了,那麼恢復的時候會恢復失敗,因為mysql庫裡面不僅記錄了使用者資訊等還記錄了資料庫表結構等。從操作層面刪除,而mysql庫裡面並不知道。 所以堅決不能從操作層面刪除任何一個庫和任何一個表。
全庫備份 / 恢復
全庫級備份:
考慮到資料庫有innodb,也有其他型別的表,那麼就只能鎖表備份
[[email protected] ~]# mysqldump -p123 --lock-tables --all-databases > /tmp/mysqlback/alldb.sql
全庫級恢復:
[[email protected] ~]# mysql -p123 < /tmp/mysqlback/alldb.sql mysql> source /tmp/mysqlback/alldb.sql
注意:如果是在終端直接在資料目錄裡面將資料全部刪除, 再恢復資料的話就需要初始化才能恢復。
mysqldump+binlog
完全備份(mysqldump)+增量備份(binlog)
適用於中小型資料庫;通過結合二進位制日誌檔案,把資料庫恢復到最新的狀態
二進位制日誌預設會記錄下所有對資料庫變化的操作
二進位制日誌檔案中會記錄某個操作的詳細SQL語句,還有執行的時候環境,時間,以及該記錄在二進位制日誌檔案的起始和結束點pos值
error log # 錯誤日誌,記錄mysql服務端在執行時產生的錯誤資訊,以及mysql啟動和關閉的日誌資訊(排錯) slow log # 慢查詢日誌,慢查詢時間閥值,以秒為單位,如果超過這個閥值就是慢查詢(調優) bin log # 二進位制日誌 ,記錄對資料庫增、刪、改的SQL操作,可以使用這個日誌做增量備份(備份) Relay log # 中繼日誌(主從複製日誌)從機器上從主機器複製過來日誌,根據日誌來同步資料(複製)
配置二進位制日誌
檢視二進位制日誌是否開啟:
mysql> show variables like '%log_bin%'; +---------------------------------+--------------------------+ | Variable_name | Value | +---------------------------------+--------------------------+ | log_bin | OFF | | log_bin_basename | /data/DB/mysql-bin | | log_bin_index | /data/DB/mysql-bin.index | | log_bin_trust_function_creators | ON | | log_bin_use_v1_row_events | OFF | | sql_log_bin | ON | +---------------------------------+--------------------------+ 6 rows in set (0.00 sec)
log_bin |OFF 關閉 ON 開啟
修改配置檔案
[[email protected] ~]# vim /etc/my.cnf log-bin=/var/lib/mysql/mysql56-bin.log log-bin (可直接這樣寫就ok) [[email protected] ~]# service mysqld restart Shutting down MySQL.... [確定] Starting MySQL..... [確定]
再次檢視開啟:
mysql> show variables like '%log_bin%'; +---------------------------------+--------------------------+ | Variable_name | Value | +---------------------------------+--------------------------+ | log_bin | ON | | log_bin_basename | /data/DB/mysql-bin | | log_bin_index | /data/DB/mysql-bin.index | | log_bin_trust_function_creators | ON | | log_bin_use_v1_row_events | OFF | | sql_log_bin | ON | +---------------------------------+--------------------------+ 6 rows in set (0.00 sec)
mysqlbinlog
--start-datetime=name 開始的時間 --stop-datetime=name 結束的時間 --start-position=# 開始的位置(POS) --stop-position=# 結束的位置
示例1
備份
先做全量備份,然後更新資料並誤操作,資料恢復
[[email protected] ~]# mysqldump -p123 --flush-logs --master-data=2 --all-databases > /tmp/mysqlback/all_back.sql
- --flush-logs 備份時先將記憶體中日誌寫回磁碟,然後截斷日誌,併產生新的日誌檔案
- --master-data=2 該選項將二進位制日誌的位置和檔名寫入到備份檔案,等於2表示CHANGE
- MASTER語句被寫成SQL註釋;1表示沒有註釋,預設是1.
檢視完整備份檔案中的欄位
[[email protected] ~]# vim /tmp/mysqlback/all_back.sql -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000008', MASTER_LOG_POS=120;
資料更改
新增幾條資料,然後隨便刪除一個庫
更改完後檢視mysql-bin.000008日誌檔案找到誤刪除的POS值
[[email protected] DB]# mysqlbinlog --no-defaults mysql-bin.000008 /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @[email protected]@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #180520 3:55:12 server id 1 end_log_pos 120 CRC32 0x077f82c8 Start: binlog v 4, server v 5.6.31-log created 180520 3:55:12 # Warning: this binlog is either in use or was not closed properly. BINLOG ' IIEAWw8BAAAAdAAAAHgAAAABAAQANS42LjMxLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAciC fwc= '/*!*/; # at 120 #180520 3:56:46 server id 1 end_log_pos 201 CRC32 0xa954edb5 Query thread_id=1 exec_time=0 error_code=0 SET TIMESTAMP=1526759806/*!*/; SET @@session.pseudo_thread_id=1/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; SET @@session.sql_mode=1075838976/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; /*!\C utf8 *//*!*/; SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/; SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; BEGIN /*!*/; # at 201 #180520 3:56:46 server id 1 end_log_pos 316 CRC32 0xc34378c8 Query thread_id=1 exec_time=0 error_code=0 use `login`/*!*/; SET TIMESTAMP=1526759806/*!*/; insert into t1(id,name) values(6,'eee') /*!*/; # at 316 #180520 3:56:46 server id 1 end_log_pos 347 CRC32 0xea43bde1 Xid = 1227 COMMIT/*!*/; # at 347 #180520 3:56:53 server id 1 end_log_pos 428 CRC32 0x5fd30851 Query thread_id=1 exec_time=0 error_code=0 SET TIMESTAMP=1526759813/*!*/; BEGIN /*!*/; # at 428 #180520 3:56:53 server id 1 end_log_pos 543 CRC32 0x97402f36 Query thread_id=1 exec_time=0 error_code=0 SET TIMESTAMP=1526759813/*!*/; insert into t1(id,name) values(8,'aaa') /*!*/; # at 543 #180520 3:56:53 server id 1 end_log_pos 574 CRC32 0xfa2cc4ba Xid = 1228 COMMIT/*!*/; # at 574 #180520 3:57:00 server id 1 end_log_pos 655 CRC32 0x7ba6913f Query thread_id=1 exec_time=0 error_code=0 SET TIMESTAMP=1526759820/*!*/; BEGIN /*!*/; # at 655 #180520 3:57:00 server id 1 end_log_pos 771 CRC32 0x7856052f Query thread_id=1 exec_time=0 error_code=0 SET TIMESTAMP=1526759820/*!*/; insert into t1(id,name) values(10,'bbb') /*!*/; # at 771 #180520 3:57:00 server id 1 end_log_pos 802 CRC32 0x0b597d2b Xid = 1229 COMMIT/*!*/; # at 802 #180520 3:57:19 server id 1 end_log_pos 894 CRC32 0x47136864 Query thread_id=1 exec_time=0 error_code=0 SET TIMESTAMP=1526759839/*!*/; drop database db01 /*!*/; DELIMITER ; # End of log file ROLLBACK /* added by mysqlbinlog */; /*!50003 SET [email protected]_COMPLETION_TYPE*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;mysql-bin.000008日誌檔案
通過檢視二進位制日誌,由於我剛剛是刪除的一個db01庫,刪除db01庫的那條操作上面的POS值是at 802, 所以我應該恢復到802
恢復
先進行全庫恢復
[[email protected] ~]# mysql -p123 < /tmp/mysqlback/all_back.sql
[[email protected] ~]# mysqlbinlog --start-position=120 --stop-position=802 /data/DB/mysql-bin.000008 |mysql -p123
恢復完成後進入資料庫檢視是否存在剛剛新增的資料
總結
mysqldump+binlog做增量備份——>通過binlog日誌恢復到最新狀態
- 當前資料庫必須開啟二進位制日誌(修改配置檔案)
- 使用mysqldump工具做全庫備份
- 更新資料
- 直接恢復
- 使用全庫備份恢復
- 使用binlog日誌恢復到最新狀態