1. 程式人生 > >MySQL常見備份與恢復方案

MySQL常見備份與恢復方案

MySQL常見備份方案有以下三種:

mysqldump + binlog

lvm + binlog

xtrabackup

本例為方便演示,資料庫裡面資料為空。下面開始動手

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

mkdir /opt/backup                                #建立備份目錄

mkdir -p /data/3309/{data,binlog}    

cd /usr/local/mysql/

scripts/mysql_install_db --user=mysql --datadir=/data/3309/data/ --basedir=/usr/local/mysql/

chown mysql.mysql -R /data/3309/

cp support-files/my-small.cnf /data/3309/my.cnf   #提供配置檔案

vim /data/3309/my.cnf                             #編輯配置檔案

[client]

#password       = your_password

port            = 3309

socket          = /tmp/mysql.sock4

# The MySQL server

[mysqld]

port            = 3309

socket          = /tmp/mysql.sock4

skip-external-locking

key_buffer_size = 16K

max_allowed_packet = 1M

table_open_cache = 4

sort_buffer_size = 64K

read_buffer_size = 256K

read_rnd_buffer_size = 256K

net_buffer_length = 2K

thread_stack = 128K

datadir = /data/3309/data

server-id       = 3309

log-bin=/data/3309/binlog/mysql-bin   #二進位制日誌位置

binlog_format=mixed               #二進位制日誌格式

log-error = /data/3309/mysql-err       #錯誤日誌位置

innodb_file_per_table = 1            #為每一個新資料表建立一個表空間檔案

sync_binlog = 1                    #寫二進位制日誌的時候,同步到磁碟上面

cp /data/3309/my.cnf /opt/backup/   #備份配置檔案

mysqld_safe --defaults-file=/data/3309/my.cnf &  #啟動mysql

1、利用mysqldump完全備份mysql,配合二進位制日誌備份實現增量備份

mysqldump 選項請參考http://wangweiak47.blog.51cto.com/2337362/1589304

1.1提供模擬資料

1

2

3

4

5

6

7

8

mysql -S /tmp/mysql.sock4   #連線mysql

mysql> use test;

Database changed

mysql> create table test (id int(2),comment char(30));  #建立表

Query OK, 0 rows affected (0.34 sec)

mysql> insert into test values (1,'yun zhonghe');  #插入資料

Query OK, 1 row affected (0.16 sec)

1.2全量備份:

1

mysqldump -S /tmp/mysql.sock4 -A -B -F -x --events --triggers --routines --master-data=2 > /opt/backup/all_data-`date +%F--%U`.sql

1.3 模擬資料發生改變

1

2

mysql> insert into test values (2,'yun zhonghe2');    #再插入一條資料。

Query OK, 1 row affected (0.11 sec)

1.4 增量備份

1

2

mysqladmin -S /tmp/mysql.sock4 flush-logs   #增量備份前,先滾動一下二進位制日誌。

cp `cat /data/3309/binlog/mysql-bin.index | tail -n 2 | head -n 1` /opt/backup/   #備份二進位制日誌

1.5 資料損壞

1

2

rm -rf /data/3309/

killall mysqld

1.6 恢復

上面已經提供了步驟,直接複製過來使用。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

mkdir -p /data/3309/{data,binlog}

cd /usr/local/mysql/

scripts/mysql_install_db --user=mysql --datadir=/data/3309/data/ --basedir=/usr/local/mysql/

cp /opt/backup/my.cnf /data/3309/

chown mysql.mysql -R /data/3309/

mysqld_safe --defaults-file=/data/3309/my.cnf &   

mysql -S /tmp/mysql.sock4     #連線mysql檢視資料

mysql> set sql_log_bin=0;

Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'sql_log_bin';

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

| Variable_name | Value |

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

| sql_log_bin   | OFF   |

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

1 row in set (0.00 sec)

mysql> source /opt/backup/all_data-2015-10-01--39.sql

mysql> select from test.test;   #還缺一個數據

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

| id   | comment     |

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

|    1 | yun zhonghe |

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

1 row in set (0.00 sec) 

mysql> source /tmp/incres-1.sql;

mysql> select from test.test;   #資料已恢復

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

| id   | comment      |

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

|    1 | yun zhonghe  |

|    2 | yun zhonghe2 |

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

rows in set (0.00 sec)

mysql> set sql_log_bin = 1;  #開啟二進位制記錄開關。

1.7小結,mysqldump適合於資料量較小的場合,它的優點是有眾多選項,使用起來非常靈活,缺點是資料量一旦過大,非常耗時耗力。

2、使用lvm進行全備。

lvm快照卷原理參考

http://baike.baidu.com/link?url=iEpO_zm_AbHbk-ijQa8jNcFRoPPG2NdTYb_cRoQ7mjQb_ag9g-fL7yHPXV7Atp2j3J0L5xYynM9KKLIwycW_S_

2.1 資料接著上次繼續開始。

2.2 全備。

需保證資料庫存放在邏輯卷組上面,才行。

2.2.1首先鎖表和滾動日誌

1

2

3

4

5

mysql> flush table with read lock;

Query OK, 0 rows affected (0.02 sec)

mysql -S /tmp/mysql.sock4 -e 'show master status;' > /backup/master.info  #記錄當前日誌資訊

mysqladmin -S /tmp/mysql.sock4 flush-logs   #滾動日誌

2.2.2建立快照

1

2

lvcreate -s -n snap_data -L 500M /dev/vg_node5/mylv_data

Logical volume "snap_data" created

2.2.3 解鎖表

1

2

mysql> unlock tables; 

Query OK, 0 rows affected (0.00 sec)

2.2.4 複製快照卷資料到備份目錄下

1

2

3

mkdir -p /backup/lvm

mount /dev/vg_node5/snap_data /mnt/lvm

cp -R /mnt/3309/* /backup/lvm

2.2.5 刪除快照

1

2

3

4

umount /mnt

lvremove /dev/mapper/vg_node5-snap_data

Do you really want to remove active logical volume snap_data? [y/n]: y

Logical volume "snap_data" successfully removed

2.3增量備份,只需和定時複製binlog到備份目錄下面即可

2.4恢復,只需要直接拷貝備份目錄下的檔案即可

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

killall mysqld

rm -rf /data/3309/

cp -R /backup/lvm/ /data/3309/

chown mysql.mysql -R /data/3309/

mysqld_safe --defaults-file=/data/3309/my.cnf &

ss -tnl | grep 330

LISTEN     0      50                        *:3309                     *:*

mysql> select from test.test;   #資料未改變

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

| id   | comment      |

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

|    1 | yun zhonghe  |

|    2 | yun zhonghe2 |

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

2.5小結:

lvm實現物理備份速度相對mysqldump來比較快,實現也比較簡單,是不錯的選擇。

缺點:資料目錄必須存放在lvm卷組上面

3、使用xtrabackup實現熱備。

請自行到官網下載並安裝對應的rpm包。

使用方法參考:詳細參考:

http://www.cnblogs.com/Amaranthus/archive/2014/08/19/3922570.html

3.1建立一個具有最小許可權的使用者

1

2

3

mkdir /backup/xtrabackup

mysql> grant RELOAD, LOCK TABLES, REPLICATION CLIENT on *.* to 'bkuser'@'localhost' identified by '123456';

mysql> flush privileges;

3.2完全熱備。

使用innobakupex備份時,其會呼叫xtrabackup備份所有的InnoDB表,複製所有關於表結構定義的相關檔案(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關檔案,同時還會備份觸發器和資料庫配置資訊相關的檔案。這些檔案會被儲存至一個以時間命令的目錄中。

1

2

3

4

innobackupex --user=bkuser --password=123456 --socket=/tmp/mysql.sock4 --defaults-file=/data/3309/my.cnf /backup/xtrabackup/ #相關選項自行help。

#nnobackupex: completed OK! #出現此選項代表備份完成。

ls /backup/xtrabackup/

2015-10-01_17-00-13

(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 —— 備份命令用到的配置選項資訊;

3.3提供改變資料。

1

2

mysql> insert into test.test values (3,'yun zhonghe3');

Query OK, 1 row affected (0.03 sec)

3.4增量備份

1

innobackupex --user=bkuser --password=123456 --socket=/tmp/mysql.sock4 --defaults-file=/data/3309/my.cnf --incremental /backup/xtrabackup/ --incremental-basedir=/backup/xtrabackup/2015-10-01_17-00-13/

3.5 模擬資料損壞

1

2

rm -rf /data/3309/

killall mysqld

3.6增量備份恢復

1

2

innobackupex --apply-log --redo-only /backup/xtrabackup/2015-10-01_17-00-13/

innobackupex --apply-log --redo-only /backup/xtrabackup/2015-10-01_17-00-13/ --incremental-dir=/backup/xtrabackup/2015-10-01_17-15-00/

#注意,多例項的話,仍然需要備份配置檔案,啟動的時候需要binlog目錄。

1

2

3

4

mkdir -p /data/3309/{data,binlog}

chown mysql.mysql -R /data/

cp /opt/backup/my.cnf /data/3309/

innobackupex --copy-back /backup/xtrabackup/2015-10-01_17-00-13/ --defaults-file=/opt/backup/my.cnf   #恢復資料。

3.6啟動資料庫檢視。

1

2

3

4

5

6

7

8

9

10

11

mysqld_safe --defaults-file=/data/3309/my.cnf &

mysql -S /tmp/mysql.sock4

mysql> select from test.test;   #資料修復完成。

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

| id   | comment      |

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

|    1 | yun zhonghe  |

|    2 | yun zhonghe2 |

|    3 | yun zhonghe3 |

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

rows in set (0.01 sec)

小結:

xtrabacup具有如下特點。

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

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

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

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

(5)還原速度快;

因此建議學會熟練使用xtrabackup進行備份和還原。