mysql   備份與恢復

實驗環境 centos6.4 x86_64 ,mysql編譯安裝 版本5.5.37

系統關閉 防火牆 seLinux

一 測試環境準備

1.1 編輯/etc/my.cnf 把二進制日誌存放到其他非數據目錄,innodb每表一個表空間

建立存放 二進制日誌 目錄

mkdir /binlog

chown mysql:mysql /binlog

修改my.cnf

vim /etc/my.cnf

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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章