mysqldump是一個簡單而有效的數據庫備份程 序,它會將需要備份的數據庫的結構轉換爲mysql語言組成的一個文本文件,這個文本文件包含了創建這個數據庫所進行的所有mysql語句,所以當我們恢 復時,便是程序讀取這些語句重新創建數據庫、創建表以及插入數據的過程,但因爲其是單線程的,所以對於比較大的數據庫操作會比較慢。
mysqldump支持InnoDB熱備,MyISAM的溫備,可以基於二進制日誌進行增量備份,根據二進制文件文件中記錄的操作點進行有選擇的恢復。
mysqldump命令介紹
語法:
mysqldump [OPTIONS] database [tables]:備份單個庫,或庫指定的一個或多個表
mysqldump [OPTIONS] –databases [OPTIONS] DB1 [DB2 DB3…]:備份一個或多個庫
mysqldump [OPTIONS] –all-databases [OPTIONS]:備份所有庫
其他選項:
-x, –lock-all-tables:鎖定所有表
-l, –lock-tables:鎖定備份的表,這兩個選項可用於MyISAM和InnoDB的溫備
–single-transaction:啓動一個大的單一事務實現備份,實現對InnoDB的熱備
–flush-logs:備份前,請求到鎖之後滾動日誌,可用於實現備份後二進制日誌寫入到新的日誌文件,便於進行二進制日誌備份時尋找恢復點
–master-data=[0|1|2]:用於確定是否在備份文件中添加CHANGE MASTER語句,0:不記錄;1:記錄爲CHANGE MASTER語句;2:記錄爲註釋的CHANGE MASTER語句;CHANGE MASTER語句記錄了備份的操作記錄處於哪個日誌文件的哪個位置上,加上此選項備份時將打開–lock-all-tables選項,備份完成會自動關閉–lock-all-tables選項。
mysqldump備份以及恢復步驟
請求鎖:可使用–lock-all-tables,如果使用了–master-data=1|2,則不須指定此項,如果爲InnoDB則使用–single-transaction選項實現熱備
滾動日誌:可使用選項–flush-logs
實驗過程:
修改mariadb的配置文件,將日誌文件單獨存放在日誌目錄
創建所需要的目錄
mkdir /mydata/binlog[root@node1 ]# chown -R mysql.mysql /mydata/mkdir /backup
導入實驗用數據庫
[root@node1 ~]# mysql < /tem/hellodb.sql
MariaDB [(none)]> USE hellodb;Database changedMariaDB [hellodb]> SHOW TABLES;+-------------------+| Tables_in_hellodb |+-------------------+| classes || coc || courses || scores || students || teachers || toc |+-------------------+7 rows in set (0.00 sec)
備份數據庫
[root@node1 ~]# mysqldump --database hellodb --flush-logs --master-data=2 > /backup/backup1.sql
備份完之後我們在對數據進行操作
MariaDB [hellodb]> CREATE TABLE city (id int auto_increment not null primary key,code varchar(30));
Query OK, 0 rows affected (0.21 sec)
MariaDB [hellodb]> SHOW TABLES;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| city |
| classes |
| coc |
| courses |
| scores |
| students |
| teachers |
| toc |
+-------------------+
8 rows in set (0.01 sec)
新的表已經添加到數據庫中,我們模擬刪除hellodb數據庫
MariaDB [hellodb]> DROP DATABASE hellodb;
Query OK, 8 rows affected (0.20 sec)
MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.01 sec)
如 果現在就恢復我們備份的文件是不能恢復備份之後進行的操作的,所以現在我們需要二進制文件裏進行定點恢復,爲了確定恢復點,首先導出全部的二進制文件,這 裏所使用的二進制文件是在我們備份之後產生的,因爲我們備份是使用的–flush-logs,所以日誌文件在備份之後重新生成了一個
[root@node1 binlog]# mysqlbinlog mysql-bin.000003 > /backup/bin3.sql[root@node1 binlog]# vim /backup/bin3.sql
由此可以看出我們刪除數據庫是在586這個點,所以我們就可以以586作爲導出二進制文件的停止點
[root@node1 binlog]# mysqlbinlog --stop-position=586 /mydata/binlog/mysql-bin.000003 > /backup/bin586.sql
現在我們開始恢復數據庫
[root@node1 ~]# mysql < /backup/backup1.sql
查看數據庫
MariaDB [(none)]> USE hellodb;Database changedMariaDB [hellodb]> SHOW TABLES;+-------------------+| Tables_in_hellodb |+-------------------+| classes || coc || courses || scores || students || teachers || toc |+-------------------+7 rows in set (0.01 sec)
此時並沒有我們創建的city表
下面就可以使用二進制文件進行恢復操作了
[root@node1 ~]# mysql < /backup/bin586.sql
再來看一下,表city已經回來了
MariaDB [(none)]> USE hellodb;
Database changed
MariaDB [hellodb]> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| hellodb |
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
MariaDB [hellodb]> SHOW TABLES;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| city |
| classes |
| coc |
| courses |
| scores |
| students |
| teachers |
| toc |
+-------------------+
8 rows in set (0.01 sec)
這樣我們就完成了一次數據誤刪除並 根據備份以及二進制文件恢復的過程,從這裏可以看出二進制文件是很重要的,所以需要將二進制文件單獨放在一個存儲的地方,儘量不要和數據庫放在一個磁盤 中,當然備份的數據也要專門存放,這樣數據庫出現意外或者數據庫磁盤損壞,就可以通過備份和二進制文件恢復了。