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的日志位置與文件名並追加到文件中
表級備份 / 恢復
表級備份:
[root@Admin ~]# mysqldump -p123 db01 table01 > /tmp/mysqlback/table01.sql # 備份單個表 [root@Admin ~]# mysqldump -p123 db01 table01 table02 > /tmp/mysqlback/table01_02.sql # 備份多個表
表級恢復:
[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
全庫備份 / 恢復
全庫級備份:
考慮到數據庫有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*/;
通過查看二進制日志,由於我剛剛是刪除的一個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日志恢復到最新狀態