實驗環境 centos6.4 x86_64 ,mysql編譯安裝 版本5.5.37mysql
系統關閉 防火牆 seLinuxsql
一 測試環境準備數據庫
1.1 編輯/etc/my.cnf 把二進制日誌存放到其餘非數據目錄,innodb每表一個表空間vim
創建存放 二進制日誌 目錄centos
mkdir /binlog服務器
chown mysql:mysql /binlogapp
修改my.cnfless
vim /etc/my.cnfide
log-bin = /binlog/mysql-bin #配置文件有此選項直接修改便可,不用添加測試
innodb_file_per_table = 1
重啓mysqld
service mysqld restart
1.2 建立測試數據庫與測試表
mysql> create database db;
mysql> use db;
mysql> create table db1(id int primary key auto_increment,name varchar(10),phone int,sex char(10));
mysql> insert into db1 (name,phone,sex) values ('tom',1123213,'m');
mysql> insert into db1 (name,phone,sex) values ('jar',1123,'m');
mysql> insert into db1 (name,phone,sex) values ('xiaozhang',1127,'m');
1.3 建立用於存放備份目錄
mkdir /backup
chown –R mysql:mysql /backup
二 用mysqldump備份
案例1 備份單一數據庫,刪除後,恢復
1 備份數據庫
mysqldump -uroot -predhat --master-data=2 --databases db > /backup/db.sql
2 刪除數據庫
mysql> drop database db;
3 恢復數據庫
mysql> source /backup/db.sql # 如恢復不成功,可先創建數據庫,再恢復
案例2 完整備份+增量備份+二進制日誌
1 完整熱備份
mysqldump -uroot -predhat --single-transaction --events --routines --triggers --master-data=2 --databases db >/backup/db_`date +%F`.sql
2 假設次日 作一些相關操做,作增量備份
mysql> create table db2(id int);
mysql> insert into db2 values (1),(2);
查看當前日誌文件位置
mysql> show master status;
+--------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------+----------+--------------+------------------+
| mysql.000010 | 13452 | | |
+--------------+----------+--------------+------------------+
查看上次完整備份 日誌文件位置
less db_2014-06-20.sql
CHANGE MASTER TO MASTER_LOG_FILE='mysql.000010', MASTER_LOG_POS=12977;
作增量備份
mysqlbinlog --start-position=12977 --stop-position=13452 mysql.000010 > /backup/db_`date +%F_%H`.sql
3假設第三天 出現故障 恢復數據庫
mysql> insert into db2 values (3),(4);
mysql> insert into db2 values (5),(6),(7),(8);
mysql> drop database db;
恢復數據
mysql>show master status;
查看當前日誌位置 如 mysql.000017
mysqlbinlog mysql.000017
找到最後操做正確的位置
mysqlbinlog --start-position=13452 --stop-position=13828 mysql.000010 > /tmp/db.sql
mysql> set sql_log_bin=0; #關閉二進制日誌
mysql> flush logs;
mysql -uroot -predhat < /backup/db_2014-06-20.sql
mysql -uroot -predhat < /backup/db_2014-06-20_18.sql
mysql -uroot -predhat < /tmp/db.sql
mysql> flush privileges; 重讀受權文件
mysql> set sql_log_bin=1
三 LVM 快照 備份 恢復
( 事務日誌和快照必須在一個邏輯捲上)
( sync_binlog =1 防止事務丟失,事務提交,當即同步到磁盤 通常不設爲1 備份完成 從新改成 0 )
1 遷移數據庫至LVM
備份數據庫
mysqldump -uroot -predhat --lock-all-tables --all-databases --routines --triggers --events > /backup/db_all_`date +%F`.sql
中止mysqld
service mysqld stop
刪除原數據庫
rm –rf /mydata/*
建立LVM 過程略
創建LVM卷,掛載到/mydata/data
初始化mysql的數據目錄 /mydata/data
Vim /etc/my.cnf
sync_binlog=1
恢復數據
mysql> set sql_log_bin=0;
mysql> source /backup/db_all_2014-06-20.sql
mysql> flush priviledges; # 密碼生效
mysql> set sql_log_bin=1;
2 快照 備份
mysql> flush tables with read lock; #把全部表從內存刷新到磁盤 ,並請求全局鎖
mysql> flush logsl;
mysql> show master status;
+--------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------+----------+--------------+------------------+
| mysql.000017 | 107 | | |
+--------------+----------+--------------+------------------+
1 row in set (0.00 sec)
不要退出此會話
另開一個會話
保存當前日誌位置
mysql -uroot -predhat -e 'show master status' > /backup/binlog.txt
建立快照
lvcreate -L 100M -s -p r -n mydata-snap /dev/myvg/mydata
在前一個會話中 釋放讀鎖
mysql > unlock tables;
掛載快照,拷貝出來,卸載快照,刪除快照
mount /dev/myvg/mydata /mnt
mkdir /backup/lvm
cp -pR /mnt/* /backup/lvm/
umont /mnt
lvremove /dev/myvg/mydata-snap
測試數據
service mysqld stop
rm -rf /mydata/data/*
cp -Rp /backup/lvm/data/* /mydata/data/
service mysqld start
恢復後 數據如不完整 ,可以使用二進制日誌恢復
mysqlbinlog --start-position=107 mysql.000017 > /backup/snap.sql;
mysql> set sql_log_bin=0;
mysql> source /backup/snap.sql
mysql> set sql_log_bin=1;
四 xtrabackup
1 下載安裝 xtrabackup
yum install libaio
yum install perl-dbd-mysql
yum install perl-Time-HiRes
rpm –ivh percona-xtrabackup-2.1.4-656.rhel6.x86_64.rpm
2 爲備份創建一個只有備份權限的用戶
mysql> create user 'user'@'localhost' identified by '1234567';
mysql> revoke all privileges ,grant option from 'user'@'localhost';
mysql> grant reload,lock tables,replication client on *.* to 'user'@'localhost';
mysql> flush privileges;
案例1 完整備份mysql
1 完整備份
innobackupex -uroot -predhat /backup/
數據會完整備份到/backup/ 以當期日期時間爲目錄名的目錄下面
(1)xtrabackup_checkpoints —— 備份類型(如徹底或增量)、備份狀態(如是否已經爲prepared狀態)和LSN(日誌序列號)範圍信息;
每一個InnoDB頁(一般爲16k大小)都會包含一個日誌序列號,即LSN。LSN是整個數據庫系統的系統版本號,每一個頁面相關的LSN可以代表此頁面最近是如何發生改變的。
(2)xtrabackup_binlog_info —— mysql服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置。
(3)xtrabackup_binary —— 備份中用到的xtrabackup的可執行文件;
(4)backup-my.cnf —— 備份命令用到的配置選項信息;
2 中止mysql服務,刪除數據庫
service mysqld stop
rm –rf /mydata/data
3 準備恢復階段
innobackupex --apply-log /backup/2014-06-21_09-35-21/
--apply-log 把未提交的事務回滾,已提交的事務同步到磁盤
4 恢復數據庫
innobackupex --copy-back /backup/2014-06-21_09-35-21/
5 修改數據庫目錄
chown –R mysql:mysql /mydata/data
6 重啓服務
service mysqld start
7 再次作徹底備份 每次恢復數據後要從新作一個徹底備份
innobackupex -uroot -predhat /backup/
案例2 完整備份 +增量備份+二進制日誌
假設第一天 作完整備份
innobackupex -uroot -predhat /backup/
次日 作增量備份
innobackupex --user=root --password=redhat --incremental /backup/ --incremental-basedir=/backup/2014-06-21_10-40-36/
--incremental-basedir 指定基於那個完整備份作增量
第三天 數據庫崩潰
數據庫服務中止,刪空數據庫目錄
準備恢復數據
innobackupex --apply-log --redo-only /backup/2014-06-21_10-40-36/
--redo-only 未提交的事務不回滾,這個事務可能在增量備份中提交
innobackupex --apply-log --redo-only /backup/2014-06-21_10-40-36/ --incremental-dir=/backup/2014-06-21_10-48-58/
把增量備份添加到完整備份
恢復數據
innobackupex --copy-back /backup/2014-06-21_10-40-36
chown -R mysql:mysql /mydata/data
service mysql start
此時數據應該恢復到次日 ,如要恢復第三天的數據 可利用二進制日誌
進入完整備份目錄
cat xtrabackup_binlog_info
mysql.000020 288
查看上次增量備份 二進制日誌文件 位置
mysqlbinlog --start-position=288 mysql.000020 > /backup/db.sql
mysql> set sql_log_bin=0;
mysql> source /backup/db.sql
mysql> set sql_log_bin=1;