爲何要備份:mysql
備份的幾個重要理由:sql
災難恢復、需求改變、審計、測試等;如"測試"按期用最新的生產環境中的數據更新到測試環境服務器數據庫
須要考慮的問題:vim
一、在不致使嚴重後果的狀況下,能夠容忍丟失多少數據?須要故障恢復,仍是能夠接受自從上第二天常備份後全部的數據丟失?安全
二、恢復須要在多長時間內完成?哪一種類型的宕機是能夠接受的?哪一種影響是應用和用戶能夠接受的?當狀況發生時,又該怎樣持續提供服務等?bash
三、須要恢復什麼?常見的是恢復整個服務器、單個數據庫、單個表,或只是特定的事務或語句等服務器
備份類型:網絡
根據數據庫是否須要在線備份仍是離線備份,可分爲如下幾點:app
熱備份:備份期間不須要服務停機,業務不受影響less
溫備份:備份期間僅容許讀的請求
冷備份:備份期間須要關閉Mysql服務或讀寫請求都不受影響
備份方式:
徹底備份:full backup備份所有數據集
增量備份:incrementalbackup 上次徹底備份或增量備份以來改變的數據
差別備份:differentialbackup 上次徹底備份以來改變的數據
恢復數據時須要用到的備份文件:
徹底+增量備份方式
須要徹底備份+增量備份+二進制文件
徹底+差別備份方式
須要徹底備份+差別備份+二進制文件
邏輯備份仍是物理備份:
邏輯備份:
優勢:
邏輯備份可使用編輯器或文本處理工具進行編輯或查看
恢復很是簡單
比較靈活
與存儲引擎無關
有助於避免數據損壞
缺點:
必須由數據庫服務器完成邏輯備份工做,所以須要使用服務器更多資源
備份出的數據佔用更大的空間
浮點數可能會丟失精度
數據還原以後,索引須要重建
物理備份:
優勢:
備份與恢復數據比較簡單
InnoDB與MyISAM的物理備份容易跨平臺、操做系統和Mysql版本
恢復速度比較快,不須要從新構建索引
缺點:
InnoDB的原始文件會比邏輯備份大得多
物理備份不是總能夠跨平臺、操做系統及Mysql版本;文件名大小寫敏感和浮點格式有可能會有問題
備份的對象:
數據文件、配置文件、代碼:存儲過程,存儲函數、觸發器等、二進制日誌、事務日誌、中繼日誌、服務器配置、管理腳本、任務計劃等
計劃Mysql備份方案:
一、在生產環境中,對於數據來講,備份是必要的;並選擇適合的備份類型
二、保留多個備份集
三、按期從備份中抽取數據進行恢復測試
四、保存進制日誌文件以用於基於故障時間點恢復,數據不宜於二進制文件放在同一個位置
五、若是不借助於備份工具有份,須要驗證備份是否正常
六、經過測試演練整個數據的備份和恢復,測試恢復所須要的資源(如:CPU、磁盤空間、時間及網絡帶寬等)
七、對於安全性要考慮周全,若是有人能接觸到生產服務器,他是否能訪問備份服務器
使用Mysqldump備份工具實現徹底備份,並結合二進制日誌實現增量備份
特色:邏輯備份工具、支持InnoDB熱備份、MyISAM溫備份;備份與恢復較慢
使用LVM邏輯卷快照功能實現幾乎熱血備份的徹底備份,並結合二進制日誌實現增量備份;簡單介紹"mylvmbackup"一鍵備份工具的使用
特色:幾乎接近於熱備份、物理備份、備份與恢復較快
使用Xtrabackup備份工具實現徹底備份與增量備份
特色:物理備份工具、支持InnoDB熱備份、MyISAM溫備份、速度較快
1、環境準備
一、安裝Mysql數據庫服務器
######安裝編譯環境 [root@localhost ~]# yum -y groupinstall "Server Platform Development" "Development tools" ######安裝編譯工具 [root@localhost ~]# yum install -y cmake ######建立Mysql用戶 [root@localhost ~]# useradd -r mysql ######解壓並安裝Mysql [root@localhost ~]# tar xf mysql-5.5.33.tar.gz [root@localhost ~]# cd mysql-5.5.33 [root@localhost mysql-5.5.33]# cmake . \ > -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ #安裝路徑 > -DMYSQL_DATADIR=/mydata/data \ #數據存放路徑 > -DSYSCONFDIR=/etc \ #主配置文件目錄 > -DWITH_INNOBASE_STORAGE_ENGINE=1 \ #下面三項啓用支持的存儲引擎 > -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ > -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ > -DWITH_READLINE=1 \ #支持readline庫 > -DWITH_SSL=system \ #支持SSL加密 > -DWITH_ZLIB=system \ #支持ZLIB壓縮 > -DWITH_LIBWRAP=0 \ #支持Libwrap庫 > -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ #Sock文件路徑 > -DDEFAULT_CHARSET=utf8 \ #默認字符集 > -DDEFAULT_COLLATION=utf8_general_ci #默認字符集排序規則 ######編譯並安裝 [root@localhost mysql-5.5.33]# make && make install 註釋: 若是想清理此前的編譯所生成的文件,則須要使用以下命令 make clean rm CMakeCache.txt
二、爲Mysql提供主配置文件與Sysv服務腳本
######爲Mysql提供主配置文件 [root@localhost mysql-5.5.33]# cp support-files/my-large.cnf /etc/my.cnf ######爲Mysql提供Sysv服務腳本 [root@localhost mysql-5.5.33]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld ######賦於Sysv腳本執行權限 [root@localhost mysql-5.5.33]# chmod +x /etc/rc.d/init.d/mysqld ######將Mysqld加入系統服務 [root@localhost mysql-5.5.33]# chkconfig --add mysqld [root@localhost mysql-5.5.33]# chkconfig mysqld on
三、讓系統識別源碼包安裝的軟件
[root@localhost mysql]# echo "PATH=/usr/local/mysql/bin:$PATH" >> /etc/profile [root@localhost mysql]# . /etc/profile [root@localhost mysql]# ln -s /usr/local/mysql/include /usr/include/mysql [root@localhost ~]# echo "/usr/local/mysql/lib" >> /etc/ld.so.conf [root@localhost ~]# ldconfig
四、修改Mysql主配置文件
[root@localhost mysql]# vim /etc/my.cnf datadir = /mydata/data #添加此行,數據存放目錄 innodb_file_per_table = 1 #啓用InnoDB表每表一個文件,默認全部數據庫使用一個表空間 log-bin=/binlog/mysql-bin #修改二製做存放目錄
五、爲Mysql建立數據庫與二進制存放目錄
######建立數據、二進制存放目錄與備份目錄 [root@localhost ~]# mkdir -p /backup /mydata/data /binlog ######修改Mysql二進制與數據及備份目錄的屬主、屬組爲Mysql用戶 [root@localhost mysql]# chown -R mysql.mysql /mydata/data [root@localhost mysql]# chown -R mysql.mysql /binlog /backup ######修改Mysql安裝目錄的屬組爲Mysql組 [root@localhost mysql]# chown -R :mysql *
六、初始化Mysql並啓動服務
[root@localhost mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/mydata/data [root@localhost ~]# service mysqld start Starting MySQL......... SUCCESS! ######修改Mysql的root用戶密碼 [root@localhost ~]# mysqladmin -uroot password 'root@pass'
七、建立測試數據庫與表並插入數據
[root@localhost ~]# mysql -uroot -proot@pass mysql> create database allen; mysql> use allen; mysql> create table tab1 (ID tinyint unsigned not null primary key auto_increment,Name char(20) not null unique key,Age tinyint unsigned,Gender char(1) default 'M'); mysql> insert into tab1 (Name,Age,Gender) values ('Zhang WuJi',26,'M'),('Zhao Min',24,'F');
2、使用Mysqldump備份工具有份
一、使用Mysqldump對"allen"數據庫作備份而且滾動二進制日誌,記錄日誌位置
[root@localhost ~]# mysqldump -uroot -proot@pass --lock-all-tables --routines --events --triggers --master-data=2 --flush-logs --databases allen > /backup/allen_`date +%F`.sql 註釋: -u #指定用戶名 -p #指定用戶密碼 -h #指定主機地址 -A|--all-databases #備份全部數據庫 --databases #備份指定數據庫 --single-transcation #基於此項能夠實現對InnoDB表作熱備份,但不須要使用 --lock-all-tables #執行備份時爲全部表請求加鎖 -E|--events #備份事件調度器代碼 --opt #同時啓動各類高級選項 -R|--routines #備份存儲過程和存儲函數 --flush-logs #備份以前刷新日誌 --triggers #備份觸發器 --master-data=2 #該選項將會記錄binlog的日誌位置與文件名並追加到文件中,若是爲1將會輸出CHANGE MASTER命令,主從下有用 ######更多選項請參考man手冊
二、備份二進制日誌文件並查看已備份的數據文件
[root@localhost ~]# cp /binlog/mysql-bin.00000* /backup/ [root@localhost ~]# ls /backup/ allen_2013-09-06.sql mysql-bin.000001 mysql-bin.000002 mysql-bin.000003 mysql-bin.000004
三、在"allen"數據庫中新添加數據來模擬作增量備份,並查看當前日誌文件及所處位置
mysql> create table tab2 (ID tinyint unsigned not null primary key auto_increment,Name char(20) not null unique key,Age tinyint unsigned,Gender char(1) default 'M'); mysql> insert into tab2 (Name,Age,Gender) values ('Liang ShanBo',26,'M'),('Zhu YingTai',24,'F'); mysql> show master status; #查看二進制日誌文件所處位置 +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000004 | 1289 | | | +------------------+----------+--------------+------------------+
四、作增量備份,基於上一次徹底備份到目前日誌所處的位置
######查看數據庫備份的二進制日誌 [root@localhost ~]# less /backup/allen_2013-09-06.sql ######從下面能夠看出二進制日誌文件及徹底備份後日志所處位置"107" -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=107; ######基於二進制日誌作增量備份, [root@localhost ~]# mysqlbinlog --start-position=107 /binlog/mysql-bin.000004 > /backup/allen_incremental.sql 註釋: --start-position #指定從哪一個位置開始導出二進制日誌 --stop-position #指定到哪一個位置結束;若是到最後能夠不用指定 --start-datetime #指定從哪一個時間開始 時間格式:"2013-09-06 14:50:26" --stop-datetime #指定到哪一個時間結束
五、向"allen"數據庫新添加兩條記錄,而後模擬誤操做把數據庫刪除了,怎麼恢復到當前數據
mysql> insert into tab2 (Name,Age,Gender) values ('Zhu BaJie',26,'M'),('Sun WuKong',24,'F'); mysql> drop database allen; mysql> show master status; #查看二進制文件及所處位置 +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000004 | 1644 | | | +------------------+----------+--------------+------------------+
六、恢復數據到當前數據,須要恢復完整備份+增量備份+增量備份後刪除以前的二進制文件
######查看二進制文件,下面能夠看出刪除操做是在"1561"時作的 [root@localhost ~]# mysqlbinlog /binlog/mysql-bin.000004 # at 1561 #130906 5:31:04 server id 1 end_log_pos 1644 Query thread_id=5 exec_time=0 error_code=0 SET TIMESTAMP=1378416664/*!*/; drop database allen ######導出刪除以前至增量備份後的二進制日誌數據 [root@localhost ~]# mysqlbinlog --start-position=1289 --stop-position=1561 /binlog/mysql-bin.000004 > /backup/allen_1561.sql [root@localhost ~]# mysql -uroot -proot@pass mysql> set global sql_log_bin=0; #關閉二進制日誌記錄,由於恢復數據對咱們來講記錄沒有意義 mysql> source /backup/allen_2013-09-06.sql #恢復完整備份 mysql> source /backup/allen_incremental.sql #恢復增量備份 mysql> source /backup/allen_1561.sql #恢復增量後至刪除前的數據 mysql> set global sql_log_bin=1; #開啓二進制日誌記錄 mysql> use allen; #切換到"allen"數據庫 mysql> show tables; #查看數據表已經恢復 +-----------------+ | Tables_in_allen | +-----------------+ | tab1 | | tab2 | +-----------------+ mysql> select * from tab1; #查看錶內數據也已經徹底恢復 +----+------------+------+--------+ | ID | Name | Age | Gender | +----+------------+------+--------+ | 1 | Zhang WuJi | 26 | M | | 2 | Zhao Min | 24 | F | +----+------------+------+--------+ mysql> select * from tab2; +----+--------------+------+--------+ | ID | Name | Age | Gender | +----+--------------+------+--------+ | 1 | Liang ShanBo | 26 | M | | 2 | Zhu YingTai | 24 | F | | 3 | Zhu BaJie | 26 | M | | 4 | Sun WuKong | 24 | F | +----+--------------+------+--------+
註釋:若是在生產環境中須要作數據庫徹底備份,若是數據庫整個系統崩潰,須要另外找一臺服務器安裝好Mysql服務,初始化並啓動,而後使用備份文件與二進制文件進行恢復,因此必定要保存好備份文件與二進制文件
3、使用LVM邏輯卷快照備份
前提:使用LVM邏輯捲來作快照備份的話,須要Mysql的數據目錄與二進制日誌文件目錄都在LVM邏輯卷組上
一、建立LVM邏輯卷 邏輯卷詳細介紹點此處
######分區,不作詳細介紹 [root@localhost ~]# fdisk /dev/sdb Command (m for help): n p Partition number (1-4): 1 First cylinder (1-7832, default 1): Last cylinder, +cylinders or +size{K,M,G} (1-7832, default 7832): +10G Command (m for help): n p Partition number (1-4): 2 First cylinder (1307-7832, default 1307): Last cylinder, +cylinders or +size{K,M,G} (1307-7832, default 7832): +10G Command (m for help): t Partition number (1-4): 1 Hex code (type L to list codes): 8e Command (m for help): t Partition number (1-4): 2 Hex code (type L to list codes): 8e Command (m for help): p Device Boot Start End Blocks Id System /dev/sdb1 1 1306 10490413+ 8e Linux LVM /dev/sdb2 1307 2612 10490445 8e Linux LVM Command (m for help): w
######讓內核從新讀取分區表,若是讀取不到須要重啓 [root@localhost ~]# partx /dev/sdb ######建立邏輯卷並掛載,不作詳細介紹 [root@localhost ~]# pvcreate /dev/sdb{1,2} Physical volume "/dev/sdb1" successfully created Physical volume "/dev/sdb2" successfully created [root@localhost ~]# vgcreate myvg /dev/sdb{1,2} Volume group "myvg" successfully created [root@localhost ~]# lvcreate -L +10G -n mylv myvg Logical volume "mylv" created [root@localhost ~]# [root@localhost ~]# mkfs.ext4 /dev/myvg/mylv[root@localhost ~]# mkdir /mydata /backup [root@localhost ~]# vim /etc/fstab /dev/myvg/mylv /mydata ext4 defaults 0 0 [root@localhost ~]# mount -a ######建立Mysql數據與二進制日誌存放目錄並修改權限 [root@localhost ~]# mkdir /mydata/{data,binlog} [root@localhost ~]# chown -R mysql:mysql /mydata/*
二、修改Mysql主配置文件數據存放目錄與二進制文件存放目錄並初始化
[root@localhost ~]# vim /etc/my.cnf datadir = /mydata/data log-bin=/mydata/binlog/mysql-bin [root@localhost mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/mydata/data/ [root@localhost mysql]# service mysqld start Starting MySQL... SUCCESS!
三、建立數據庫並添加數據
mysql> create database allen; mysql> use allen; mysql> create table tab1 (ID tinyint unsigned not null primary key auto_increment,Name char(20) not null unique key,Age tinyint unsigned,Gender char(1) default 'M'); mysql> insert into tab1 (Name,Age,Gender) values ('Zhang WuJi',26,'M'),('Zhao Min',24,'F');
四、登陸Mysql數據庫,請求爲全部表加鎖,記得必定不要關閉終端,不然表鎖將會失效,並滾動日誌
mysql> flush tables with read lock; #爲全部表請求加鎖 mysql> flush logs; #刷新日誌 mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000004 | 107 | | | +------------------+----------+--------------+------------------+
五、另外迅速開啓一個終端窗口,爲邏輯卷建立快照;邏輯卷:"/dev/myvg/mylv"
[root@localhost ~]# lvcreate -L 500M -s -p r -n mylv-snap /dev/myvg/mylv Logical volume "mylv-snap" created
六、快照作完後,快速釋放讀鎖
mysql> unlock tables;
七、掛載快照卷,備份出數據,卸載快照卷並刪除
[root@localhost ~]# mount /dev/myvg/mylv-snap /mnt/ mount: block device /dev/mapper/myvg-mylv--snap is write-protected, mounting read-only [root@localhost ~]# cp -rp /mnt/* /backup/ [root@localhost ~]# umount /mnt/ ######刪除快照卷 [root@localhost ~]# lvremove /dev/myvg/mylv-snap Do you really want to remove active logical volume mylv-snap? [y/n]: y Logical volume "mylv-snap" successfully removed
這樣一次完整的LVM徹底備份就算是完成了,下面咱們來測試一下是否能正常使用
8、中止Mysql服務,刪除數據目錄下的全部文件來模擬數據庫損壞;並恢復數據
[root@localhost ~]# service mysqld stop Shutting down MySQL... SUCCESS! [root@localhost ~]# rm -rf /mydata/* ######恢復已備份的數據 [root@localhost ~]# cp -rp /backup/* /mydata/ ######啓動Mysql服務 [root@localhost ~]# service mysqld start Starting MySQL SUCCESS! 註釋:若是不能啓動,請檢查數據目錄權限;屬主、屬組是否爲Mysql用戶
九、登陸Mysql服務器,驗證數據是否恢復
mysql> select * from allen.tab1; #數據已經成功恢復 +----+------------+------+--------+ | ID | Name | Age | Gender | +----+------------+------+--------+ | 1 | Zhang WuJi | 26 | M | | 2 | Zhao Min | 24 | F | +----+------------+------+--------+
註釋:這裏就不在演示使用LVM作完完整備份後Mysql出現問題,其操做與恢復流程與使用"mysqldump"備份工具同樣,先使用徹底備份恢復,再使用二進制日誌進行恢復;使用二進制恢復時,請找好二進制日誌到上一次備份的位置,避免沒必要要的錯誤發生;而後使用"mysqlbinlog"導出並使用批處理的方式導入數據庫
Mylvmbackup
一、介紹一下Mylvmbackup工具的使用,mylvmbackup是基於LVM邏輯卷快照作的備份,簡單的說也就是LVM備份方法的簡便版本,配置好主配置文件直接執行提供的腳本文件便可完成備份;此工具只能作備份操做,這裏只介紹如何配置安裝及備份
二、使用此工具作備份前提固然數據目錄必須存放在LVM邏輯捲上,並且須要給快照卷剩餘足夠的空間作備份;若是須要恢復,解壓縮備份文件,恢復操做同上
三、下載並安裝mylvmbackup; 軟件版本:mylvmbackup-0.14-0.noarch.rpm 點此下載
[root@localhost ~]# yum -y install mylvmbackup-0.14-0.noarch.rpm [root@localhost ~]# rpm -ql mylvmbackup /etc/mylvmbackup.conf #主配置文件 /usr/bin/mylvmbackup #執行程序
四、主配置文件介紹
[root@localhost ~]# vim /etc/mylvmbackup.conf [mysql] #鏈接數據庫配置 user=root password=root@pass host=localhost port=3306 socket=/tmp/mysql.sock mycnf=/etc/my.cnf [lvm] #LVM邏輯卷的配置 vgname=myvg #卷組名稱 lvname=mylv #邏輯卷名稱 backuplv=mysql_snap #快照卷名稱 lvsize=5G [fs] #文件系統配置 xfs=0 mountdir=/mnt #掛載目錄 backupdir=/backup #備份目錄,也能夠備份到行程主機 [misc] #定義備份選項 backuptype=tar #定義備份的類型 backupretention=0 prefix=backup #定義備份文件名前綴 suffix=_mysql #定義備份文件名後綴 tararg=cvf #定義tar參數,默認爲cvf tarfilesuffix=.tar.gz #定義備份文件後綴名格式 datefmt=%Y%m%d_%H%M%S #定義備份文件名時間戳格式 keep_snapshot=0 #是否保留snaphot keep_mount=0 #是否卸載snaphot quiet=0 #定義記錄日誌類型 註釋:其餘配置保持輸入便可
五、備份數據庫並驗證備份文件
[root@localhost ~]# mylvmbackup ######出現如下信息表示備份成功,下面意思是刪除快照捲成功 20130906 11:55:33 Info: Running: lvremove -f /dev/myvg/mysql_snap Logical volume "mysql_snap" successfully removed 20130906 11:55:34 Info: DONE: Removing snapshot ######查看備份文件,已經成功備份 [root@localhost ~]# ls /backup/ backup-20130906_115532_mysql.tar.gz
4、使用Xtrabackup備份恢復
簡介:
Xtrabackup是一個對InnoDB、XtraDB作數據備份的工具,支持在線熱備份(備份時不影響數據讀寫),是一個很好的開源備份恢復工具。xtrabackup能夠基於上一次整庫備份基礎上作增量備份(InnoDB、StraDB);能夠以流的形式備份,並直接保存到遠程機器上
註釋:這裏就不在配置環境了,直接接着使用上一次LVM備份恢復的環境
一、下載並安裝Xtrabackup工具 軟件版本:percona-xtrabackup-2.1.4-656.rhel6.x86_64.rpm 點此下載
[root@localhost ~]# yum -y install percona-xtrabackup-2.1.4-656.rhel6.x86_64.rpm
二、建立並受權Mysql數據庫用戶有備份權限
[root@localhost ~]# mysql -uroot -proot@pass mysql> create user 'backup'@'localhost' identified by 'mypass'; #建立用戶並設置密碼 mysql> revoke all privileges,grant option from 'backup'@'localhost';#去掉用戶的全部默認權限 mysql> grant reload,lock tables,replication client,event on *.* to 'backup'@'localhost'; #從新爲用戶受權 mysql> flush privileges; #刷新使其從新受權表 註釋: 用戶受權規則爲最小權限
三、徹底備份:
[root@localhost ~]# innobackupex --user=backup --password=mypass /backup/ ######下面表示已經備份成功 innobackupex: Backup created in directory '/backup/2013-09-06_07-47-33' innobackupex: MySQL binlog position: filename 'mysql-bin.000005', position 744 130906 07:47:36 innobackupex: Connection to database server closed 130906 07:47:36 innobackupex: completed OK!
註釋:備份完成後,會在"/backup"目錄下生成一個以當前日期時間爲名稱的目錄;使用innobakupex備份時,其會調用xtrabackup備份全部的InnoDB表,複製全部關於表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。固然在備份時"innobackupex"還會在備份目錄中生成一些文件如:
(3.1)、xtrabackup_checkpoints —— 備份類型(如徹底或增量)、備份狀態(如是否已經爲prepared狀態)和LSN(日誌序列號)範圍信息;每一個InnoDB頁(一般爲16k大小)都會包含一個日誌序列號,即LSN。LSN是整個數據庫系統的系統版本號,每一個頁面相關的LSN可以代表此頁面最近是如何發生改變的
(3.2)、xtrabackup_binlog_info —— mysql服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置
(3.3)、xtrabackup_binlog_pos_innodb —— 二進制日誌文件及用於InnoDB或XtraDB表的二進制日誌文件的當前position
(3.4)、xtrabackup_binary —— 備份中用到的xtrabackup的可執行文件
(3.5)、backup-my.cnf —— 備份命令用到的配置選項信息
(3.6)、使用innobackupex進行備份時,還可使用"--no-timestamp"選項來阻止命令自動建立一個以時間命名的目錄;如此一來,innobackupex命令將會建立一個BACKUP-DIR目錄來存儲備份數據
四、準備(prepare)一個徹底備份
在備份完成後,數據不能直接用於恢復,由於備份的數據中能夠會包含還沒有提交的事務或已經提交但還沒有同步至數據文件中的事務;所以,此時的數據文件仍處於不一致狀態,"準備"的工做就是經過回滾未提交的事務及同步已提交的事務到數據文件使用數據文件處於一致性狀態
######爲防止意外錯誤,先關閉Mysql服務 [root@localhost ~]# service mysqld stop Shutting down MySQL. SUCCESS! ######刪除數據目錄下的全部文件 [root@localhost ~]# rm -rf /mydata/data/* ######準備一個徹底備份 [root@localhost ~]# innobackupex --apply-log /backup/2013-09-06_07-47-33/ ######出現如下信息表示已經成功 xtrabackup: starting shutdown with innodb_fast_shutdown = 1 130906 8:26:36 InnoDB: Starting shutdown... 130906 8:26:40 InnoDB: Shutdown completed; log sequence number 1603596 130906 08:26:40 innobackupex: completed OK! 註釋: --apply-log #做用是把備份時沒有提交的事務回滾,已經提交的事務同步的數據文件中
(4.1)、在「準備」的過程當中,innobackupex還可使用"--use-memory"選項來指定其可使用的內存的大小,默認一般爲100M。若是有足夠的內存可用,能夠多劃分一些內存給prepare的過程,以提升其完成速度
五、徹底恢復數據庫
[root@localhost ~]# innobackupex --copy-back /backup/2013-09-06_07-47-33/ ######出現如下提示表示已經恢復成功 innobackupex: Starting to copy InnoDB log files innobackupex: in '/backup/2013-09-06_07-47-33' innobackupex: back to original InnoDB log directory '/mydata/data' innobackupex: Copying '/backup/2013-09-06_07-47-33/ib_logfile0' to '/mydata/data' innobackupex: Copying '/backup/2013-09-06_07-47-33/ib_logfile1' to '/mydata/data' innobackupex: Finished copying back files. 130906 08:40:24 innobackupex: completed OK! 註釋: --copy-back #用於恢復操做,經過複製全部數據相關的文件至Mysql服務器的數據目錄來執行恢復過程
六、驗證是否已經成功恢復
[root@localhost ~]# service mysqld start Starting MySQL.. SUCCESS! [root@localhost ~]# mysql -uroot -proot@pass mysql> select * from allen.tab1; #已經成功恢復數據 +----+------------+------+--------+ | ID | Name | Age | Gender | +----+------------+------+--------+ | 1 | Zhang WuJi | 26 | M | | 2 | Zhao Min | 24 | F | +----+------------+------+--------+ 註釋:若是啓動不成功,請查看數據目錄下文件屬主、屬組權限是否爲Mysql用戶
七、使用"innobackupex"作增量備份,首先須要添加幾條數據到數據庫中
[root@localhost ~]# mysql -uroot -proot@pass mysql> use allen; mysql> insert into tab1 (Name,Age,Gender) values ('Liang ShanBo',26,'M'),('Zhu YingTai',24,'F'),('BaJie',500,'M'),('WuKong',800,'M');
八、進行增量備份
######建立增量備份存儲目錄 [root@localhost ~]# mkdir /incremental ######執行增量備份 [root@localhost ~]# innobackupex -user=backup -password=mypass --incremental /incremental/ --incremental-basedir=/backup/2013-09-06_07-47-33/ ######出現如下信息表示已經成功 innobackupex: Backup created in directory '/incremental/2013-09-06_09-08-16' innobackupex: MySQL binlog position: filename 'mysql-bin.000007', position 420 130906 09:08:20 innobackupex: Connection to database server closed 130906 09:08:20 innobackupex: completed OK! 註釋: --incremental #指定增量備份數據存放目錄 --incremental-basedir=DIR #指定上一次備份所在的目錄
九、再添加一些數據進行增量備份
[root@localhost ~]# mysql -uroot -proot@pass mysql> use allen; mysql> insert into tab1 (Name,Age,Gender) values ('Guan Yin',26,'M'),('Ru Lai',24,'F'); ######再次作增量備份是基於上一次增量備份來作 [root@localhost ~]# innobackupex -user=backup -password=mypass --incremental /incremental/ --incremental-basedir=/incremental/2013-09-06_09-08-16/ ######增量備份成功 innobackupex: Backup created in directory '/incremental/2013-09-06_09-17-49' innobackupex: MySQL binlog position: filename 'mysql-bin.000007', position 687 130906 09:17:52 innobackupex: Connection to database server closed 130906 09:17:52 innobackupex: completed OK!
註釋:增量備份僅能應用於InnoDB或XtraDB表,對於MyISAM表而言,執行增量備份時其實進行的是徹底備份
十、刪除數據庫文件來模擬數據庫損壞,實現對增量備份進行恢復
[root@localhost ~]# service mysqld stop [root@localhost ~]# rm -rf /mydata/data/* ######準備第一個備份文件爲徹底備份 [root@localhost ~]# innobackupex --apply-log --redo-only /backup/2013-09-06_07-47-33/ ######準備第二個增量備份文件基於徹底備份 [root@localhost ~]# innobackupex --apply-log --redo-only /backup/2013-09-06_07-47-33/ --incremental-dir=/incremental/2013-09-06_09-08-16/ ######準備第二個增量備份文件基於徹底備份 [root@localhost ~]# innobackupex --apply-log --redo-only /backup/2013-09-06_07-47-33/ --incremental-dir=/incremental/2013-09-06_09-17-49/ 註釋:須要在每一個備份(包括徹底和各個增量備份)上,將已經提交的事務進行「重放」,「重放」以後,全部的備份數據將合併到徹底備份上;若是有更多的增量備份文件,依次如此,一個一個的合併到徹底備份上 --redo-only #做用是備份時提交的但還在事務日誌中的應用到數據文件,可是尚未提交的並不迴流 --incremental-dir=DIR #指定恢復的增量備份目錄,這個選項會使增量備份文件中的數據合併到徹底備份
十一、恢復數據並啓動Mysql服務驗證
[root@localhost ~]# innobackupex --copy-back /backup/2013-09-06_07-47-33/ ######恢復成功 innobackupex: Starting to copy InnoDB log files innobackupex: in '/backup/2013-09-06_07-47-33' innobackupex: back to original InnoDB log directory '/mydata/data' innobackupex: Copying '/backup/2013-09-06_07-47-33/ib_logfile0' to '/mydata/data' innobackupex: Copying '/backup/2013-09-06_07-47-33/ib_logfile1' to '/mydata/data' innobackupex: Finished copying back files. 130906 09:53:33 innobackupex: completed OK! [root@localhost ~]# chown -R mysql:mysql /mydata/data/* [root@localhost ~]# service mysqld start Starting MySQL.. SUCCESS! [root@localhost ~]# mysql -uroot -proot@pass mysql> select * from allen.tab1; #數據已經成功恢復 +----+--------------+------+--------+ | ID | Name | Age | Gender | +----+--------------+------+--------+ | 1 | Zhang WuJi | 26 | M | | 2 | Zhao Min | 24 | F | | 3 | Liang ShanBo | 26 | M | | 4 | Zhu YingTai | 24 | F | | 5 | BaJie | 255 | M | | 6 | WuKong | 255 | M | | 7 | Guan Yin | 26 | M | | 8 | Ru Lai | 24 | F | +----+--------------+------+--------+
這裏就不在演示備份完成後Mysql出現問題,其操做與恢復流程與使用"mysqldump"備份工具同樣,使用徹底備份+徹底備份後到如今全部的增量備份+最後一次作增量備份到當前時間的二進制日誌文件進行恢復;使用二進制恢復時,請找好二進制日誌到上一次備份的位置,避免沒必要要的錯誤發生;而後使用"mysqlbinlog"導出並使用批處理的方式導入數據庫!!!