mysqldump+binlog的備份與恢復和xtrabackup備份工具

數據備份類型

按業務劃分:可分爲完全備份,增量備份,差異備份。

完全備份:就是對整個數據庫的數據和數據結構進行備份,好處是很直觀,容易被人理解。不足之處:由於每天都對系統進行完全備份,因此在備份數據中大量是重複的,這些重複數據佔用空間,增加成本,備份量大,所需時間長。

增量備份:就是每次備份的數據只是相當於上一次備份後增加和修改過的數據。優點:沒有重複的數據,節省空間,縮短備份時間。缺點:發生災難時,恢復數據麻煩。另外這種備份的可靠性也差,在這種備份下,各備份數據間的關係就像鏈子一樣,一環套一環,其中任何一個備份數據出了問題都會導致整條鏈子脫節。

差異備份:就是每次備份的數據是相對於上一次全備份之後新增加的和修改過的數據。

數據備份方式:可分爲熱備,溫備,冷備。

熱備份:是指在數據庫運行中直接備份,對正在運行的數據庫沒有任何影響。

冷備份:是指在數據庫停止的情況下進行的備份,這種備份最爲簡單,一般只需要拷貝相關的數據庫物理文件即可。

溫備份:備份同樣是在數據庫運行時進行,但是會對當前數據庫的操作有所影響,例如加一個全局讀鎖以保證備份數據的一致性。

備份流程圖


捕獲22.PNG

mysql備份工具介紹

mysqldump:邏輯備份工具,適用於所有存儲引擎,可用於溫備,能實現完全備份,部分備份,對IonoDB存儲引擎支持熱備;

cp,tar等文件系統工具:物理備份工具,適用於所有存儲引擎,用於冷備,能實現完全備份,部分備份;

lvm2的快照:備幾乎熱,藉助於文件系統工具實現物理備份。

mysqlhotcopy:幾乎冷備,僅適用於myisam存儲引擎;

mysqldump+binlog實現數據庫的備份與恢復

1.準備備份目錄

[root@centos7 ~]# mkdir  -p  /backup/binlog

2.準備備份的數據庫及表

MariaDB [(none)]> create database datas;
Query OK, 1 row affected (0.05 sec)
MariaDB [(none)]> use datas;
Database changed
MariaDB [datas]> create table tb1 (id int,name char(20));
Query OK, 0 rows affected (0.41 sec)
MariaDB [datas]> desc tb1;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | YES  |     | NULL    |       |
| name  | char(20) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
MariaDB [datas]> insert into tb1 values (11,'haha')
    -> ;
Query OK, 1 row affected (0.03 sec)

MariaDB [datas]> select * from tb1;
+------+------+
| id   | name |
+------+------+
|   11 | haha |
+------+------+
1 row in set (0.00 sec)

3.對數據庫進行完整備份

[root@centos7 ~]# mysqldump --all-databases --lock-all-tables --flush-log --master-data=2 > /backup/`date +%F_%T`-all.sql
--lock-all-tables:鎖定所有表
--flush-logs:鎖定表之後執行flush logs命令
--master-data={0|1|2}
0:不記錄
1:記錄change master to語句;此語句未被註釋
2:記錄爲註釋語句

4.向表中插入數據

MariaDB [datas]> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000007 |      245 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

MariaDB [datas]> insert into tb1 values (12,'hehe'),(13,'yaya');
Query OK, 2 rows affected (0.23 sec)
Records: 2  Duplicates: 0  Warnings: 0

MariaDB [datas]> select * from tb1;
+------+------+
| id   | name |
+------+------+
|   11 | haha |
|   12 | hehe |
|   13 | yaya |
+------+------+
3 rows in set (0.00 sec)

5.進行增量備份,備份二進制日誌

[root@centos7 mysql]# mysqlbinlog --start-position=245 --stop-position=451 mysql-bin.000008> /backup/binlog/`date +%F_%T`.sql
[root@centos7 mysql]# cd  /backup/binlog/
[root@centos7 binlog]# ls
2017-12-03_16:43:29.sql

6.繼續插入數據,在沒備份的情況下刪除數據庫,模擬誤操作。

MariaDB [datas]> insert into tb1 values (16,'yuyu');
Query OK, 1 row affected (0.00 sec)

MariaDB [datas]> drop database datas;
Query OK, 1 row affected (0.09 sec)

7.恢復數據,由於在最後沒有備份就刪除了數據庫,所以我們首先需要保護最後的二進制日誌,查看刪除之前的position值。

[root@centos7 binlog]# cd  /var/lib/mysql/
[root@centos7 mysql]# mysqlbinlog  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
#171203 16:35:29 server id 2  end_log_pos 245     Start: binlog v 4, server v 5.5.52-MariaDB created 171203 16:35:29 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
UbcjWg8CAAAA8QAAAPUAAAABAAQANS41LjUyLU1hcmlhREIAbG9nAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABRtyNaEzgNAAgAEgAEBAQEEgAA2QAEGggAAAAICAgCAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAikwNAA==
'/*!*/;
# at 245
#171203 16:36:38 server id 2  end_log_pos 314     Query    thread_id=2    exec_time=0    error_code=0
SET TIMESTAMP=1512290198/*!*/;
SET @@session.pseudo_thread_id=2/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=0/*!*/;
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=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 314
#171203 16:36:38 server id 2  end_log_pos 424     Query    thread_id=2    exec_time=0    error_code=0
use `datas`/*!*/;
SET TIMESTAMP=1512290198/*!*/;
insert into tb1 values (14,'hehe'),(15,'yaya')
/*!*/;
# at 424
#171203 16:36:38 server id 2  end_log_pos 451     Xid = 10
COMMIT/*!*/;
# at 451
#171203 16:54:34 server id 2  end_log_pos 520     Query    thread_id=3    exec_time=0    error_code=0
SET TIMESTAMP=1512291274/*!*/;
BEGIN
/*!*/;
# at 520
#171203 16:54:34 server id 2  end_log_pos 618     Query    thread_id=3    exec_time=0    error_code=0
SET TIMESTAMP=1512291274/*!*/;
insert into tb1 values (16,'yuyu')
/*!*/;
# at 618
#171203 16:54:34 server id 2  end_log_pos 645     Xid = 20
COMMIT/*!*/;
# at 645
#171203 16:54:56 server id 2  end_log_pos 728     Query    thread_id=3    exec_time=0    error_code=0
SET TIMESTAMP=1512291296/*!*/;
drop database datas
/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

 將最後的二進制日誌備份

[root@centos7 mysql]# mysqlbinlog --start-position=520 --stop-position=645  mysql-bin.000008> /backup/binlog/`date +%F_%T`.sql

8.導入之前的所有備份

[root@centos7 ~]# mysql < /backup/2017-12-03_15\:05\:00-all.sql 
[root@centos7 ~]# mysql < /backup/binlog/2017-12-03_16\:43\:29.sql 
[root@centos7 ~]# mysql < /backup/binlog/2017-12-03_16\:51\:11.sql
[root@centos7 ~]# mysql < /backup/binlog/2017-12-03_17\:10\:02.sql

9.查看數據庫及數據

MariaDB [datas]> select * from tb1;
+------+------+
| id   | name |
+------+------+
|   11 | haha |
|   14 | hehe |
|   15 | yaya |
|   12 | hehe |
|   13 | yaya |
|   16 | yuyu |
+------+------+
6 rows in set (0.00 sec)

數據已經全部恢復了。

xtrabackup的數據庫備份與恢復

xtrabackup是由percona提供的mysql數據庫備份工具,是一款開源能夠對innodb和xtradb數據庫進行熱備的工具。

特點:

(1)備份過程快速,可靠。

(2)備份過程不會打斷正在執行的事務

(3)能夠基於壓縮等功能節約磁盤空間和流量

(4)自動實現備份檢驗

(5)還原速度快

安裝

[root@centos7 ~]# yum install xtrabackup

完全備份

[root@centos7 backup]# innobackupex --user=root /backup/

如果想要給備份的用戶設置權限,可以創建最小權限的備份用戶

MariaDB [(none)]> grant reload,lock tables,replication client on *.* to 'backuser'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.07 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.04 sec)

增量備份

每個InnoDB的頁面都會包含一個存儲信息,每當相關的數據發生改變,相關的頁面的存儲就會自動增長。這正是InnoDB表可以進行增量備份的基礎,即innobackupex通過備份上次完全備份之後發生改變的頁面來實現。

innobackupex命令會在備份目錄中創建一個新的以時間命名的目錄以存放所有的增量備份數據,另外,在執行過增量備份之後再一次進行增量備份時,其--incremental-basedir應該指向上一次的增量備份所在的目錄。

注:增量備份僅能應用於InniDB或XtraDB表,對於MyISAM表而言,執行增量備份時其實進行的是完全備份。

添加數據

MariaDB [datas]> insert into tb1 values (17,'laoshi');
Query OK, 1 row affected (0.00 sec)

MariaDB [datas]> insert into tb1 values (18,'jiangchen');
Query OK, 1 row affected (0.00 sec)

MariaDB [datas]> select * from tb1;
+------+-----------+
| id   | name      |
+------+-----------+
|   11 | haha      |
|   14 | hehe      |
|   15 | yaya      |
|   12 | hehe      |
|   13 | yaya      |
|   16 | yuyu      |
|   17 | laoshi    |
|   18 | jiangchen |
+------+-----------+
8 rows in set (0.00 sec)

增量備份

[root@centos7 2017-12-03_18-08-41]# innobackupex --user=root --incremental /backup --incremental-basedir=/backup/2017-12-03_18-08-41
[root@centos7 backup]# ls
2017-12-03_18-08-41  2017-12-03_18-36-10

數據恢復準備
一般情況下,在備份完成後,數據尚且不能用於恢復操作,因爲備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務。因此,此時數據文件仍處理不一致狀態。“準備”的主要作用正是通過回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處於一致性狀態“準備”(prepare)增量備份與整理完全備份有着一些不同,尤其要注意的是:
(1)需要在每個備份(包括完全和各個增量備份)上,將已經提交的事務進行“重放”。“重放”之後
,所有的備份數據將合併到完全備份上。
(2)基於所有的備份將未提交的事務進行“回滾”。
數據恢復準備:執行操作

[root@centos7 backup]# innobackupex --apply-log --redo-only /backup/2017-12-03_18-08-41/

接着執行增量

[root@centos7 backup]# innobackupex --apply-log --redo-only /backup/2017-12-03_18-08-41/  --inctrmental-dir=/backup/2017-12-03_18-36-10
/backup/2017-12-03_18-08-41/(完全備份的目錄)
/backup/2017-12-03_18-36-10(第一次增量所在的目錄)

恢復階段,還原數據

[root@centos7 mysql]# innobackupex --copy-back /backup/2017-12-03_18-08-41/
[root@centos7 mysql]# chown -R mysql.mysql  /var/lib/mysql
[root@centos7 mysql]# systemctl restart mariadb






 




























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