MySQL邏輯備份mysqldump

MySQL 備份之 mysqldump

mysqldump

mysqldump工具有份:mysql

本質:導出的是SQL語句文件sql

優勢:不管是什麼存儲引擎,均可以用mysqldump備成SQL語句數據庫

缺點:速度較慢,導入時可能會出現格式不兼容的突發狀況,沒法作增量備份和累計增量備份vim

提供三種級別的備份,表級,庫級和全庫級session

Usage: mysqldump [OPTIONS] database [tables]
OR     mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR     mysqldump [OPTIONS] --all-databases [OPTIONS]

說明:ide

若是備份對象下的數據庫絕大多數都是myisam類型表,爲了保證數據的一致性,備份時須要鎖定表工具

若是是針對innodb的表進行備份因爲innodb是事務型的引擎,會話與會話之間是隔離的,因此備份的時候不影響數據庫的正常使用,無需鎖表this

--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的日誌位置與文件名並追加到文件中

表級備份 / 恢復

表級備份:spa

[root@Admin ~]# mysqldump -p123 db01 table01 > /tmp/mysqlback/table01.sql              # 備份單個表

[root@Admin ~]# mysqldump -p123 db01 table01 table02 > /tmp/mysqlback/table01_02.sql   # 備份多個表

表級恢復:rest

[root@Admin ~]# mysql -p123 db01 < /tmp/mysqlback/table01.sql

或者在mysql數據庫內使用source命令來執行外部的sql文件
mysql> source /tmp/mysqlback/table01.sql

庫級備份 / 恢復

庫級備份:

[root@Admin ~]# mysqldump --databases db01 -p123 > /tmp/mysqlback/db01.sql             # 備份單個庫

[root@Admin ~]# mysqldump --databases db01 db02 -p123 > /tmp/mysqlback/db01_02.sql     # 備份多個庫

表級恢復:

[root@Admin ~]# mysql -p123 < /tmp/mysqlback/db01.sql

mysql> source /tmp/mysqlback/db01_02.sql
說明: 不要從操做層面刪除任何一個庫和任何一個表,若是真的這麼作了,那麼恢復的時候會恢復失敗,由於mysql庫裏面不只記錄了用戶信息等還記錄了數據庫表結構等。從操做層面刪除,而mysql庫裏面並不知道。 因此堅定不能從操做層面刪除任何一個庫和任何一個表。

全庫備份 / 恢復

全庫級備份:

考慮到數據庫有innodb,也有其餘類型的表,那麼就只能鎖表備份

[root@Admin ~]# mysqldump -p123 --lock-tables --all-databases > /tmp/mysqlback/alldb.sql

全庫級恢復:

[root@Admin ~]# 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 開啓

修改配置文件

[root@Admin ~]# vim /etc/my.cnf
log-bin=/var/lib/mysql/mysql56-bin.log
log-bin  (可直接這樣寫就ok)

[root@Admin ~]# 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

備份

先作全量備份,而後更新數據並誤操做,數據恢復

[root@Admin ~]# 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.

查看完整備份文件中的字段

[root@Admin ~]# vim /tmp/mysqlback/all_back.sql

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000008', MASTER_LOG_POS=120;

數據更改

添加幾條數據,而後隨便刪除一個庫

更改完後查看mysql-bin.000008日誌文件找到誤刪除的POS值

[root@Admin DB]# mysqlbinlog --no-defaults mysql-bin.000008 
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@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 COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
mysql-bin.000008日誌文件

經過查看二進制日誌,因爲我剛剛是刪除的一個db01庫,刪除db01庫的那條操做上面的POS值是at 802, 因此我應該恢復到802

恢復

先進行全庫恢復

[root@Admin ~]# mysql -p123 < /tmp/mysqlback/all_back.sql
[root@Admin ~]# mysqlbinlog --start-position=120 --stop-position=802 /data/DB/mysql-bin.000008 |mysql -p123

恢復完成後進入數據庫查看是否存在剛剛添加的數據

總結

mysqldump+binlog作增量備份——>經過binlog日誌恢復到最新狀態

  • 當前數據庫必須開啓二進制日誌(修改配置文件)
  • 使用mysqldump工具作全庫備份
  • 更新數據
  • 直接恢復
  • 使用全庫備份恢復
  • 使用binlog日誌恢復到最新狀態
相關文章
相關標籤/搜索