1. 程式人生 > >MySQL邏輯備份mysqldump

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日誌恢復到最新狀態