MySQL常見備份方案


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

       mysqldump + binlog

       lvm + binlog  

       xtrabackup

本例為方便演示,數據庫里面數據為空。下面開始動手

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提供模擬數據

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全量備份:

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 模擬數據發生改變

mysql> insert into test values (2,'yun zhonghe2');    #再插入一條數據。
Query OK, 1 row affected (0.11 sec)

1.4 增量備份

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 數據損壞

rm -rf /data/3309/
killall mysqld

1.6 恢復

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

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 |
+------+--------------+
2 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首先鎖表和滾動日志

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創建快照

lvcreate -s -n snap_data -L 500M /dev/vg_node5/mylv_data
  Logical volume "snap_data" created

2.2.3 解鎖表

mysql> unlock tables;  
Query OK, 0 rows affected (0.00 sec)

2.2.4 復制快照卷數據到備份目錄下

mkdir -p /backup/lvm
mount /dev/vg_node5/snap_data /mnt/lvm
cp -R /mnt/3309/* /backup/lvm

2.2.5 刪除快照

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恢復,只需要直接拷貝備份目錄下的文件即可

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創建一個具有最小權限的用戶

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表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。這些文件會被保存至一個以時間命令的目錄中。

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提供改變數據。

mysql> insert into test.test values (3,'yun zhonghe3');
Query OK, 1 row affected (0.03 sec)

3.4增量備份

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 模擬數據損壞

rm -rf /data/3309/
killall mysqld

3.6增量備份恢復

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目錄。

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啟動數據庫查看。

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 |
+------+--------------+
3 rows in set (0.01 sec)

 

小結:

xtrabacup具有如下特點。

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

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

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

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

(5)還原速度快;

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM