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
全庫級備份:
考慮到數據庫有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)
適用於中小型數據庫;經過結合二進制日誌文件,把數據庫恢復到最新的狀態
二進制日誌默認會記錄下全部對數據庫變化的操做
二進制日誌文件中會記錄某個操做的詳細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)
--start-datetime=name 開始的時間 --stop-datetime=name 結束的時間 --start-position=# 開始的位置(POS) --stop-position=# 結束的位置
備份
先作全量備份,而後更新數據並誤操做,數據恢復
[root@Admin ~]# mysqldump -p123 --flush-logs --master-data=2 --all-databases > /tmp/mysqlback/all_back.sql
查看完整備份文件中的字段
[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日誌恢復到最新狀態