詳解mysql備份恢復的三種實現方式

一、Mysql備份策略:

完整備份:

完整備份就是指對某一個時間點上的所有數據或應用進行的一個完整拷貝,對數據量大的,備份時間較長,當然數據在恢復的時候快。

增量備份:

備份自上一次備份(包括完整備份,差異備份,增量備份)之後所有變化的數據進行備份。恢復的時候只需要一次完整的備份加上完整備份後的多個增量備份進行恢復即可。

差異備份:

備份自上一次完整備份之後所有變化的數據,恢復的時候僅需要最新一次完整備份加上差異備份即可。

詳細如下圖所示:

備份方式:

1、使用 mysqldump 進行邏輯備份

2、使用 LVM 快照備份:

快照備份就是把當時的場景保存爲一個不變的狀態,然後對這個不變的狀態進行備份。但然,在規劃mysql數據庫時最好將數據和日誌分開放到lvm分區中。使用LVM快照備份,需要將數據放在lvm分區。

3、Xtrabackup備份:

備份原理:

       XtraBackup 基於 InnoDB  crash-recovery 功能。 它會複製 innodb data file ,由於不鎖表,複製出來的數據是不一致的, 在恢復的時候使用 crash-recovery ,使得數據恢復一致。 InnoDB 維護了一個 redo log ,又稱爲 transaction log ,事務日誌, 它包含了 innodb 數據的所有改動情況。

當InnoDB啓動的時候,它會先去檢查datafile和transaction log,並且會做二步操作:

1.Itapplies committed transaction log entries to the data files

2.itperforms an undo operation on any transactions that modified data but did notcommit.

XtraBackup在備份的時候,一頁一頁地複製innodb的數據,而且不鎖定表,

與此同時,XtraBackup還有另外一個線程監視着transactionslog,

一旦log發生變化,就把變化過的logpages複製走。

爲什麼要急着複製走呢?前幾章的時候就提過這個問題,

因爲transactions log文件大小有限,寫滿之後,就會從頭再開始寫,

所以新數據可能會覆蓋到舊的數據。

在prepare過程中,XtraBackup使用複製到的transactionslog 對備份出來的innodb data file 進行crash recovery。

用mysqldump實現備份:

首先,mysqldump是mysql的一個客戶端工具,可以實現備份整個服務器、單個或部分數據庫、單個或部分表、表中的某些行,存儲過程,存儲函數,觸發器等,能自動記錄備份時的二進制日誌文件及相應的position值

二、詳解用mysqldump實現備份恢復操作:

首先,mysqldump是mysql的一個客戶端工具,可以實現備份整個服務器、單個或部分數據庫、單個或部分表、表中的某些行,存儲過程,存儲函數,觸發器等,能自動記錄備份時的二進制日誌文件及相應的position值

對mysqldump參數說明:

--all-databases  , -A      // 導出全部數據庫。

--all-tablespaces  , -Y     // 導出全部表空間。

--no-tablespaces  , -y     // 不導出任何表空間信息。

--add-drop-database     // 每個數據庫創建之前添加drop數據庫語句。

--add-drop-table                 // 每個數據表創建之前添加drop數據表語句。(默認爲打開狀態,使用--skip-add-drop-table取消選項)

--add-locks                    // 在每個表導出之前增加LOCK TABLES並且之後UNLOCK  TABLE。(默認爲打開狀態,使用--skip-add-locks取消選項)

--allow-keywords          // 允許創建是關鍵詞的列名字。這由表名前綴於每個列名做到。

--apply-slave-statements // 在'CHANGE MASTER'前添加'STOP SLAVE',並且在導出的最後添加'START SLAVE'。

--character-sets-dir        // 字符集文件的目錄

--comments                   // 附加註釋信息。默認爲打開,可以用--skip-comments取消

--compatible                  // 導出的數據將和其它數據庫或舊版本的MySQL 相兼容。值可以爲ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options等,

要使用幾個值,用逗號將它們隔開。它並不保證能完全兼容,而是儘量兼容。

--compact                      // 導出更少的輸出信息(用於調試)。去掉註釋和頭尾等結構。可以使用選項:--skip-add-drop-table  --skip-add-locks --skip-comments --skip-disable-keys

--complete-insert,  -c     // 使用完整的insert語句(包含列名稱)。這麼做能提高插入效率,但是可能會受到max_allowed_packet參數的影響而導致插入失敗。

--compress, -C      // 在客戶端和服務器之間啓用壓縮傳遞所有信息

--create-options,  -a      // 在CREATE TABLE語句中包括所有MySQL特性選項。(默認爲打開狀態)

--databases,  -B      // 導出幾個數據庫。參數後面所有名字參量都被看作數據庫名。

--debug          // 輸出debug信息,用於調試。默認值爲:d:t:o,/tmp/mysqldump.trace

--debug-check    // 檢查內存和打開文件使用說明並退出。

--debug-info       // 輸出調試信息並退出

--delete-master-logs           //master 備份後刪除日誌. 這個參數將自動激活--master-data。

--disable-keys           // 對於每個表,用/*!40000 ALTER TABLE tbl_name DISABLE KEYS */;和/*!40000 ALTER TABLE tbl_name ENABLE KEYS */;語句引用INSERT語句。這樣可以更快地導入dump出來的文件,因爲它是在插入所有行後創建索引的。該選項只適合MyISAM表,默認爲打開狀態。

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

--events, -E      // 導出事件。

--flush-logs   // 開始導出之前刷新日誌。

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

--flush-privileges // 在導出mysql數據庫之後,發出一條FLUSH  PRIVILEGES 語句。爲了正確恢復,該選項應該用於導出mysql數據庫和依賴mysql數據庫數據的任何時候。

--ignore-table     // 不導出指定表。指定忽略多個表時,需要重複多次,每次一個表。每個表必須同時指定數據庫和表名。

--lock-all-tables,  -x // 提交請求鎖定所有數據庫中的所有表,以保證數據的一致性。這是一個全局讀鎖,並且自動關閉--single-transaction 和--lock-tables 選項。

mysqldump  -uroot -p --host=localhost --all-databases --lock-all-tables

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

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

--log-error     // 附加警告和錯誤信息到給定文件

--master-data // 該選項將binlog的位置和文件名追加到輸出文件中。如果爲1,將會輸出CHANGE MASTER 命令;如果爲2,輸出的CHANGE  MASTER命令前添加註釋信息。該選項將打開--lock-all-tables 選項,除非--single-transaction也被指定(在這種情況下,全局讀鎖在開始導出時獲得很短的時間;其他內容參考下面的--single-transaction選項)。該選項自動關閉--lock-tables選項。

--no-create-db,  -n   // 只導出數據,而不添加CREATE DATABASE 語句。

--no-create-info,  -t

只導出數據,而不添加CREATE TABLE 語句。

mysqldump  -uroot -p --host=localhost --all-databases --no-create-info

--no-data, -d       // 不導出任何數據,只導出數據庫表結構。

--order-by-primary  // 如果存在主鍵,或者第一個唯一鍵,對每個表的記錄進行排序。在導出MyISAM表到InnoDB表時有效,但會使得導出工作花費很長時間。

--quick, -q     // 不緩衝查詢,直接導出到標準輸出。默認爲打開狀態,使用--skip-quick取消該選項。

--opt         // 同時啓用各種高級選項

--routines, -R      // 導出存儲過程以及自定義函數。

--single-transaction // 該選項在導出數據之前提交一個BEGIN SQL語句,BEGIN 不會阻塞任何應用程序且能保證導出時數據庫的一致性狀態。它只適用於多版本存儲引擎,僅InnoDB。本選項和--lock-tables 選項是互斥的,因爲LOCK  TABLES 會使任何掛起的事務隱含提交。要想導出大表的話,應結合使用--quick 選項。

--dump-date       // 將導出時間添加到輸出文件中。默認爲打開狀態,使用--skip-dump-date關閉選項。

--skip-opt           // 禁用–opt選項.

--socket,-S     // 指定連接mysql的socket文件位置,默認路徑/tmp/mysql.sock

--triggers       // 導出觸發器。該選項默認啓用,用--skip-triggers禁用它。

--user, -u        // 指定連接的用戶名。

--verbose, --v           // 輸出多種平臺信息。

--version, -V        // 輸出mysqldump版本信息並退出

實例詳解  操作時數據庫以及庫中的表可以自己創建,主要講解備份的過程及其中的要點

詳解一:對catidb數據庫進行完全備份:

mysql>use catidb;
Databasechanged
mysql>show tables;  //使用catidb數據庫查看其中的表
+------------------+
|Tables_in_catidb |
+------------------+
|tb1              |
|tb2              |
+------------------+
2rows in set (0.00 sec)

對catidb數據庫進行備份,恢復

[root@localhost~]# mysqldump -uroot -pmypass catidb > /tmp/catidb.sql  //用這種方法對catidb數據庫進行備份,在數據庫恢復時有一個問題,即該catidb.sql文件中沒用創建catidb數據庫的語句,在恢復時所含所有表會恢復到當前默認的數據庫中,相當的危險,因此需要謹慎,在恢復之前一定要先創建數據庫
mysql>drop database catidb;     //備份之後將catidb數據庫刪除
QueryOK, 2 rows affected (0.07 sec)
mysql>create database catidb;   //在恢復之前一定要先創建數據庫,數據庫名字可以自己定義
QueryOK, 1 row affected (0.04 sec)
mysql>use catidb;
Databasechanged
mysql>source /tmp/catidb.sql    //進行數據恢復
mysql>show tables;        //恢復成功
+------------------+
|Tables_in_catidb |
+------------------+
|tb1              |
|tb2              |
+------------------+
2rows in set (0.01 sec)

詳解二:

利用mysqldump實現從邏輯角度完全備份mysql,配合二進制日誌備份實現增量備份

仍以上面的catidb數據庫爲例先對catidb 數據庫進行完全備份

mysql>use catidb;
Databasechanged
mysql>show tables;
+------------------+
|Tables_in_catidb |
+------------------+
|tb1              |
|tb2              |
+------------------+
2rows in set (0.00 sec)

對catidb數據庫進行完全備份

[root@localhost~]# mysqldump -uroot -pmypass --single-transaction --master-data=2 --databasescatidb > /backup/catidb_`date +%F`.sql

備份完成之後又對catidb數據庫進行了新的操作

mysql>show tables;
+------------------+
|Tables_in_catidb |
+------------------+
|tb1              |
|tb2              |
+------------------+
2rows in set (0.00 sec)
mysql>use catidb
Databasechanged
mysql>create table tb3 (id int);
QueryOK, 0 rows affected (0.11 sec)
mysql>insert into tb3 values (1),(6),(9);
QueryOK, 3 rows affected (0.09 sec)
Records:3  Duplicates: 0  Warnings: 0

進行增量備份: 從上一次完全備份完成後,到所有新的操作之前,那麼如何查看記錄的位置

開始位置:

[root@localhost~]# less /backup/catidb_2013-09-07.sql
--MySQL dump 10.13  Distrib 5.5.33, forLinux (x86_64)
--
--Host: localhost    Database: catidb
--------------------------------------------------------
--Server version       5.5.33-log
/*!40101SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101SET NAMES utf8 */;
/*!40103SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103SET TIME_ZONE='+00:00' */;
/*!40014SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
--Position to start replication or point-in-time recovery from
--
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=1673;

結束位置:

mysql>show master status;
+------------------+----------+--------------+------------------+
|File             | Position |Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |     1959 |              |                  |
+------------------+----------+--------------+------------------+
1row in set (0.00 sec)

二進制增量備份

[root@localhost~]# mysqlbinlog --start-position=1673 --stop-position=1959/mydata/data/mysql-bin.000004 > /backup/catidb_`date +%F_%H`.sql

之後又進行了一些操作

記錄一次此刻二進制日誌的位置

mysql>show master status;
+------------------+----------+--------------+------------------+
|File             | Position |Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
|mysql-bin.000004 |     1959 |              |                  |
+------------------+----------+--------------+------------------+
1row in set (0.00 sec)
mysql>use catidb;
Databasechanged
mysql>insert into tb3 values (2),(5);
QueryOK, 2 rows affected (0.11 sec)
Records:2  Duplicates: 0  Warnings: 0

之後不小心刪除了catidb數據庫

mysql>drop database catidb;

QueryOK, 3 rows affected (0.13 sec)

開始進行恢復操作,首先把所需二進制日誌導出來

[root@localhost~]# mysqlbinlog --start-position=1959 /mydata/data/mysql-bin.000004
/*!50530SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019SET @@session.max_insert_delayed_threads=0*/;
/*!50003SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER/*!*/;
#at 4
#130907  5:41:54 server id 1  end_log_pos 107      Start: binlog v 4, server v 5.5.33-log created 130907  5:41:54 at startup
#Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG'
IkwqUg8BAAAAZwAAAGsAAAABAAQANS41LjMzLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAiTCpSEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA==
'/*!*/;
#at 1959
#130907  9:53:14 server id 1  end_log_pos 2029    Query  thread_id=6    exec_time=0 error_code=0
SETTIMESTAMP=1378518794/*!*/;
SET@@session.pseudo_thread_id=6/*!*/;
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/*!*/;
/*!\Cutf8 *//*!*/;
SET@@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET@@session.lc_time_names=0/*!*/;
SET@@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
#at 2029
#130907  9:53:14 server id 1  end_log_pos 2124    Query  thread_id=6    exec_time=0 error_code=0
use`catidb`/*!*/;
SETTIMESTAMP=1378518794/*!*/;
insertinto tb3 values (2),(5)
/*!*/;
#at 2124
#130907  9:53:14 server id 1  end_log_pos 2151    Xid = 175
COMMIT/*!*/;
# at 2151
#130907  9:54:04 server id 1  end_log_pos 2236    Query  thread_id=6    exec_time=1 error_code=0
SETTIMESTAMP=1378518844/*!*/;
drop database catidb
/*!*/;
DELIMITER;
#End of log file
ROLLBACK/* added by mysqlbinlog */;
/*!50003SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

注意我們保存的是drop catidb數據庫之前的內容,因此需要查看其中的位置,此時爲2151

開始導出二進制日誌

[root@localhost~]# mysqlbinlog --start-position=1959 --stop-position=2151/mydata/data/mysql-bin.000004 > /tmp/catidb_binlog.sql

開始恢復,此時不需要啓動二進制日誌

mysql>set sql_log_bin=0;
QueryOK, 0 rows affected (0.00 sec)
mysql>flush logs; //滾動二進制日誌
QueryOK, 0 rows affected (0.17 sec)

可以在命令行中進行導入,進行恢復操作,完全備份+增量備份+二進制日誌

[root@localhost~]# mysql -uroot -pmypass < /backup/catidb_2013-09-07.sql //恢復完全備份
[root@localhost~]# mysql -uroot -pmypass < /backup/catidb_2013-09-07_09.sql     //恢復增量備份
[root@localhost~]# mysql -uroot -pmypass < /tmp/catidb_binlog.sql      //恢復二進制日誌

之後連到Mysql,進行查看

mysql>use catidb;
Databasechanged
mysql>show tables;
+------------------+
|Tables_in_catidb |
+------------------+
|tb1              |
|tb2              |
|tb3              |
+------------------+
3rows in set (0.00 sec)
mysql>select * from tb3;
+------+
|id   |
+------+
|    1 |
|    6 |
|    9 |
|    2 |
|    5 |
+------+
5rows in set (0.00 sec)

備份恢復完成!

注意:對於一般的備份,是針對整個服務器進行備份的因此所用的選項應該是—all-databases;

三、詳解利用lvm的快照來備份Mysql及其恢復

首先進行一次完全備份

[root@localhost~]# mysqldump -uroot -pmypass --lock-all-tables --all-databases --events >/backup/all_db_`date +%F`.sql
[root@localhost~]# service mysqld stop 停止Mysql服務
Shuttingdown MySQL....                                    [  OK  ]
[root@localhost~]# rm -rf /mydata/*

要求創建邏輯卷並將其掛載至/mydata下,過程不在演示

[root@localhost~]# mount
/dev/mapper/vg0-rooton / type ext4 (rw)
procon /proc type proc (rw)
sysfson /sys type sysfs (rw)
devptson /dev/pts type devpts (rw,gid=5,mode=620)
tmpfson /dev/shm type tmpfs (rw)
/dev/sda1on /boot type ext4 (rw)
/dev/mapper/vg0-usron /usr type ext4 (rw)
/dev/mapper/vg0-varon /var type ext4 (rw)
noneon /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpcon /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/mapper/myvg-mydata on /mydata type ext4 (rw)
[root@localhost~]# mkdir /mydata/data/ 在邏輯捲上創建數據目錄
[root@localhost~]# chown -R mysql.mysql /mydata/data修改數據目錄的權限
[root@localhost~]# cd /usr/local/mysql
[root@localhostmysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data  //初始化腳本

在配置文件中添加/etc/my.cnf

[mysqld]
port            = 3306
socket          = /tmp/mysql.sock
skip-external-locking
key_buffer_size= 256M
max_allowed_packet= 1M
table_open_cache= 256
sort_buffer_size= 1M
read_buffer_size= 1M
read_rnd_buffer_size= 4M
myisam_sort_buffer_size= 64M
thread_cache_size= 8
query_cache_size=16M
#Try number of CPU's*2 for thread_concurrency
thread_concurrency= 8
datadir=/mydata/data
sync_binlog= 1

啓動mysqld服務

[root@localhost~]# service mysqld start

連到Mysql上

mysql>set session sql_log_bin=0; 關閉二進制日誌
QueryOK, 0 rows affected (0.00 sec)
mysql>source /backup/all_db_2013-09-07.sql 恢復所有數據庫
mysql>show databases;
+--------------------+
|Database           |
+--------------------+
|information_schema |
|catidb             |
|hailian            |
|hellodb            |
|mysql              |
|performance_schema |
|test               |
+--------------------+
7rows in set (0.00 sec)
mysql>\q
Bye

從新連到Mysql是爲了開啓二進制日誌功能

mysql>show binary logs;
+------------------+-----------+
|Log_name         | File_size |
+------------------+-----------+
|mysql-bin.000001 |     27719 |
|mysql-bin.000002 |   1061358 |
|mysql-bin.000003 |       182 |
+------------------+-----------+
3rows in set (0.00 sec)
mysql>flush tables with read lock;
QueryOK, 0 rows affected (0.09 sec)
mysql>show master status;
+------------------+----------+--------------+------------------+
|File             | Position |Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
|mysql-bin.000003 |      182 |              |                  |
+------------------+----------+--------------+------------------+
1row in set (0.00 sec)
也可以通過[root@localhost ~]# mysql -uroot -pmypass -e 'show master status'> /backup/snapback-2
013-09-07/binlog.txt保存到binlog.txt文檔中
[root@localhost~]# lvcreate -L 100M -n mydata-snap -p r -s /dev/myvg/mydata
mysql>unlock tables;
QueryOK, 0 rows affected (0.00 sec)
[root@localhost~]# cp -a /mydata/data/* /backup/snapback-2013-09-07/

之後連到mysql上有進行了一下操作

mysql>use hellodb;
Databasechanged
mysql>show tables;
+-------------------+
|Tables_in_hellodb |
+-------------------+
|classes           |
|coc               |
|courses           |
|scores            |
|students          |
|teachers          |
|toc               |
+-------------------+
7rows in set (0.00 sec)
mysql>create table testtb (id int, name char(10));
QueryOK, 0 rows affected (0.12 sec)
mysql>insert into testtb values (1,'tom');
QueryOK, 1 row affected (0.10 sec)
[root@localhost~]# mysqlbinlog --start-position=187 /mydata/data/mysql-bin.000003 >/backup/snapback-2013-09-07_incremental/incremental.sql
[root@localhost~]# service mysqld stop
[root@localhost~]# rm -rf /mydata/data/*
[root@localhost~]# cp /backup/snapback-2013-09-07/* /mydata/data/ -a
[root@localhost~]# chown -R mysql.mysql /mydata/data/*
[root@localhost~]# service mysqld start

恢復二進制日誌:

mysql>set sql_log_bin=0;
mysql>source /backup/snapback-2013-09-07_incremental/incremental.sql
mysql>use hellodb;
Databasechanged
mysql>show tables;
+-------------------+
|Tables_in_hellodb |
+-------------------+
|classes           |
|coc               |
|courses           |
|scores            |
|students          |
|teachers          |
|testtb            |
|toc               |
+-------------------+
8rows in set (0.00 sec)
mysql>select * from testtb;
+------+------+
|id   | name |
+------+------+
|    1 | tom |
+------+------+
1row in set (0.00 sec)

備份恢復完成

四、詳解使用Xtrabackup進行MySQL備份

爲使每表單個表空間,先把所有數據備份出來,設置從新進行初始化:

[root@localhost~]# mysqldump -uroot -pmypass --lock-all-tables --all-databases --master-data=2--events > /root/alldb.sql
[root@localhost~]# cd /mydata/data/
[root@localhostdata]# rm -rf *
[root@localhostdata]# cd
[root@localhost~]# cd /usr/local/mysql/
[root@localhostmysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data/

修改配置文件/etc/my.cnf

[mysqld]
port            = 3306
socket          = /tmp/mysql.sock
skip-external-locking
key_buffer_size= 256M
max_allowed_packet= 1M
table_open_cache= 256
sort_buffer_size= 1M
read_buffer_size= 1M
read_rnd_buffer_size= 4M
myisam_sort_buffer_size= 64M
thread_cache_size= 8
query_cache_size=16M
#Try number of CPU's*2 for thread_concurrency
thread_concurrency= 8
datadir=/mydata/data    //數據目錄
sync_binlog= 1                //立刻進行二進制日誌同步
innodb_file_per_table = 1    //實現每表單個表空間

連到mysql上

mysql>show global variables like 'innodb_file%';
+--------------------------+----------+
|Variable_name            | Value    |
+--------------------------+----------+
|innodb_file_format       | Antelope |
|innodb_file_format_check | ON       |
|innodb_file_format_max   | Antelope |
| innodb_file_per_table   | ON       |
+--------------------------+----------+
4rows in set (0.00 sec)
mysql> source /root/alldb.sql
mysql>show databases;
+--------------------+
|Database           |
+--------------------+
|information_schema |
|catidb             |
|hailian            |
|hellodb            |
|mysql              |
|performance_schema |
|test               |
+--------------------+
7rows in set (0.00 sec)
mysql>use hellodb;
Databasechanged
mysql>show tables;
+-------------------+
|Tables_in_hellodb |
+-------------------+
|classes           |
|coc               |
|courses           |
|scores            |
|students          |
|teachers          |
|testtb            |
|toc               |
+-------------------+
8rows in set (0.00 sec)
mysql>use catidb;
Databasechanged
mysql>show tables;
+------------------+
|Tables_in_catidb |
+------------------+
|tb1              |
|tb2              |
|tb3              |
+------------------+
3rows in set (0.00 sec)
mysql>select * from hellodb.testtb;
+------+------+
|id   | name |
+------+------+
|    1 | tom |
+------+------+
1row in set (0.00 sec)

可以看到所有數據庫都是每表單個表空間

[root@localhosthellodb]# ls
classes.frm  coc.ibd     db.opt      students.frm  teachers.ibd toc.frm
classes.ibd  courses.frm scores.frm  students.ibd  testtb.frm   toc.ibd
coc.frm      courses.ibd  scores.ibd teachers.frm  testtb.ibd

下載兩個rpm包

percona-xtrabackup-2.1.4-656.rhel6.x86_64.rpm

percona-toolkit-2.2.4-1.noarch.rpm

進行安裝爲解決依賴關係用yum命令:

[root@localhost~]# yum localinstall percona-xtrabackup-2.1.4-656.rhel6.x86_64.rpm
[root@localhost~]# yum localinstall percona-toolkit-2.2.4-1.noarch.rpm –y

首先進行一次完全備份

[root@localhost~]# mkdir /innobackup  //作爲備份使用目錄
[root@localhost~]# innobackupex --user=root --password=mypass /innobackup/

下面是最後顯示的一部分結果,需要關注的部分用紅色顯示

xtrabackup:Transaction log of lsn (1665573) to (1665573) wascopied.
13090821:47:22  innobackupex: All tablesunlocked
innobackupex:Backup created in directory '/innobackup/2013-09-08_21-47-18'
innobackupex:MySQL binlog position: filename 'mysql-bin.000005', position 542565
13090821:47:22  innobackupex: Connection todatabase server closed
13090821:47:22  innobackupex: completed OK!
[root@localhost~]# cd /innobackup/
[root@localhostinnobackup]# ls
2013-09-08_21-47-18
[root@localhostinnobackup]# cd 2013-09-08_21-47-18/
[root@localhost2013-09-08_21-47-18]# ls
backup-my.cnf  hailian ibdata1  performance_schema  xtrabackup_binary       xtrabackup_checkpoints
catidb         hellodb  mysql   test               xtrabackup_binlog_info xtrabackup_logfile
[root@localhost2013-09-08_21-47-18]# cat xtrabackup_checkpoints
backup_type= full-backuped
from_lsn= 0
to_lsn= 1665573
last_lsn= 1665573
compact= 0
[root@localhost2013-09-08_21-47-18]# cat xtrabackup_binlog_info //顯示使用的哪個二進制日誌以及位置
mysql-bin.000005 542565

進行一次完全備份後連到Mysql上,做了一些修改

mysql>show tables;
+-------------------+
|Tables_in_hellodb |
+-------------------+
|classes           |
|coc               |
|courses           |
|scores            |
|students          |
|teachers          |
|testtb            |
|toc               |
+-------------------+
8rows in set (0.00 sec)
mysql>select * from students;
+-------+---------------+-----+--------+---------+-----------+
|StuID | Name          | Age | Gender |ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
|     1 | Shi Zhongyu   |  22| M      |       2 |         3 |
|     2 | Shi Potian    |  22| M      |       1 |         7 |
|     3 | Xie Yanke     | 53 | M      |       2 |        16 |
|     4 | Ding Dian     | 32 | M      |       4 |         4 |
|     5 | Yu Yutong     | 26 | M      |       3 |         1 |
|     6 | Shi Qing      | 46 | M      |       5 |     NULL |
|     7 | Xi Ren        | 19 | F      |       3 |     NULL |
|     8 | Lin Daiyu     | 17 | F      |       7 |     NULL |
|     9 | Ren Yingying  |  20 |F      |       6 |     NULL |
|    10 | Yue Lingshan  |  19 |F      |       3 |     NULL |
|    11 | Yuan Chengzhi |  23 | M     |       6 |      NULL |
|    12 | Wen Qingqing  |  19 |F      |       1 |     NULL |
|    13 | Tian Boguang  |  33 |M      |       2 |     NULL |
|    14 | Lu Wushuang   |  17| F      |       3 |     NULL |
|    15 | Duan Yu       | 19 | M      |       4 |     NULL |
|    16 | Xu Zhu        | 21 | M      |       1 |     NULL |
|    17 | Lin Chong     | 25 | M      |       4 |     NULL |
|    18 | Hua Rong      | 23 | M      |       7 |     NULL |
|    19 | Xue Baochai   |  18| F      |       6 |     NULL |
|    20 | Diao Chan     | 19 | F      |       7 |     NULL |
|    21 |Huang Yueying |  22 | F      |      6 |      NULL |
|    22 | Xiao Qiao     | 20 | F      |       1 |     NULL |
|    23 | Ma Chao       | 23 | M      |       4 |     NULL |
|    24 | Xu Xian       | 27 | M      |    NULL |     NULL |
|    25 | Sun Dasheng   | 100 | M      |   NULL |      NULL |
+-------+---------------+-----+--------+---------+-----------+
25rows in set (0.00 sec)
mysql>delete from students where stuid >= 24;
QueryOK, 2 rows affected (0.01 sec)
mysql>\q

注意:如果有增量時只能提交事務,不能回滾事務

使用innobackupex進行增量備份

進行第一次增量備份

--incremental 明確說明進行增量備份的存放位置,--incremental-basedir表示增量相對的文件

[root@localhost~]# innobackupex --user=root --password=mypass --incremental /innobackup/--incremental-basedir=/innobackup/2013-09-08_21-47-18/
[root@localhost~]# cd /innobackup/
[root@localhostinnobackup]# ls
2013-09-08_21-47-18  2013-09-09_00-30-21
[root@localhostinnobackup]# cd 2013-09-09_00-30-21/
[root@localhost2013-09-09_00-30-21]# ls
backup-my.cnf  ibdata1.meta        xtrabackup_binlog_info
catidb         mysql               xtrabackup_checkpoints
hailian        performance_schema  xtrabackup_logfile
hellodb        test
ibdata1.delta  xtrabackup_binary
[root@localhost2013-09-09_00-30-21]# cat xtrabackup_checkpoints
backup_type= incremental
from_lsn= 1665573
to_lsn= 1666830
last_lsn= 1666830
compact= 0

連到Mysql上進行第二次修改操作

mysql>use hellodb;
Databasechanged
mysql>show tables
    -> ;
+-------------------+
|Tables_in_hellodb |
+-------------------+
|classes           |
|coc               |
|courses           |
|scores            |
|students          |
|teachers          |
|testtb            |
|toc               |
+-------------------+
8rows in set (0.00 sec)
mysql>desc students;
+-----------+---------------------+------+-----+---------+----------------+
|Field     | Type                | Null | Key | Default |Extra          |
+-----------+---------------------+------+-----+---------+----------------+
|StuID     | int(10) unsigned    | NO  | PRI | NULL    | auto_increment |
|Name      | varchar(50)         | NO  |     | NULL    |                |
|Age       | tinyint(3) unsigned | NO   |    | NULL    |                |
|Gender    | enum('F','M')       | NO  |     | NULL    |                |
|ClassID   | tinyint(3) unsigned |YES  |    | NULL    |                |
|TeacherID | int(10) unsigned    |YES  |    | NULL    |                |
+-----------+---------------------+------+-----+---------+----------------+
6rows in set (0.00 sec)
mysql>insert into students (Name,Age,Gender,ClassID,TeacherID) values('tom',33,'M',2,4);
QueryOK, 1 row affected (0.01 sec)

進行第二次增量備份

[root@localhost~]# innobackupex --user=root --password=mypass --incremental /innobackup/ --incremental-basedir=/innobackup/2013-09-09_00-30-21/

注意:第二次增量備份是相對於第一次增量備份而言的,主要是—incremental-basedir的路徑

第二次增量備份之後連到Mysql上又進行了一些修改

mysql>use hellodb;
Databasechanged
mysql>show tables;
+-------------------+
|Tables_in_hellodb |
+-------------------+
|classes           |
|coc               |
|courses           |
|scores            |
|students          |
|teachers          |
|testtb            |
|toc               |
+-------------------+
8rows in set (0.00 sec)
mysql>select * from coc;
+----+---------+----------+
|ID | ClassID | CourseID |
+----+---------+----------+
|  1 |      1 |        2 |
|  2 |      1 |        5 |
|  3 |      2 |        2 |
|  4 |      2 |        6 |
|  5 |      3 |        1 |
|  6 |      3 |        7 |
|  7 |      4 |        5 |
|  8 |      4 |        2 |
|  9 |      5 |        1 |
|10 |       5 |        9 |
|11 |       6 |        3 |
|12 |       6 |        4 |
|13 |       7 |        4 |
|14 |       7 |        3 |
+----+---------+----------+
14rows in set (0.00 sec)
mysql>delete from coc where id=14;
QueryOK, 1 row affected (0.01 sec)
mysql>\q

把二進制日誌複製出來,模擬mysql服務崩潰

[root@localhost~]# cd /mydata/data/
[root@localhostdata]# ls
catidb       localhost.localdomain.err  mysql-bin.000004
hailian      localhost.localdomain.pid  mysql-bin.000005
hellodb      mysql                      mysql-bin.index
ibdata1      mysql-bin.000001           performance_schema
ib_logfile0  mysql-bin.000002           test
ib_logfile1  mysql-bin.000003
[root@localhostdata]# cp mysql-bin.00000[1-5] /tmp/
[root@localhostdata]# service mysqld stop
Shuttingdown MySQL.                                       [  OK  ]
[root@localhostdata]# rm -rf *

對二進制日誌進行備份:

[root@localhostdata]# cd /innobackup/
[root@localhostinnobackup]# ls
2013-09-08_21-47-18  2013-09-09_00-30-21  2013-09-09_00-40-47
[root@localhostinnobackup]# cd 2013-09-09_00-40-47/
[root@localhost2013-09-09_00-40-47]# ls
backup-my.cnf  ibdata1.meta        xtrabackup_binlog_info
catidb         mysql               xtrabackup_checkpoints
hailian        performance_schema  xtrabackup_logfile
hellodb        test
ibdata1.delta  xtrabackup_binary
[root@localhost2013-09-09_00-40-47]# cat xtrabackup_binlog_info
mysql-bin.000005 543041
[root@localhost~]# cd /tmp/
[root@localhosttmp]# mysqlbinlog --start-position=543041 mysql-bin.000005 > ./all.sql

恢復前的準備工作:

[root@localhost~]# innobackupex --apply-log --redo-only /innobackup/2013-09-08_21-47-18/
 [root@localhost ~]# innobackupex --apply-log--redo-only /innobackup/2013-09-08_21-47-18/ --incremental-dir=/innobackup/2013-09-09_00-30-21/
 [root@localhost ~]# innobackupex --apply-log--redo-only /innobackup/2013-09-08_21-47-18/--incremental-dir=/innobackup/2013-09-09_00-40-47/

進行恢復操作

[root@localhost~]# innobackupex --copy-back /innobackup/2013-09-08_21-47-18/
[root@localhost~]# cd /mydata/data/
[root@localhostdata]# chown -R mysql.mysql *
[root@localhostdata]# ll
total18456
drwxr-xr-x2 mysql mysql     4096 Sep  9 01:22 catidb
drwxr-xr-x2 mysql mysql     4096 Sep  9 01:22 hailian
drwxr-xr-x2 mysql mysql     4096 Sep  9 01:22 hellodb
-rw-r--r--1 mysql mysql 18874368 Sep  9 01:22ibdata1
drwxr-xr-x2 mysql mysql     4096 Sep  9 01:22 mysql
drwxr-xr-x2 mysql mysql     4096 Sep  9 01:22 performance_schema
drwxr-xr-x2 mysql mysql     4096 Sep  9 01:22 test
[root@localhostdata]# service mysqld start
mysql>use hellodb;
Databasechanged
mysql>select * from students;
+-------+---------------+-----+--------+---------+-----------+
|StuID | Name          | Age | Gender |ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
|     1 | Shi Zhongyu   |  22| M      |       2 |         3 |
|     2 | Shi Potian    |  22| M      |       1 |         7 |
|     3 | Xie Yanke     | 53 | M      |       2 |        16 |
|     4 | Ding Dian     | 32 | M      |       4 |        4 |
|     5 | Yu Yutong     | 26 | M      |       3 |         1 |
|     6 | Shi Qing      | 46 | M      |       5 |     NULL |
|     7 | Xi Ren        | 19 | F      |       3 |     NULL |
|     8 | Lin Daiyu     | 17 | F      |       7 |     NULL |
|     9 | Ren Yingying  |  20 |F      |       6 |     NULL |
|    10 | Yue Lingshan  |  19 |F      |       3 |     NULL |
|    11 | Yuan Chengzhi |  23 | M     |       6 |      NULL |
|    12 | Wen Qingqing  |  19 |F      |       1 |     NULL |
|    13 | Tian Boguang  |  33 |M      |       2 |     NULL |
|    14 | Lu Wushuang   |  17| F      |       3 |     NULL |
|    15 | Duan Yu       | 19 | M      |       4 |     NULL |
|    16 |Xu Zhu        |  21 | M     |       1 |      NULL |
|    17 | Lin Chong     | 25 | M      |       4 |     NULL |
|    18 | Hua Rong      | 23 | M      |       7 |     NULL |
|    19 | Xue Baochai   |  18| F      |       6 |     NULL |
|    20 | Diao Chan     | 19 | F      |       7 |     NULL |
|    21 | Huang Yueying |  22 | F     |       6 |      NULL |
|    22 | Xiao Qiao     | 20 | F      |       1 |     NULL |
|    23 | Ma Chao       | 23 | M      |       4 |     NULL |
|    26 | tom           | 33 | M      |       2 |         4 |
+-------+---------------+-----+--------+---------+-----------+
24rows in set (0.00 sec)
mysql>select * from coc;
+----+---------+----------+
|ID | ClassID | CourseID |
+----+---------+----------+
|  1 |      1 |        2 |
|  2 |      1 |        5 |
|  3 |      2 |        2 |
|  4 |      2 |        6 |
|  5 |      3 |        1 |
|  6 |      3 |        7 |
|  7 |      4 |        5 |
|  8 |      4 |        2 |
|  9 |      5 |        1 |
|10 |       5 |        9 |
|11 |       6 |        3 |
|12 |       6 |        4 |
|13 |       7 |        4 |
|14 |       7 |        3 |
+----+---------+----------+
14rows in set (0.00 sec)
mysql>set sql_log_bin=0;
QueryOK, 0 rows affected (0.00 sec)
mysql>source /tmp/all.sql;
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
Charsetchanged
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
Databasechanged
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 1 row affected (0.00 sec)
QueryOK, 0 rows affected (0.01 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
QueryOK, 0 rows affected (0.00 sec)
mysql>select * from coc;
+----+---------+----------+
|ID | ClassID | CourseID |
+----+---------+----------+
|  1 |      1 |        2 |
|  2 |      1 |        5 |
|  3 |      2 |        2 |
|  4 |      2 |        6 |
|  5 |      3 |        1 |
|  6 |      3 |        7 |
|  7 |      4 |        5 |
|  8 |      4 |        2 |
|  9 |      5 |        1 |
|10 |       5 |        9 |
|11 |       6 |        3 |
|12 |       6 |        4 |
|13 |       7 |        4 |
+----+---------+----------+
13rows in set (0.00 sec)

恢復操作完成

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