使用LVM快照進行數據庫備份

本文首發在《旺旺知識庫html

使用mysqldump備份時,若是存儲引擎爲MyISAM,則只能實現溫備份,並需使用選項--lock-all-tables鎖定全部表。若是存儲引擎爲InnoDB,則加上--single-transaction選項,能夠實現熱備。mysql

使用mysqldump進行邏輯備份,還存在以下問題:sql

  • 浮點數據丟失精度;數據庫

  • 備份出的數據更佔用空間;不過可壓縮後以大大節省空間服務器

  • 不適合對大數據庫(如一個庫超過10G)作徹底備份dom

  • 另外對InnoDB而言,須要使用mysql> FLUSH TABLES WITH READ LOCK;刷新並鎖定表時,可能須要花大量的時間ide

  • 對InnoDB而言,即便鎖定了,也不必定覺得着沒有數據的寫入,此時事務日誌可能還在同步到永久存儲測試

1、備份單表數據另外一個手段:

1.1 基本語法:

備份:

SELECT * INTO OUTFILE '/path/to/somefile.txt' FROM tb_name [WHERE clause];大數據

還原:

LOAD DATA INFILE '/path/to/somefile.txt' INTO TABLE tb_name;spa

1.2 示例:

備份表:

mysql> SELECT * INTO OUTFILE '/tmp/tutors.txt' FROM tutors;
Query OK, 8 rows affected (0.31 sec)

[root@localhost ~]# cat /tmp/tutors.txt
2 HuangYaoshi M 63
3 Miejueshitai F 72
4 OuYangfeng M 76
6 YuCanghai M 56
7 Jinlunfawang M 67
8 HuYidao M 42
9 NingZhongze F 49
14 HuFei M 31

注意:導出的僅僅是數據,表結構並不會被導出。

建立用於恢復數據的空表:

mysql> CREATE TABLE test_tb LIKE tutors;
Query OK, 0 rows affected (1.28 sec)

還原數據到新表:

mysql> LOAD DATA INFILE '/tmp/tutors.txt' INTO TABLE test_tb;
Query OK, 8 rows affected (0.17 sec)
Records: 8 Deleted: 0 Skipped: 0 Warnings: 0

圖片

2.2.2 經過另外一個終端,保存二進制日誌文件及相關位置信息;

$ mysql -uroot -p -e 'SHOW MASTER STATUS\G' > /path/to/master-`date +%F`.info

圖片

查看當前日誌:

mysql> show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| mysqld-binlog.000007 | 650 | | | |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

備份增量日誌:須要注意的是,因爲我使用了[FLUSH LOGS]滾動日誌,所以理論上使用lvm快照卷備份後有兩個日誌的增量數據須要備份,即:mysqld-binlog.000006和mysqld-binlog.000007

查看備份開始時的日誌位置:

[root@localhost ~]# cat /data/backup/master-2013-09-23.info
*************************** 1. row ***************************
File: mysqld-binlog.000006
Position: 120
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:

導出日誌:

[root@localhost ~]# mysqlbinlog --start-position=120 /data/mysql/mysqld-binlog.000006 >/data/backup/06.sql

[root@localhost ~]# mysqlbinlog /data/mysql/mysqld-binlog.000007 >/data/backup/07.sql

2.3 恢復測試:

2.3.1 模擬損壞:

我這裏仍是採用直接刪除數據文件目錄:

<a href="http://www.toxingwang.com/wp-content/uploads/2013/10/mysql4.jpg" class="cboxElement" rel="example4" 1523"="" style="text-decoration: none; color: rgb(1, 150, 227);">圖片

此時已經沒法正常中止mysqld了:

[root@localhost data]# service mysqld stop
ERROR! MySQL server PID file could not be found!

[root@localhost data]# killall mysqld

2.3.2 恢復徹底備份:直接cp

[root@localhost data]# cp -R /data/backup/full-bak-2013-09-23/mysql /data/
cp:是否覆蓋"/data/mysql/localhost.localdomain.err"? yes

[root@localhost mysql]# chown mysql.mysql -R /data/mysql

2.3.3 啓動服務器:

[root@localhost data]# service mysqld start
Starting MySQL SUCCESS!

2.3.4 導入增量備份:

[root@localhost ~]# mysql -uroot -p </data/backup/06.sql

[root@localhost ~]# mysql -uroot -p </data/backup/07.sql

2.3.5 使用LVM快照卷備份注意事項:若是須要備份單一庫,則InnoDB需設置爲獨立表空間

設置每一個表獨立使用一個表空間 [root@localhost ~]# echo "innodb_file_per_table = 1" >>/etc/my.cnf 重啓生效: [root@localhost ~]# service mysqld restart

相關文章
相關標籤/搜索