MySQL常見備份方案有如下三種:html
mysqldump + binlognode
lvm + binlog mysql
xtrabackup sql
本例爲方便演示,數據庫裏面數據爲空。下面開始動手數據庫
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,配合二進制日誌備份實現增量備份vim
mysqldump 選項請參考http://wangweiak47.blog.51cto.com/2337362/1589304bash
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全量備份:app
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 模擬數據發生改變socket
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進行備份和還原。