Mysql物理備份Xtrabackup應用實踐(學習筆記八)

轉:https://blog.csdn.net/anzhen0429/article/details/76359069

XtraBackup的全備份+XtraBackup增量備份+binlog日志進行恢復最新數據。也可以恢復誤操作。

?老規矩,開場白,剛開始用mysqldump,備份100G+的數據庫,再加上服務器繁忙,備份速度像蝸牛似的,于是尋找更高效的備份方法。網上都說用xtrabackup比較適合備份大的數據庫,而且備份效率也高,就嘗試使用一次,結果明顯感覺比mysqldump備份與恢復速度就是快不少,那以后就用它了。大禮拜日的在家也沒事,結合生產環境,寫了這篇文檔,剛接觸的朋友,可以參考下,不多說,入正題!

1.1 了解備份方式

熱備份:讀寫不受影響(mysqldump-->innodb)

溫備份:僅可以執行讀操作(mysqldump-->myisam)

冷備份:離線備份,讀寫都不可用

邏輯備份:將數據導出文本文件中(mysqldump)

物理備份:將數據文件拷貝(xtrabackup、mysqlhotcopy)

完整備份:備份所有數據

增量備份:僅備份上次完整備份或增量備份以來變化的數據

差異備份:僅備份上次完整備份以來變化的數據

?1.3 安裝方式

CentOS:

# rpm -ivh http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm

# yum install percona-xtrabackup#xtrabackup2.2不支持MySQL5.1的Innodb引擎,如需要可安裝2.0版本(https://www.percona.com/downloads/XtraBackup/XtraBackup-2.0.8/RPM/rhel6/x86_64/percona-xtrabackup-20-2.0.8-587.rhel6.x86_64.rpm)

?1.4 了解常用參數

? ? ? ?--user= ? ? #指定數據庫備份用戶

--password= ?#指定數據庫備份用戶密碼

--port= ? ? #指定數據庫端口

--host= ? ? #指定備份主機

--socket= ? ?#指定socket文件路徑

--databases= ?#備份指定數據庫,多個空格隔開,如--databases="dbname1 dbname2",不加備份所有庫

--defaults-file=#指定my.cnf配置文件

--apply-log?????????#日志回滾

--incremental= ? ? ? ? ?#增量備份,后跟增量備份路徑

--incremental-basedir= ? ? #增量備份,指上次增量備份路徑

--redo-only?????????#合并全備和增量備份數據文件

--copy-back?????????#將備份數據復制到數據庫,數據庫目錄要為空

--no-timestamp ? ? ? ? ?#生成備份文件不以時間戳為目錄名

--stream= ? ? ? ? ? ? #指定流的格式做備份,--stream=tar,將備份文件歸檔

???? ?--remote-host=user@ip DST_DIR #備份到遠程主機

使用xtrabackup進行MySQL數據庫備份

前面介紹mysqldump備份方式是采用邏輯備份,其最大的缺陷就是備份和恢復速度都慢,對于一個小于50G的數據庫而言,這個速度還是能接受的,但如果數據庫非常大,那再使用mysqldump備份就不太適合了。而使用lvm快照功能對數據庫進行備份,可以實現幾乎熱備的功能,但備份過程較為復雜,不過現在倒是有個工具mylvmbackup可以實現自動化備份。

前面我們也說道,使用物理備份時最快的,那有沒有辦法實現物理熱備呢?

目前主流的有兩個工具可以實現熱備:ibbackup和xtrabackup;ibbackup是商業軟件,沒服務器授權為5000美元,非常昂貴。而xtrabackup功能比ibbackup還要強大,但卻是開源的。因此我們這里就來介紹xtrabackup的使用。

Xtrabackup是由percona提供的mysql數據庫備份工具,據官方介紹,這也是世界上惟一一款開源的能夠對innodb和xtradb數據庫進行熱備的工具。特點:

(1)備份過程快速、可靠;

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

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

(4)自動實現備份檢驗;

(5)還原速度快;

Xtrabackup中主要包含兩個工具:

xtrabackup:是用于熱備份innodb, xtradb表中數據的工具,不能備份其他類型的表,也不能備份數據表結構,xtrabackup命令只備份數據文件,并不備份數據表結構(.frm),所以使用xtrabackup恢復的時候必須有對應表結構文件(.frm)。用innobackupex命令,此命令相當于冷備份,復制數據目錄的索引,數據,結構文件,但會有短暫的鎖表(時間依賴于MyISAM大小)。;

innobackupex:是將xtrabackup進行封裝的perl腳本,提供了備份myisam表的能力。

使用innobakupex備份時,其會調用xtrabackup備份所有的InnoDB表,復制所有關于表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。這些文件會被保存至一個以時間命令的目錄中

二、使用xtrabackup實現對MySQL的備份:

2.1 完全備份:

開始使用xtarbackup進行備份:參數按照要備份的數據庫信息填寫.--defaults-file=/etc/my.cnf參數必須要放在第一個參數,不然會報錯,host參數和user參數要根據MySQL數據庫中的user表信息配置不然會連接不上MySQL服務器。

查看要備份的數據庫的信息:

[root@localhost104 opt]# ps -ef | grep mysql

root ? ? 12567 ? ? 1 ?0 Jul27 ? ? ? ? ?00:00:00 /bin/sh /usr/local/mysql//bin/mysqld_safe ? --datadir=/usr/local/mysql/data/ --pid-file=/usr/local/mysql/mysql.pid

mysql ? ?12854 12567 ?0 Jul27 ? ? ? ? ?00:01:58 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/mysql_safe.log --pid-file=/usr/local/mysql/mysql.pid --socket=/usr/local/mysql/mysql.sock --port=3306

創建全備份的目錄并給相應的用戶權限和屬組

[root@localhost104 opt]#? mkdir ?/opt/xtrabackup_full

[root@localhost104 opt]#?chmod 700 /opt/xtrabackup_full

#全備份

[root@localhost 2017-07-29_14-05-49]# which xtrabackup

/usr/bin/xtrabackup

[root@localhost104 opt]# innobackupex ?--defaults-file=/etc/my.cnf ?--user='root' --password='123456' --host='localhost' --port=3306 ?--socket='/usr/local/mysql/mysql.sock' ?--parallel=3? ?/opt/xtrabackup_full

........

170729 12:54:48 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...

xtrabackup: The latest check point (for incremental): '20125155'

xtrabackup: Stopping log copying thread.

.170729 12:54:48 >> log scanned up to (20125164)

170729 12:54:49 Executing UNLOCK TABLES

170729 12:54:49 All tables unlocked

170729 12:54:49 [00] Copying ib_buffer_pool to /opt/xtrabackup/2017-07-29_12-54-44/ib_buffer_pool

170729 12:54:49 [00] ? ? ? ?...done

170729 12:54:49 Backup created in directory '/opt/xtrabackup/2017-07-29_12-54-44/'

MySQL binlog position: filename 'mysql_bin.000414', position '154'

170729 12:54:49 [00] Writing /opt/xtrabackup/2017-07-29_12-54-44/backup-my.cnf

170729 12:54:49 [00] ? ? ? ?...done

170729 12:54:49 [00] Writing /opt/xtrabackup/2017-07-29_12-54-44/xtrabackup_info

170729 12:54:49 [00] ? ? ? ?...done

xtrabackup: Transaction log of lsn (20125155) to (20125164) was copied.

170729 12:54:49 completed OK!

備份后的文件:

在備份的同時,備份數據會在備份目錄下創建一個以當前日期時間為名字的目錄存放備份文件:

[root@localhost 2017-07-29_12-34-51]# pwd

/opt/xtrabackup/2017-07-29_12-34-51

[root@localhost 2017-07-29_12-34-51]# ll

total 77876

-rw-r----- 1 root root ? ? ?425 Jul 29 12:34 backup-my.cnf

-rw-r----- 1 root root ? ? ?546 Jul 29 12:34 ib_buffer_pool

-rw-r----- 1 root root 79691776 Jul 29 12:34 ibdata1

drwxr-x--- 2 root root ? ? 4096 Jul 29 12:34 mysql

drwxr-x--- 2 root root ? ? 8192 Jul 29 12:34 performance_schema

drwxr-x--- 2 root root ? ? 8192 Jul 29 12:34 sys

drwxr-x--- 2 root root ? ? ?146 Jul 29 12:34 testdb

-rw-r----- 1 root root ? ? ? 21 Jul 29 12:34 xtrabackup_binlog_info

-rw-r----- 1 root root ? ? ?115 Jul 29 12:34 xtrabackup_checkpoints

-rw-r----- 1 root root ? ? ?566 Jul 29 12:34 xtrabackup_info

-rw-r----- 1 root root ? ? 2560 Jul 29 12:34 xtrabackup_logfile

各文件說明:

[root@localhost 2017-07-29_12-34-51]# cat xtrabackup_binlog_info

mysql_bin.000414 ? ? ? ?154

記錄備份的類型、開始和結束的日志序列號

[root@localhost 2017-07-29_12-34-51]# cat xtrabackup_checkpoints

backup_type = full-backuped

from_lsn = 0

to_lsn = 20125155

last_lsn = 20125164

compact = 0

recover_binlog_info = 0

[root@localhost 2017-07-29_12-34-51]# cat xtrabackup_info

uuid = 45d5fa84-7417-11e7-bdad-000c297442b7

name =

tool_name = innobackupex

tool_command = --defaults-file=/etc/my.cnf --user=root --password=... --host=localhost --port=3306 ?--socket=/usr/local/mysql/mysql.sock ??--parallel=3 ?/opt/xtrabackup

tool_version = 2.4.8

ibbackup_version = 2.4.8

server_version = 5.7.18-log

start_time = 2017-07-29 12:34:52

end_time = 2017-07-29 12:34:56

lock_time = 0

binlog_pos = filename 'mysql_bin.000414', position '154'

innodb_from_lsn = 0

innodb_to_lsn = 20125155

partial = N

incremental = N

format = file

compact = N

compressed = N

encrypted = N

(1)xtrabackup_checkpoints —— 備份類型(如完全或增量)、備份狀態(如是否已經為prepared狀態)和LSN(日志序列號)范圍信息;

每個InnoDB頁(通常為16k大小)都會包含一個日志序列號,即LSN。LSN是整個數據庫系統的系統版本號,每個頁面相關的LSN能夠表明此頁面最近是如何發生改變的。

(2)xtrabackup_binlog_info —— mysql服務器當前正在使用的二進制日志文件及至備份這一刻為止二進制日志事件的位置。

(3)xtrabackup_binlog_pos_innodb —— 二進制日志文件及用于InnoDB或XtraDB表的二進制日志文件的當前position。

(4)xtrabackup_binary —— 備份中用到的xtrabackup的可執行文件;

(5)backup-my.cnf —— 備份命令用到的配置選項信息;

在使用innobackupex進行備份時,還可以使用--no-timestamp選項來阻止命令自動創建一個以時間命名的目錄;如此一來,innobackupex命令將會創建一個BACKUP-DIR目錄來存儲備份數據。

另外還需注意:備份數據庫的用戶需要具有相應權限,如果要使用一個最小權限的用戶進行備份,則可基于如下命令創建此類用戶:grant us

grant user 'bkpuser'@'localhost' identified by '123';

grant reload,lock tables,replication client on *.* to 'bkpuser'@'localhost';

flush privileges;

(三)增量備份

創造第一個增量數據表xtrabackup_increment_1_t

mysql> create ?table testdb.xtrabackup_increment_1_t(id int,name varchar(20));

Query OK, 0 rows affected (0.32 sec)

mysql> show tables;

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

| Tables_in_testdb ? ? ? ? |

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

| add_data1 ? ? ? ? ? ? ? ?|

| add_data2 ? ? ? ? ? ? ? ?|

| student_t ? ? ? ? ? ? ? ?|

| xtrabackup_increment_1_t |

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

4 rows in set (0.00 sec)

mysql> insert into xtrabackup_increment_1_t values(1,'anzhen'),(2,'anzhu');

Query OK, 2 rows affected (0.09 sec)

Records: 2 ?Duplicates: 0 ?Warnings: 0

mysql> select * from testdb.xtrabackup_increment_1_t;

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

| id ? | name ? |

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

| ? ?1 | anzhen |

| ? ?2 | anzhu ?|

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

2 rows in set (0.03 sec)

創建增量備份目錄

[root@localhost opt]# mkdir -p /opt/xtrabackup_increment

[root@localhost opt]# chmod 700 /opt/xtrabackup_increment

增量備份命令1: ?注意:第一次執行增備的時候--incremental-basedir這個參數是填寫最近一次全備的目錄做為增備的基礎目錄

[root@localhost opt]# innobackupex --defaults-file=/etc/my.cnf --user='root' --password='123456' --socket='/usr/local/mysql/mysql.sock' --port=3306 --incremental --incremental-basedir='/opt/xtrabackup_full/2017-07-29_12-34-51/' --parallel=3 ?/opt/xtrabackup_increment

#指定上次完整備份目錄

如果有completed OK!說明增量備份成功!

xtrabackup: Transaction log of lsn (20132701) to (20132710) was copied.

170729 14:05:57 completed OK!

查看相關全備份信息:

[root@localhost104 2017-07-29_12-54-44]# cat xtrabackup_binlog_info

mysql_bin.000414 ? ? ? ?154

[root@localhost104 2017-07-29_12-54-44]# cat xtrabackup_checkpoints

backup_type = full-backuped

from_lsn = 0

to_lsn = 20125155

last_lsn = 20125164

compact = 0

recover_binlog_info = 0

[root@localhost104 2017-07-29_12-54-44]# pwd

/opt/xtrabackup_full/2017-07-29_12-54-44

說明全備份的最后一個日志文件是mysql_bin.000414,位置是154,from_lsn 來自的日志號為0,to_lsn = 20125155。下個增量備份要用到這個to_lsn = 20125155。才可以全備和曾備連接起來。

查看相關增量備份信息:

[root@localhost 2017-07-29_14-05-49]# cat ?xtrabackup_binlog_info

mysql_bin.000414 ? ? ? ?667

[root@localhost 2017-07-29_14-05-49]# cat ?xtrabackup_binlog_info

mysql_bin.000414 ? ? ? ?667

[root@localhost 2017-07-29_14-05-49]# cat ?xtrabackup_checkpoints

backup_type = incremental

from_lsn = 20125155

to_lsn = 20132701

last_lsn = 20132710

compact = 0

recover_binlog_info = 0

[root@localhost 2017-07-29_14-05-49]# pwd

/opt/xtrabackup_increment/2017-07-29_14-05-49

說明增備份的最后一個日志文件是mysql_bin.000414,位置是667,from_lsn 來自的日志號為20125155,也就是最近一次全部或者增備的to_lsn號。這次增備為to_lsn =?20132701。

創造第二個增量數據表xtrabackup_increment_2_t

mysql> ?create ?table testdb.xtrabackup_increment_2_t(id int,name varchar(20));

Query OK, 0 rows affected (0.20 sec)

mysql> insert into xtrabackup_increment_2_t values(113,'ansfzhen'),(1232,'ansfzhu');

Query OK, 2 rows affected (0.21 sec)

Records: 2 ?Duplicates: 0 ?Warnings: 0

mysql> commit;

Query OK, 0 rows affected (0.02 sec)

mysql> show tables;

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

| Tables_in_testdb ? ? ? ? |

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

| add_data1 ? ? ? ? ? ? ? ?|

| add_data2 ? ? ? ? ? ? ? ?|

| student_t ? ? ? ? ? ? ? ?|

| xtrabackup_increment_1_t |

| xtrabackup_increment_2_t |

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

5 rows in set (0.00 sec)

mysql> select * from testdb.xtrabackup_increment_2_t;

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

| id ? | name ? ? |

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

| ?113 | ansfzhen |

| 1232 | ansfzhu ?|

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

2 rows in set (0.04 sec)

創建第2次增備: ?注意:第二次或者以后執行增備的時候--incremental-basedir這個參數是填寫最近的上一次增備備的目錄做為這次增備的基礎目錄。--parallel=3線程數,增加備份速度。

[root@localhost 2017-07-29_14-05-49]# innobackupex --defaults-file=/etc/my.cnf --user='root' --password='123456' --socket='/usr/local/mysql/mysql.sock' --port=3306 --incremental --incremental-basedir='/opt/xtrabackup_increment/2017-07-29_14-05-49/' --parallel=3 ? /opt/xtrabackup_increment

信息如下:

170729 14:24:04 [00] Writing /opt/xtrabackup_increment/2017-07-29_14-23-44/xtrabackup_info

170729 14:24:04 [00] ? ? ? ?...done

xtrabackup: Transaction log of lsn (20139866) to (20139875) was copied.

170729 14:24:05 completed OK!

記錄了lsn號的備份信息。OK就成功!

創建第3次增備數據:

mysql> ?create ?table testdb.xtrabackup_increment_3_t(id int,name varchar(20));

Query OK, 0 rows affected (0.11 sec)

mysql>

mysql> insert into xtrabackup_increment_3_t values(3252,'ansfssdffzhen'),(5332,'awthu');

Query OK, 2 rows affected (0.05 sec)

Records: 2 ?Duplicates: 0 ?Warnings: 0

mysql> commit;

Query OK, 0 rows affected (0.00 sec)

mysql> flush logs;

Query OK, 0 rows affected (0.02 sec)

[root@localhost xtrabackup_increment]# innobackupex --defaults-file=/etc/my.cnf --user='root' --password='123456' --socket='/usr/local/mysql/mysql.sock' --port=3306 --incremental --incremental-basedir='/opt/xtrabackup_increment/2017-07-29_14-23-44/' --parallel=3 ?/opt/xtrabackup_increment

(四)誤操作

mysql> show databases;

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

| Database ? ? ? ? ? |

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

| information_schema |

| mysql ? ? ? ? ? ? ?|

| performance_schema |

| sys ? ? ? ? ? ? ? ?|

| testdb ? ? ? ? ? ? |

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

5 rows in set (0.16 sec)

mysql> drop database testdb;

Query OK, 6 rows affected (0.82 sec)

mysql> commit;

Query OK, 0 rows affected (0.02 sec)

mysql> flush logs;

Query OK, 0 rows affected (0.05 sec)

mysql> create database test_new;

Query OK, 1 row affected (0.00 sec)

mysql> create ?table test_new.xtrabackup_increment_4_t(id int,name varchar(20));

Query OK, 0 rows affected (0.10 sec)

mysql> insert into test_new.xtrabackup_increment_4_t values(32,'3zhen'),(242,'asfwthu');

Query OK, 2 rows affected (0.09 sec)

mysql> commit;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from test_new.xtrabackup_increment_4_t;

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

| id ? | name ? ?|

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

| ? 32 | 3zhen ? |

| ?242 | asfwthu |

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

2 rows in set (0.00 sec)

mysql> flush logs;

(四)全備恢復和增備恢復。現在要恢復四個xtrabackup_increment_4_t 數據表的數據和誤操作的數據

4.1 停掉MySQL服務

[root@localhost104 mysql]# ps -ef | grep mysql

root ? ? 12567 ? ? 1 ?0 Jul27 ? ? ? ? ?00:00:00 /bin/sh /usr/local/mysql//bin/mysqld_safe --datadir=/usr/local/mysql/data/ --pid-file=/usr/local/mysql/mysql.pid

mysql ? ?12854 12567 ?0 Jul27 ? ? ? ? ?00:02:08 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/mysql_safe.log --pid-file=/usr/local/mysql/mysql.pid --socket=/usr/local/mysql/mysql.sock --port=3306

root ? ? 48441 48401 ?0 13:53 pts/3 ? ?00:00:00 mysql -uroot -p

root ? ? 49567 45091 ?0 15:45 pts/1 ? ?00:00:00 grep --color=auto mysql

[root@localhost104 mysql]#

[root@localhost104 mysql]#

[root@localhost104 mysql]# cd /usr/local/mysql/

[root@localhost104 support-files]# ls

magic ?mysqld_multi.server ?mysql-log-rotate ?mysql.server

[root@localhost104 support-files]# ./mysql.server stop

Shutting down MySQL...... SUCCESS!

[root@localhost104 support-files]# ps -ef | grep mysql

root ? ? 48441 48401 ?0 13:53 pts/3 ? ?00:00:00 mysql -uroot -p

root ? ? 49614 45091 ?0 15:46 pts/1 ? ?00:00:00 grep --color=auto mysql

#把原來的MySQL數據目錄進行重命名,保留原來的binlog二進制文件,用于恢復最新數據。

[root@localhost104 mysql]#cd?/usr/local/mysql

[root@localhost104 mysql]#mv?/usr/local/mysql/data ?/usr/local/mysql/data_bak

[root@localhost104 mysql]#mkdir?/usr/local/mysql/data

[root@localhost104 mysql]#chown mysql:mysql ?/usr/local/mysql/data

4.2準備(prepare)一個完全備份

建完備份之后數據被沒有馬上可以被還原,需要回滾未提交事務,前滾提交事務,讓數據庫文件保持一致性。

innobackupex使用—apply-log來做預備備份。

一般情況下,在備份完成后,數據尚且不能用于恢復操作,因為備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務。因此,此時數據文件仍處理不一致狀態。“準備”的主要作用正是通過回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處于一致性狀態。

innobakupex命令的--apply-log選項可用于實現上述功能。如下面的命令:--use-memory=4G指定使用的內存,按內存的大小分配,這樣可以加快恢復的速度。

xtrabackup把備份過程中可能有尚未提交的事務或已經提交但未同步數據文件的事務,寫到xtrabackup_logfile文件,所以要先通過這個日志文件回滾,把未完成的事務同步到備份文件,保證數據文件處于一致性。

[root@localhost 2017-07-29_12-34-51]# pwd

/opt/xtrabackup/2017-07-29_12-34-51

[root@localhost 2017-07-29_12-34-51]#innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only /opt/xtrabackup_full/2017-07-29_12-34-51 ??--use-memory=4G --user=root --password=123456

如果執行正確,其最后輸出的幾行信息通常如下:

xtrabackup: starting shutdown with innodb_fast_shutdown = 1

xtrabackup: This target seems to be not prepared yet.

InnoDB: FTS optimize thread exiting.

InnoDB: Starting shutdown...

InnoDB: Shutdown completed; log sequence number 20125736

170729 13:30:29 completed OK!

成功后,備份可以被用來還原數據庫了

看到redo log已經出現。xtrabackup_開頭的幾個文件記錄了一些日志偏移量的信息和日志名和時間等信息。在xtrabackup_checkpoints中記錄了備份的模式:

backup_type = full-backuped。

xtrabackup_binlog_info:記錄當前最新的LOG Position

xtrabackup_binlog_pos_innodb:innodb log postion

xtrabackup_checkpoints: 存放備份的起始位置beginlsn和結束位置endlsn,增量備份需要這個lsn[增量備份可以在這里面看from和to兩個值的變化

xtrabackup_info:備份的一些具體信息日志

4.3準備增備份,/opt/xtrabackup_full/2017-07-29_12-34-51/為全備份的目錄

應用增備一

[root@localhost104 xtrabackup_full]#innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only /opt/xtrabackup_full/2017-07-29_12-34-51 ?--use-memory=4G ?--incremental-dir=/opt/xtrabackup_increment/2017-07-29_14-05-49/ --user=root --password=123456

應用增備二

[root@localhost104 xtrabackup_full]#innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only /opt/xtrabackup_full/2017-07-29_12-34-51 ? --use-memory=4G ?--incremental-dir=/opt/xtrabackup_increment/2017-07-29_14-23-44/ --user=root --password=123456

應用增備三

innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only /opt/xtrabackup_full/2017-07-29_12-34-51 --incremental-dir=/opt/xtrabackup_increment/2017-07-29_14-36-51/ ? --use-memory=4G --user=root --password=123456

應用增備四,最后一個增備不要--redo-only這個參數

innobackupex --defaults-file=/etc/my.cnf --apply-log ?/opt/xtrabackup_full/2017-07-29_12-34-51 ?--use-memory=4G --incremental-dir=/opt/xtrabackup_increment/2017-07-29_14-45-47/ --user=root --password=123456

這樣所有的增備信息都放添加到全備信息中了。全備就有所有的恢復數據

4.4把全備信息恢復到數據目錄。/etc/my.cnf 配置文件要指定數據目錄,上面新建的空數據目錄。恢復完整備份(這時2017-07-29_12-34-51完整備份已經包含所有增量備份,可以通過查看checkpoints來核實)

innobackupex ?--defaults-file=/etc/my.cnf --user='root' --password='123456' --host='localhost' --port=3306 ?--socket='/usr/local/mysql/mysql.sock' ? ?--use-memory=4G ?--copy-back - ? /opt/xtrabackup_full/2017-07-29_12-34-51/

檢查數據目錄的恢復情況

[root@localhost data]# cd testdb

[root@localhost testdb]# ll

total 652

-rw-r----- 1 root root ?8556 Jul 30 10:09 add_data1.frm

-rw-r----- 1 root root 98304 Jul 30 10:09 add_data1.ibd

-rw-r----- 1 root root ?8556 Jul 30 10:09 add_data2.frm

-rw-r----- 1 root root 98304 Jul 30 10:09 add_data2.ibd

-rw-r----- 1 root root ? ?65 Jul 30 10:09 db.opt

-rw-r----- 1 root root ?8616 Jul 30 10:09 student_t.frm

-rw-r----- 1 root root 98304 Jul 30 10:09 student_t.ibd

-rw-r----- 1 root root ?8586 Jul 30 10:09 xtrabackup_increment_1_t.frm

-rw-r----- 1 root root 98304 Jul 30 10:09 xtrabackup_increment_1_t.ibd

-rw-r----- 1 root root ?8586 Jul 30 10:09 xtrabackup_increment_2_t.frm

-rw-r----- 1 root root 98304 Jul 30 10:09 xtrabackup_increment_2_t.ibd

-rw-r----- 1 root root ?8586 Jul 30 10:09 xtrabackup_increment_3_t.frm

-rw-r----- 1 root root 98304 Jul 30 10:09 xtrabackup_increment_4_t.ibd

-rw-r----- 1 root root ?8586 Jul 30 10:09 xtrabackup_increment_3_t.frm

-rw-r----- 1 root root 98304 Jul 30 10:09 xtrabackup_increment_4_t.ibd

四個增量表已經恢復到新的數據目錄了。

4.5 修改數據目錄的權限

[root@localhost testdb]#chown ?mysql:mysql ?/usr/local/mysql/data

這時候我們應該起數據庫服務。

5.1啟動數據庫服務

[root@localhost testdb]#cd ? /usr/local/mysql

[root@localhost testdb]#bin/mysqld_safe --defaults-file='/etc/my.cnf' --user=root &

啟動成功!可以連接客戶端檢驗數據

6.1連客服端

[root@localhost testdb]#?mysql -u root ?-h localhost ?-P3306 ?-p

MySQL>

mysql> show tables;

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

| Tables_in_testdb ? ? ? ? |

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

| add_data1 ? ? ? ? ? ? ? ?|

| add_data2 ? ? ? ? ? ? ? ?|

| student_t ? ? ? ? ? ? ? ?|

| xtrabackup_increment_1_t |

| xtrabackup_increment_2_t |

| xtrabackup_increment_3_t |

| xtrabackup_increment_4_t|

完成恢復!

四個增備份表和全備份的數據都恢復完成!

到目前為止已經把備份數據恢復完成了。但是還沒有當天數據庫產生的最新數據,要恢復當天的數據,要使用binlog恢復。

7.1恢復當天最新的數據,要利用binlog日志恢復。可以參照binlog的完整恢復

--獲取最后一次增量的log position??

[root@localhost xtrabackup_increment]# cat /opt/xtrabackup_increment/2017-07-29_14-36-51/xtrabackup_binlog_info

mysql_bin.000417 ? ? ? ?154

[root@localhost xtrabackup_increment]# cd /usr/local/mysql


--使用start-position 和stop-datetime? 將日志追加到最新?

/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data_bak/mysql_bin.000417 /usr/local/mysql/data_bak/mysql_bin.000418 --start-position=154| mysql -uroot -p -P3306 --socket=/usr/local/mysql/mysql.sock

到目前為止,數據更新到最后一次flush logs的數據。如果還沒有達到要求。可以先flush logs ,然后把最新的binlog文件恢復。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

補充:

4、備份文件歸檔壓縮

? ?4.1 歸檔并發送到備份服務器

? ? ? # innobackupex --databases=test --user=bak?--password='bak2015' --stream=tar /mysql_backup 2>/mysql_backup/bak.log |ssh root@192.168.18.251 "cat - > /mysql_backup/`date +%F`.tar"

? ? ? 解壓:tar -ixvf?`date +%F`.tar

? ?4.2 歸檔備份

? ? ? # innobackupex --databases=test --user=bak?--password='bak2015' --stream=tar /mysql_backup > /mysql_backup/`date +%F`.tar

? ? ? 解壓:tar -ixvf?`date +%F`.tar

? ?4.3 壓縮歸檔備份

? ? ? # innobackupex --databases=test --user=bak?--password='bak2015' --stream=tar /mysql_backup |gzip >/mysql_backup/`date +%F`.tar.gz

? ? ? 解壓:tar -izxvf?`date +%F`.tar.gz

Xtrabackup備份原理:

物理備份,不鎖表,那么怎么保證現有的數據(備份過程中有尚未提交或已經提交但未同步事務)與復制出來的數據一致呢?

我們知道MySQL修改操作都會先記錄在ib_logfile日志文件,再同步到磁盤,這個文件并重復使用。在復制期間會開啟一個線程用來監控ib_logfile日志文件,如果有修改就從上次記錄的日志序列號(checkpoins)開始復制新增內容到Logfile文件。復制結束后,把logfile事務日志進行回滾,把未完成的事務同步到ibdata1和ibd里面,來保證數據一致性。這與Mysql崩潰后恢復基本操作一樣

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,892評論 2 372

推薦閱讀更多精彩內容