數(shù)據(jù)備份類型
創(chuàng)新互聯(lián)公司于2013年創(chuàng)立,先為雨山等服務建站,雨山等地企業(yè),進行企業(yè)商務咨詢服務。為雨山企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務解決您的所有建站問題。
按業(yè)務劃分:可分為完全備份,增量備份,差異備份。
完全備份:就是對整個數(shù)據(jù)庫的數(shù)據(jù)和數(shù)據(jù)結構進行備份,好處是很直觀,容易被人理解。不足之處:由于每天都對系統(tǒng)進行完全備份,因此在備份數(shù)據(jù)中大量是重復的,這些重復數(shù)據(jù)占用空間,增加成本,備份量大,所需時間長。
增量備份:就是每次備份的數(shù)據(jù)只是相當于上一次備份后增加和修改過的數(shù)據(jù)。優(yōu)點:沒有重復的數(shù)據(jù),節(jié)省空間,縮短備份時間。缺點:發(fā)生災難時,恢復數(shù)據(jù)麻煩。另外這種備份的可靠性也差,在這種備份下,各備份數(shù)據(jù)間的關系就像鏈子一樣,一環(huán)套一環(huán),其中任何一個備份數(shù)據(jù)出了問題都會導致整條鏈子脫節(jié)。
差異備份:就是每次備份的數(shù)據(jù)是相對于上一次全備份之后新增加的和修改過的數(shù)據(jù)。
數(shù)據(jù)備份方式:可分為熱備,溫備,冷備。
熱備份:是指在數(shù)據(jù)庫運行中直接備份,對正在運行的數(shù)據(jù)庫沒有任何影響。
冷備份:是指在數(shù)據(jù)庫停止的情況下進行的備份,這種備份最為簡單,一般只需要拷貝相關的數(shù)據(jù)庫物理文件即可。
溫備份:備份同樣是在數(shù)據(jù)庫運行時進行,但是會對當前數(shù)據(jù)庫的操作有所影響,例如加一個全局讀鎖以保證備份數(shù)據(jù)的一致性。
備份流程圖
MySQL備份工具介紹
mysqldump:邏輯備份工具,適用于所有存儲引擎,可用于溫備,能實現(xiàn)完全備份,部分備份,對IonoDB存儲引擎支持熱備;
cp,tar等文件系統(tǒng)工具:物理備份工具,適用于所有存儲引擎,用于冷備,能實現(xiàn)完全備份,部分備份;
lvm2的快照:備幾乎熱,借助于文件系統(tǒng)工具實現(xiàn)物理備份。
mysqlhotcopy:幾乎冷備,僅適用于myisam存儲引擎;
mysqldump+binlog實現(xiàn)數(shù)據(jù)庫的備份與恢復
1.準備備份目錄
[root@centos7 ~]# mkdir -p /backup/binlog
2.準備備份的數(shù)據(jù)庫及表
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.對數(shù)據(jù)庫進行完整備份
[root@centos7 ~]# mysqldump --all-databases --lock-all-tables --flush-log --master-data=2 > /backup/`date +%F_%T`-all.sql --lock-all-tables:鎖定所有表 --flush-logs:鎖定表之后執(zhí)行flush logs命令 --master-data={0|1|2} 0:不記錄 1:記錄change master to語句;此語句未被注釋 2:記錄為注釋語句
4.向表中插入數(shù)據(jù)
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.繼續(xù)插入數(shù)據(jù),在沒備份的情況下刪除數(shù)據(jù)庫,模擬誤操作。
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.恢復數(shù)據(jù),由于在最后沒有備份就刪除了數(shù)據(jù)庫,所以我們首先需要保護最后的二進制日志,查看刪除之前的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.查看數(shù)據(jù)庫及數(shù)據(jù)
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)
數(shù)據(jù)已經(jīng)全部恢復了。
xtrabackup的數(shù)據(jù)庫備份與恢復
xtrabackup是由percona提供的mysql數(shù)據(jù)庫備份工具,是一款開源能夠對innodb和xtradb數(shù)據(jù)庫進行熱備的工具。
特點:
(1)備份過程快速,可靠。
(2)備份過程不會打斷正在執(zhí)行的事務
(3)能夠基于壓縮等功能節(jié)約磁盤空間和流量
(4)自動實現(xiàn)備份檢驗
(5)還原速度快
安裝
[root@centos7 ~]# yum install xtrabackup
完全備份
[root@centos7 backup]# innobackupex --user=root /backup/
如果想要給備份的用戶設置權限,可以創(chuàng)建最小權限的備份用戶
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的頁面都會包含一個存儲信息,每當相關的數(shù)據(jù)發(fā)生改變,相關的頁面的存儲就會自動增長。這正是InnoDB表可以進行增量備份的基礎,即innobackupex通過備份上次完全備份之后發(fā)生改變的頁面來實現(xiàn)。
innobackupex命令會在備份目錄中創(chuàng)建一個新的以時間命名的目錄以存放所有的增量備份數(shù)據(jù),另外,在執(zhí)行過增量備份之后再一次進行增量備份時,其--incremental-basedir應該指向上一次的增量備份所在的目錄。
注:增量備份僅能應用于InniDB或XtraDB表,對于MyISAM表而言,執(zhí)行增量備份時其實進行的是完全備份。
添加數(shù)據(jù)
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
數(shù)據(jù)恢復準備
一般情況下,在備份完成后,數(shù)據(jù)尚且不能用于恢復操作,因為備份的數(shù)據(jù)中可能會包含尚未提交的事務或已經(jīng)提交但尚未同步至數(shù)據(jù)文件中的事務。因此,此時數(shù)據(jù)文件仍處理不一致狀態(tài)。“準備”的主要作用正是通過回滾未提交的事務及同步已經(jīng)提交的事務至數(shù)據(jù)文件也使得數(shù)據(jù)文件處于一致性狀態(tài)“準備”(prepare)增量備份與整理完全備份有著一些不同,尤其要注意的是:
(1)需要在每個備份(包括完全和各個增量備份)上,將已經(jīng)提交的事務進行“重放”。“重放”之后
,所有的備份數(shù)據(jù)將合并到完全備份上。
(2)基于所有的備份將未提交的事務進行“回滾”。
數(shù)據(jù)恢復準備:執(zhí)行操作
[root@centos7 backup]# innobackupex --apply-log --redo-only /backup/2017-12-03_18-08-41/
接著執(zhí)行增量
[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(第一次增量所在的目錄)
恢復階段,還原數(shù)據(jù)
[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