MariaDB之基於mysqldump與lvm-snapshot備份恢復Databases or Tables(一)

一、爲什麼要用到備份和恢復?

1.災難恢復;

2.審計;
3.測試;
備份:目的用於恢復;對備份數據做恢復測試,備份出來的數據不一定能夠恢復;所以測試是很有必要做;另外還需要根據實際情況制定最優的備份和恢復策略
那麼MySQL備份需要備份那些數據呢?
    主要包括:數據、配置文件、二進制日誌、事務日誌

二、備份的類型
2.1 按備份時服務器是否繼續提供服務(數據庫服務是否在線)區分:

   熱備份(cold backup):備份時讀寫都不受影響

   溫備份(warm backup):備份時僅可進行讀操作

   冷備份(cold backup):也叫離線備份,讀寫操作均中止

    不同的存儲引擎對備份的支持也是不一樣的,MyISAM存儲引擎可以使用LVM快照功能配合實現熱備份,如果沒有LVM,則只能實現溫備份,而InnoDB則可以完全支持熱備,可使用的熱備工具有:xtrabackup, mysqldump等
    從數據的安全角度來說,離線備份(冷備份)是最安全的,且是最快速的.但離線備份需要停止服務,對業務帶來影響.

    如果MySQL服務器存在主從服務器,則可以使用將從服務器停機進行冷備份,即保證服務,又保障數據數據安全

2.2 根據備份時的接口(直接備份數據文件還是通過mysql服務器導出數據):
   物理備份(physical backup):直接複製(歸檔)數據文件的備份方式;特點:速度快
   邏輯備份(logical backup):把數據從庫中提出出來保存爲文本文件;特點:速度慢、丟失浮點數精度;方便使用文本處理工具直接對其處理、可移植能力強

2.3 根據備份的數據集:
   完全備份(full backup)
   部分備份(partial backup)


2.4 按是否備份全部還是隻備份數據部分數據區別:

   完全備份(full backup):備份全部需要備份的數據
   增量備份(increment backup):僅備份上次完全備份或增量備份以後變化的數據
   差異備份(differential backup):僅備份上次完全備份依賴變化的數據
一般情況下,根據備份策略組合使用:完全+增量;完全+差異

三、備份恢復策略及備份對象:
策略:
選擇備份方式///選擇備份時間///考慮到恢復成本///恢復時長///備份成本///鎖時間///備份時長///備份負載
對象:
數據///配置文件///代碼(存儲過程,存儲函數,觸發器)///OS相關的配置文件(如crontab配置計劃及相關的腳本)


四、備份工具介紹:
4.1 mysql備份工具:
    mysqldump: 邏輯備份工具、MyISAM(溫)、InnoDB(熱備份)、Aria(溫備)
    mysqldumper: 多線程的mysqldump
    mysqlhotcopy:物理備份工具、溫備份
上述工具備份和恢復過程較慢、很難實現增量或差異備份

4.2 文件系統備工具:
    cp/tar:物理備份
    lvm-snapshot:接近於熱備的工具:因爲要先請求全局鎖,而後創建快照,並在創建快照完成後釋放全局鎖;如:

上述工具備份和恢復速度較快;但是很難實現增量備份,並且請求全局需要等待一段時間,在繁忙的服務器上尤其如此;


4.3 SQL 語法備份
    SELECT clause INTO OUTFILE '/path/to/somefile'
    LOAD DATA INFILE '/path/from/somefile'
部分備份工具, 不會備份關係定義,僅備份表中的數據;
邏輯備份工具,略快於mysqldump.

4.4 第三方備份工具:
Innobase: 商業備份工具, innobackup
Xtrabackup: 由Percona提供的開源備份工具
    對於InnoDB熱備,增量備份;MyISAM溫備,不支持增量;物理備份,速度快.


五、使用mysqldumpMySQL進行備份:

5.1 基本語法:

備份單個數據或單個數據中的指定表:

mysqldump [OPTIONS] database [tb1][tb2]…

備份多個數據庫:

mysqldump [OPTIONS] --databases[OPTIONS] DB1 [DB2 DB3...]

備份所有數據庫:

mysqldump [OPTIONS] --all-databases[OPTIONS]

5.2 選項[OPTIONS]說明:

--all-databases導出全部數據庫。
--all-tablespaces 導出全部表空間。
--no-tablespaces不導出任何表空間信息。
--add-drop-database每個數據庫創建之前添加drop數據庫語句。
--add-drop-table每個數據表創建之前添加drop數據表語句。(默認爲打開狀態,使用--skip-add-drop-table取消選項)

--add-locks

在每個表導出之前增加LOCKTABLES並且之後UNLOCKTABLE(默認爲打開狀態,使用--skip-add-locks取消選項)
--allow-keywords允許創建是關鍵詞的列名字。這由表名前綴於每個列名做到。
--apply-slave-statements'CHANGEMASTER'前添加'STOPSLAVE',並且在導出的最後添加'STARTSLAVE'
--character-sets-dir字符集文件的目錄
--comments附加註釋信息。默認爲打開,可以用--skip-comments取消
--compatible

導出的數據將和其它數據庫或舊版本的MySQL相兼容。值可以爲ansimysql323mysql40postgresqloraclemssqldb2maxdbno_key_optionsno_tables_optionsno_field_options等,要使用幾個值,用逗號將它們隔開。它並不保證能完全兼容,而是儘量兼容。

--compact導出更少的輸出信息(用於調試)。去掉註釋和頭尾等結構。可以使用選項:--skip-add-drop-table--skip-add-locks --skip-comments --skip-disable-keys
--complete-insert使用完整的insert語句(包含列名稱)。這麼做能提高插入效率,但是可能會受到max_allowed_packet參數的影響而導致插入失敗。
--compress在客戶端和服務器之間啓用壓縮傳遞所有信息
--create-optionsCREATETABLE語句中包括所有MySQL特性選項。(默認爲打開狀態)
--databases導出幾個數據庫。參數後面所有名字參量都被看作數據庫名。
--debug輸出debug信息,用於調試。默認值爲:d:t:o,/tmp/mysqldump.trace
--debug-check檢查內存和打開文件使用說明並退出。
--debug-info輸出調試信息並退出
--default-character-set設置默認字符集,默認值爲utf8
--delayed-insert採用延時插入方式(INSERTDELAYED)導出數據
--delete-master-logsmaster備份後刪除日誌. 這個參數將自動激活--master-data
--disable-keys對於每個表,用/*!40000ALTER TABLE tbl_name DISABLE KEYS */;/*!40000 ALTER TABLE tbl_name ENABLEKEYS */;語句引用INSERT語句。這樣可以更快地導入dump出來的文件,因爲它是在插入所有行後創建索引的。該選項只適合MyISAM表,默認爲打開狀態。
--dump-slave

該選項將導致主的binlog位置和文件名追加到導出數據的文件中。設置爲1時,將會以CHANGEMASTER命令輸出到數據文件;設置爲2時,在命令前增加說明信息。該選項將會打開--lock-all-tables,除非--single-transaction被指定。該選項會自動關閉--lock-tables選項。默認值爲0

--events導出事件。
--extended-insert使用具有多個VALUES列的INSERT語法。這樣使導出文件更小,並加速導入時的速度。默認爲打開狀態,使用--skip-extended-insert取消選項。
--fields-terminated-by導出文件中忽略給定字段。與--tab選項一起使用,不能用於--databases--all-databases選項
--fields-enclosed-by輸出文件中的各個字段用給定字符包裹。與--tab選項一起使用,不能用於--databases--all-databases選項
--fields-optionally-enclosed-by輸出文件中的各個字段用給定字符選擇性包裹。與--tab選項一起使用,不能用於--databases--all-databases選項
--fields-escaped-by輸出文件中的各個字段忽略給定字符。與--tab選項一起使用,不能用於--databases--all-databases選項。
--flush-logs

開始導出之前刷新日誌

請注意:假如一次導出多個數據庫(使用選項--databases或者--all-databases),將會逐個數據庫刷新日誌。除使用--lock-all-tables或者--master-data外。在這種情況下,日誌將會被刷新一次,相應的所以表同時被鎖定。因此,如果打算同時導出和刷新日誌應該使用--lock-all-tables或者--master-data--flush-logs

--flush-privileges在導出mysql數據庫之後,發出一條FLUSHPRIVILEGES 語句。爲了正確恢復,該選項應該用於導出mysql數據庫和依賴mysql數據庫數據的任何時候
--force在導出過程中忽略出現的SQL錯誤。
--help顯示幫助信息並退出。
--hex-blob使用十六進制格式導出二進制字符串字段。如果有二進制數據就必須使用該選項。影響到的字段類型有BINARYVARBINARYBLOB
--host需要導出的主機信息

--ignore-table


不導出指定表。指定忽略多個表時,需要重複多次,每次一個表。每個表必須同時指定數據庫和表名。例如:--ignore-table=database.table1--ignore-table=database.table2...
--include-master-host-port--dump-slave產生的'CHANGEMASTER TO..'語句中增加'MASTER_HOST=<host>MASTER_PORT=<port>'
--insert-ignore在插入行時使用INSERTIGNORE語句.
--lines-terminated-by輸出文件的每行用給定字符串劃分。與--tab選項一起使用,不能用於--databases--all-databases選項。
--lock-all-tables提交請求鎖定所有數據庫中的所有表,以保證數據的一致性。這是一個全局讀鎖,並且自動關閉--single-transaction--lock-tables選項。
--lock-tables

開始導出前,鎖定所有表。用READLOCAL鎖定表以允許MyISAM表並行插入。對於支持事務的表例如InnoDBBDB--single-transaction是一個更好的選擇,因爲它根本不需要鎖定表。

請注意當導出多個數據庫時,--lock-tables分別爲每個數據庫鎖定表。因此,該選項不能保證導出文件中的表在數據庫之間的邏輯一致性。不同數據庫表的導出狀態可以完全不同。

--log-error附加警告和錯誤信息到給定文件
--master-data該選項將binlog的位置和文件名追加到輸出文件中。如果爲1,將會輸出CHANGEMASTER 命令;如果爲2,輸出的CHANGEMASTER命令前添加註釋信息。該選項將打開--lock-all-tables選項,除非--single-transaction也被指定(在這種情況下,全局讀鎖在開始導出時獲得很短的時間;其他內容參考下面的--single-transaction選項)。該選項自動關閉--lock-tables選項,0則爲不記錄
--max_allowed_packet服務器發送和接受的最大包長度。
--net_buffer_lengthTCP/IPsocket連接的緩存大小。
--no-autocommit使用autocommit/commit語句包裹表。
--no-create-db只導出數據,而不添加CREAT DATABASE 語句。
--no-create-info只導出數據,而不添加CREAT TABLE 語句。
--no-data不導出任何數據,只導出數據庫表結構。
--no-set-names等同於--skip-set-charset
--opt等同於--add-drop-table,--add-locks, --create-options, --quick, --extended-insert, --lock-tables,--set-charset, --disable-keys 該選項默認開啓, 可以用--skip-opt禁用.
--order-by-primary如果存在主鍵,或者第一個唯一鍵,對每個表的記錄進行排序。在導出MyISAM表到InnoDB表時有效,但會使得導出工作花費很長時間。

--order-by-primary


如果存在主鍵,或者第一個唯一鍵,對每個表的記錄進行排序。在導出MyISAM表到InnoDB表時有效,但會使得導出工作花費很長時間。
--password連接數據庫密碼,使用命名管道連接mysql
--port連接數據庫端口號
--protocol使用的連接協議,包括:tcp,socket, pipe, memory.
--quick不緩衝查詢,直接導出到標準輸出。默認爲打開狀態,使用--skip-quick取消該選項。
--quote-names使用(`)引起表和列名。默認爲打開狀態,使用--skip-quote-names取消該選項。
--replace使用REPLACEINTO 取代INSERTINTO.
--result-file直接輸出到指定文件中。該選項應該用在使用回車換行對(\\r\\n)換行的系統上(例如:DOSWindows)。該選項確保只有一行被使用。
--routines導出存儲過程以及自定義函數。
--set-charset添加'SETNAMES default_character_set'到輸出文件。默認爲打開狀態,使用--skip-set-charset關閉選項。
--single-transaction該選項在導出數據之前提交一個BEGINSQL語句,BEGIN不會阻塞任何應用程序且能保證導出時數據庫的一致性狀態。它只適用於InnoDB存儲引擎。本選項和--lock-tables選項是互斥的,因爲LOCKTABLES 會使任何掛起的事務隱含提交。要想導出大表的話,應結合使用--quick選項。
--dump-date將導出時間添加到輸出文件中。默認爲打開狀態,使用--skip-dump-date關閉選項。
--skip-opt禁用–opt選項.
--socket指定連接mysqlsocket文件位置,默認路徑/tmp/mysql.sock
--tab爲每個表在給定路徑創建tab分割的文本文件。注意:僅僅用於mysqldumpmysqld服務器運行在相同機器上。
--tables覆蓋--databases(-B)參數,指定需要導出的表名。
--triggers導出觸發器。該選項默認啓用,用--skip-triggers禁用它。
--tz-utc在導出頂部設置時區TIME_ZONE='+00:00',以保證在不同時區導出的TIMESTAMP數據或者數據被移動其他時區時的正確性。
--user指定連接的用戶名。
--verbose輸出多種平臺信息。
--version輸出mysqldump版本信息並退出
--where只轉儲給定的WHERE條件選擇的記錄。請注意如果條件包含命令解釋符專用空格或字符,一定要將條件引用起來。
--xml導出XML格式.
--plugin_dir客戶端插件的目錄,用於兼容不同的插件版本。
--default_auth客戶端插件默認使用權限。
以上部分選項來自於Internet!


ok!在對與mysqldump選項整理完後通過實例來看一下它是如何實現完成一個備份過程的;

六、示例

在開始之前需要說明一下:

示例過程中的系統爲CentOS6.5_x86-64,mysql爲10.0.10-MariaDB-log;    

要想了解10.0.10-MariaDB請點擊:"https://mariadb.com/kb/zh-cn/mariadb-mariadb-/"

1準備工作:

(1).將二進制日誌文件與數據文件分離:

[root@MariaDB ~]# vim /etc/my.cnf

#添加如下行:

log-bin=/mydata/binlogs/maria-bin

#二進制日誌目錄存放位置:

[root@MariaDB ~]# mkdir /mydata/binlogs
[root@MariaDB ~]# chown mysql:mysql /mydata/binlogs


(2).將每個數據庫的表空間獨立出來:

#添加如下行:

[root@MariaDB ~]# vim /etc/my.cnf

innodb_file_per_table


(3).創建一個專門存放示例過程當中的備份數據庫目錄:

[root@MariaDB ~]# mkdir /backups


(4).首先導入一個底層存儲引擎爲Innodb的數據庫作爲示例使用:

#用的是剛安裝好的MariaDB

[root@MariaDB ~]# service mysqld start

Starting MySQL..                                           [  OK  ]

[root@MariaDB ~]# mysql < hellodb.sql


(5).驗證導入成功與否

[root@MariaDB ~]# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 5
Server version: 10.0.10-MariaDB-log MariaDB Server

Copyright (c) 2000, 2014, Oracle, SkySQL Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| hellodb           |
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+

5 rows in set (0.00 sec)


2、使用mysqldump實現備份恢復操作

(1).備份恢復單個庫(熱備)

#備份操作:

[root@MariaDB ~]# mysqldump -uroot -hlocalhost -p --database hellodb --single-transaction --flush-logs > /backups/abc.sql

Enter password:
[root@MariaDB ~]# ls /backups/
hello.sql
[root@MariaDB ~]#


#模擬hellodb被誤刪除:

[root@MariaDB ~]# mysql -uroot -p
Enter password:

........

........
MariaDB [(none)]> DROP DATABASE hellodb;
Query OK, 7 rows affected (0.08 sec)
MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

MariaDB [(none)]> \q


#恢復操作:

[root@MariaDB ~]# mysql -uroot -hlocalhost -p  < /backups/hello.sql
Enter password:

........

........

MariaDB [(none)]> USE hellodb;
Database changed
MariaDB [hellodb]> SHOW TABLES;
+---------------+
| Tables_in_abc |
+---------------+
| classes       |
| coc           |
| courses       |
| scores       |
| students     |
| teachers     |
| toc           |
+---------------+
7 rows in set (0.00 sec)
MariaDB [hellodb]>\q

#OK!單庫備份恢復結束!


(2).手動請求全局鎖備份恢復:

#請求全局鎖:

MariaDB [(none)]> FLUSH TABLES WITH READ LOCK;

Query OK, 0 rows affected (0.00 sec)


#滾動日誌

MariaDB [(none)]> FLUSH LOGS;

Query OK, 0 rows affected (0.01 sec)


#日誌滾動完後需要看一下當前使用的是那一個二進制日誌文件,以後在恢復時只需要用到maria-bin.000005文件的365這個位置以後的文件就可以了!
MariaDB [(none)]> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| maria-bin.000005 |      365 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

MariaDB [(none)]>


#備份操作

[root@MariaDB ~]# mysqldump --databases hellodb --master-data=2 > /backups/hello2.sql

#釋放鎖:

[root@MariaDB ~]# mysql -uroot -p

Enter password:

........

........

MariaDB [(none)]> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]>


#模擬數據庫刪除:

[root@MariaDB ~]# mysql -uroot -p
Enter password:

........

........
MariaDB [(none)]> DROP DATABASE hellodb;

Query OK, 7 rows affected (0.08 sec)


#恢復操作

[root@MariaDB ~]# mysql -uroot -hlocalhost -p  < /backups/hello.sql
Enter password:

........

........

MariaDB [(none)]> USE hellodb;
Database changed
MariaDB [hellodb]> SHOW TABLES;
+---------------+
| Tables_in_abc |
+---------------+
| classes       |
| coc           |
| courses       |
| scores        |
| students      |
| teachers      |
| toc           |
+---------------+
7 rows in set (0.00 sec)
MariaDB [hellodb]>\q


(3).多個庫或指定庫備份與上面使用相同方法即可;在此不做演示!

--all-databases: 備份所有庫

--databases db1 db2 ...: 備份指定的多個庫


(4).即時點備份還原

#來一次完整備份:

[root@MariaDB ~]# mysqldump --databases hellodb  --single-transaction --flush-logs --master-data=2 > /backups/hello3.sql
[root@MariaDB ~]#

#對hellodb進行操作:

MariaDB [(none)]> USE hellodb;

Database changed
MariaDB [hellodb]> CREATE TABLE t1 (id int);
Query OK, 0 rows affected (0.04 sec)
MariaDB [hellodb]> INSERT INTO t1 values (10),(20);
MariaDB [hellodb]> select * from t1;
+------+
| id   |
+------+
|   10 |
|   20 |
+------+

MariaDB [hellodb]>


#模擬數據庫刪除:

MariaDB [hellodb]> DROP DATABASE hellodb;


#在備份的時候加入了--master-data=2這個選項,所以它能夠在備份數據文件/backups/hello3.sql中查看備份出來的數據文件可以看到這樣一行信息:

-- CHANGE MASTER TO MASTER_LOG_FILE='maria-bin.000006', MASTER_LOG_POS=365;

這行信息記錄了標記着我備份的那一刻是記錄到哪個二進制文件的哪個位置,可是我的修改數據庫操作是在這個點以後的,於是我們找到這個二進制文件並指定這個起始位置就可以恢復數據庫誤刪之前的記錄了:


[root@MariaDB binlogs]# mysqlbinlog maria-bin.000006 | tail -15

#注意,在這個二進制文件的最後幾行信息:

#140401 13:10:35 server id 1  end_log_pos 655      Xid = 1617
COMMIT/*!*/;
# at 655
#140401 13:12:39 server id 1  end_log_pos 693      GTID 0-1-294
/*!100001 SET @@session.gtid_seq_no=294*//*!*/;

# at 693
#140401 13:12:39 server id 1  end_log_pos 780      Query     thread_id=39exec_time=0     error_code=0
SET TIMESTAMP=1396329159/*!*/;
DROP DATABASE hellodb //在我模擬刪除數據庫的時候這條語句也被記錄到了這個文件中,所以在我們洗面進行恢復時終止位置只需要指定到"655"即可!
/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

[root@MariaDB binlogs]#


#恢復操作:

[root@MariaDB binlogs]# mysqlbinlog --start-position=365 --stop-position=655 maria-bin.000006  > /backups/hello4.increment.sql


#進入mysql,關閉二進制日誌

[root@MariaDB binlogs]# mysql -uroot -p
Enter password:

........

........

MariaDB [(none)]> SET SESSION sql_log_bin=0; //恢復過程中無需開啓二進制文件;

#導入數據:

#先導入完整備份:

MariaDB [(none)]> source /back/hello3.sql

MariaDB [hellodb]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| hellodb            |
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

MariaDB [hellodb]> USE hellodb;
Database changed
MariaDB [hellodb]> SHOW TABLES;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes           |
| coc               |
| courses           |
| scores            |
| students          |
| teachers          |
| toc               |
+-------------------+
7 rows in set (0.01 sec)
MariaDB [hellodb]>

#此時新建的那張表還沒有恢復回來


#導入增量備份:

MariaDB [(hellodb)]> source /backups/hello4.increment.sql

MariaDB [hellodb]> SHOW TABLES;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes           |
| coc               |
| courses           |
| scores            |
| students          |
| t1               |
| teachers          |
| toc               |
+-------------------+
8 rows in set (0.00 sec)

MariaDB [hellodb]> select * from t1;
+------+
| id   |
+------+
|   10 |
|   20 |
+------+

2 rows in set (0.00 sec)

MariaDB [hellodb]> SET SESSION sql_log_bin=1;

OK!至此mysqldump備份恢復實驗完成!

小結:

(1)在真實環境下應當關閉其它用戶的連接;在磁盤有足夠容量的情況下儘量保存二進制文件;

(2)在備份恢復時對於數據庫底層不同的存儲引擎需使用正確的方式進行操作

備份策略:基於mysqldump
備份:mysqldump+二進制日誌文件;
週日做一次完全備份:備份的同時滾動日誌
週一至週六:備份二進制日誌;
恢復:

完全備份+各二進制日誌文件中至此刻的事件

對MySQL配置文件,以及與MySQL相關的OS配置文件在每次修改後都應該直接進行備份;




lvm-snapshot:基於LVM快照的備份

說明:

1.事務日誌跟數據文件必須在同一個捲上;如下:

/dev/mapper/myvg-mylv1 on /mydata type ext4 (rw)

/dev/mapper/myvg-mylv1 ext4   9.9G  325M  9.1G   4% /mydata


[root@MariaDB ~]# ls /mydata/

binlogs  data  

[root@MariaDB ~]#

2.創建快照卷之前,要請求MySQL的全局鎖;在快照創建完成之後釋放鎖;

3.請求全局鎖完成之後,做一次日誌滾動;做二進制日誌文件及位置標記(手動進行);


備份恢復步驟:
1.請求全局鎖,並滾動日誌

[root@MariaDB ~]# mysql

MariaDB [(none)]> FLUSH TABLES WITH READ LOCK;

Query OK, 0 rows affected (0.00 sec)


MariaDB [(none)]> FLUSH LOGS;

Query OK, 0 rows affected (0.05 sec)

MariaDB [(none)]>


2.做二進制日誌文件及位置標記(手動進行);

[root@MariaDB ~]# mysql -e 'SHOW MASTER STATUS' > /backups/bininfo.txt


3.創建快照卷

[root@MariaDB ~]# lvcreate -L 500M -s -n mydata-snap -p r /dev/myvg/mylv1

 Logical volume "mydata-snap" created

[root@MariaDB ~]# lvs | grep mylv1

 mydata-snap myvg sri-a-s--- 500.00m      mylv1    0.00                  

 mylv1       myvg owi-aos---  10.00g                                      

[root@MariaDB ~]#


4.釋放全局鎖

MariaDB [(none)]> UNLOCK TABLES;

Query OK, 0 rows affected (0.00 sec)


MariaDB [(none)]>


5、掛載快照卷並備份

[root@MariaDB ~]# mount /dev/myvg/mydata-snap /mnt/ -o ro

[root@MariaDB mnt]# cp -a data /backups/Backupdata-2014-04-01-14:53:16


6、備份完成之後,刪除快照卷

[root@MariaDB ~]# umount /mnt/

[root@MariaDB ~]# lvremove /dev/myvg/mydata-snap

Do you really want to remove active logical volume mydata-snap? [y/n]: y

 Logical volume "mydata-snap" successfully removed

[root@MariaDB ~]#


7.備份完成並解鎖後創建數據庫,創建表

[root@MariaDB mnt]# mysql

MariaDB [(none)]> CREATE DATABASE db1;

Query OK, 1 row affected (0.00 sec)


MariaDB [(none)]> USE db1;

Database changed

MariaDB [db1]> CREATE TABLE db_table1 (ID INT);

Query OK, 0 rows affected (0.30 sec)


MariaDB [db1]> INSERT INTO db_table1 VALUES (10),(20);

Query OK, 2 rows affected (0.05 sec)

Records: 2  Duplicates: 0  Warnings: 0


MariaDB [db1]> select * from db_table1;

+------+

| ID   |

+------+

|   10 |

|   20 |

+------+

2 rows in set (0.00 sec)


MariaDB [db1]>


8.模擬數據目錄誤刪除

[root@MariaDB ~]# service mysqld stop

Shutting down MySQL..                                      [ OK ]

[root@MariaDB ~]# cd /mydata/data/

[root@MariaDB data]# rm -rf *

[root@MariaDB data]# ls

[root@MariaDB data]#


9.恢復在第6步操作之前的數據

[root@MariaDB data]# cp -a /backups/Backupdata-2014-04-01-14\:53\:16/* ./

#此時二進制文件還存在的!


10.查看在誤刪除數據目錄內的文件之前的數據是否已經恢復

[root@MariaDB ~]# mysql -e 'SHOW DATABASES;'

+--------------------+

| Database           |

+--------------------+

| hellodb            |

| information_schema |

| mysql              |

| performance_schema |

| test               |

+--------------------+

[root@MariaDB ~]#

#新建的數據庫"db1"不存在;於是只能依靠二進制文件進行恢復


11.依靠二進制日誌文件進行恢復


[root@MariaDB ~]# cat /backups/bininfo.txt

FilePosition        Binlog_Do_DB    Binlog_Ignore_DB

maria-bin.000010    365    //在做備份時記錄二進制日誌文件及位置標記

[root@MariaDB ~]# mysqlbinlog --start-position=365 /mydata/binlogs/maria-bin.000010 | mysql

[root@MariaDB ~]#



12.驗證恢復效果

[root@MariaDB ~]# mysql -e 'SHOW DATABASES;'

+--------------------+

| Database           |

+--------------------+

| db1                |

| hellodb            |

| information_schema |

| mysql              |

| performance_schema |

| test               |

+--------------------+


小結:

1.在備份時需將二進制日誌保存好;
2.恢復數據時,如果備份文件中文件權限有改變則需修改權限及屬主屬組等
3.在任何備份恢復過後第一件事情就是做一次完整備份!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章