mysql備份和恢復
完全備份、部分備份
完全備份:備份整個數據集
部分備份:只備份數據子集
完全備份、增量備份、差異備份
增量備份:僅備份最近一次完全備份或增量備份(如果存在增量)以來變化的數據
差異備份:僅備份最近一次完全備份以來變化的數據
熱備份、溫備份、冷備份
熱備:讀寫操作均可執行
溫備:讀操作可執行,但寫操作不能
冷備:讀寫操作均不可用進行
MyISAM:溫備,不能熱備
InnoDB:熱備
物理備份、邏輯備份
物理備份:直接複製數據文件進行備份
邏輯備份:從數據庫中“導出”數據另存而進行的備份;(與存儲引擎無關)
備份內容:
數據、二進制日誌、InnoDB的事務日誌、代碼(存儲過程、函數、觸發器、事件調度器)、服務器配置文件
備份工具:
mysqldump:邏輯備份工具,適用所有存儲引擎,溫備:完全備份、部分備份;對InnoDB存儲引擎支持熱備;
cp,tar等複製歸檔工具:物理備份工具,適用於所有存儲引擎,冷備。
lvm2的快照:幾乎熱備:借組於文件系統管理工具進行備份
mysqlhotcopy:幾乎冷備:僅適用於MyISAM存儲引擎
1.myslqdump+複製binlog;
mysqldump:完全備份(每週備份一次)
複製binlog中指定時間範圍的event:增量備份(每天)
2.lvm2快照+複製binlog;
lvm2快照:適用cp或tar進行物理完全備份
複製binlog中指定時間範圍的event:增量備份
3.xtrabackup
由percona提供的支出對InnoDB進行熱備(物理備份)的工具;
完全備份、增量備份;
mysqldump+二進制日誌備份恢復:
1.創建數據測試數據庫,建立表,並插入數據。
MariaDB [(none)]> create database Allen;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> use Allen;
Database changed
MariaDB [Allen]> create table test (id int auto_increment primary key,name varchar(20));
Query OK, 0 rows affected (0.00 sec)
MariaDB [Allen]> insert into test(name)values('laowang'),('laozhang'),('laoli');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
MariaDB [Allen]> select * from test;
+----+----------+
| id | name |
+----+----------+
| 1 | laowang |
| 2 | laozhang |
| 3 | laoli |
+----+----------+
3 rows in set (0.00 sec)
2.創建備份文件夾、完全備份數據
[root@localhost ~]# mkdir /backup
[root@localhost ~]# mysqldump --all-database --lock-all-tables --routines --triggers --master-data=2 --flush-logs >/backup/2018-1-4.sql
[root@localhost ~]# ls /backup/
2018-1-4.sql
3.再次插入數據,插入完成之後刪除test表。
MariaDB [Allen]> insert into test (name)values('xiaoli');
MariaDB [Allen]> insert into test (name)values('xiaoming');
MariaDB [Allen]> select * from test;
+----+----------+
| id | name |
+----+----------+
| 1 | laowang |
| 2 | laozhang |
| 3 | laoli |
| 4 | xiaoli |
| 5 | xiaoming |
+----+----------+
MariaDB [Allen]> drop table test;
MariaDB [Allen]> show master status;
+----------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------------+----------+--------------+------------------+
| mysql_bin_log.000008 | 808 | | |
+----------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
4.查看二進制日誌文件刪除test表時的序號爲772.
[root@localhost ~] mysqlbinlog -d Allen /var/lib/mysql/mysql_bin_log.000008
# at 772
#180104 18:10:03 server id 1 end_log_pos 879 Query thread_id=11 exec_time=0 error_code=0
SET TIMESTAMP=1515060603/*!*/;
DROP TABLE `test` /* generated by server */
/*!*/;
DELIMITER ;
# End of log file
5.從二進制日誌中提取後面插入的兩條數據的相關二進制日誌。
[root@localhost ~] mysqlbinlog --stop-position=772 /var/lib/mysql/mysql_bin_log.000008 >/backup/test.sql
6.恢復全備份數據再恢復剛剛提取出來的後面兩條數據。
MariaDB [Allen]> flush logs;
MariaDB [Allen]> set session sql_log_bin=0;
MariaDB [Allen]> source /backup/2018-1-4.sql
MariaDB [Allen]> source /backup/test.sql
MariaDB [Allen]> select * from test;
+----+----------+
| id | name |
+----+----------+
| 1 | laowang |
| 2 | laozhang |
| 3 | laoli |
| 4 | xiaoli |
| 5 | xiaoming |
+----+----------+