mysql備份

MySQL的備份和還原:
備份:副本
RAID1,RAID10:保證硬件損壞而不會業務終止

備份類型:
熱備份,溫備份和冷備份:
熱備份:讀、寫不受影響
溫備份:僅可以執行讀操作
冷備份:離線備份:讀、寫操作均終止

物理備份和邏輯備份:
物理備份:複製數據文件
邏輯備份:將數據導出至文本文件中

完全備份,增量備份和差異備份:
完全備份:備份全部數據
增量備份:僅備份上次完全備份或增量備份以後變化的數據:
差異備份:僅備份上次完全備份以來變化的數據

在線:物理完全備份

還原:

備份什麼:數據,配置文件,二進制日誌,事務日誌

熱備份:
myisam:lvm,溫備份
innodb:xtrabackup,mysqldump
MySQL--》從

物理備份:速度快
邏輯備份:速度慢,丟失浮點數精度,方便使用文本處理工具直接付其處理,可移植能力強

備份策略:完全+增量:完全+差異

MySQL備份工具:
mysqldump:邏輯備份工具、myisam(溫)、innodb(熱備份)
mysqlhotcopy:物理備份工具、溫備份

文件系統工具:
cp:冷備份
lvm:邏輯卷的快照功能,幾乎熱備
mysql>flush tables;
mysql>lock tables
創建快照:釋放鎖,而後複製數據

innodb:

第三組工具:
ibbackup:商業工具
xtrabackup:開源工具

mysqldump:邏輯備份
mysqldump(完全備份)+ 二進制日誌
完全+增量

備份單個數據庫,或庫中特定表
mysqldump DB_NAME [tb1] [tb2]
mysqldump -u root -p jiaowu > /root/jiaowu.sql
mysql studb < jiaowu.sql

生產中必須先鎖表
mysql>lock tables read;
或者:
mysql>flush tables with read lock;
mysql>unlock tables;

--master-data={0|1|2}
0:不記錄二進制日誌文件及位置
1:以change master to的方式記錄位置,可用於恢復直接啓動從服務器
2:以change master to的方式記錄位置,但默認爲被註釋
mysqldump --master-data=2 studb > /root/studb-date +%Y-%M-%S

--lock-all-tables:鎖定所有表
--flush-logs:執行日誌flush

如果指定庫中的表類型均爲innodb,可使用--single-transaction啓動熱備且不要和--lock-all-tables一起使用:

備份多個庫:
--all-databases:備份所有庫
--databases DB_NAME,DB_NAME,....備份指定庫
mysqldump -u root -p --lock-all-tables --flush-logs --all-databases --master-data=2 > /root/all.sql

--events
--routines
--triggers

備份策略:周完全+每日增量
完全備份:mysqldump
增量備份:備份二進制日誌文件(flush logs)
mysqldump -u root -p --master-data=2 --flush-logs --all-datadatabases --lock-all-tables >/root/alldatabases.sql

mysql>purge binary logs to 'mysql-bin.000011';
mysql>delete from tutors where age>80;
mysql>flush logs;
cp mysql-bin.000011 /root
或者mysqlbinlog mysql-bin.000011 > /root/mon-incremental.sql
mysql>insert into tutots(tname) values('stu123');
cp mysql-bin.000012 /root
或者mysqlbinlog mysql-bin.000012 > temp.sql
rm -rf /var/lib/mysql/*

恢復:
cd /usr/local/mysql
scripts/mysql_install_db --user=mysql --datadir=/mydata/data
mysql -u root -p < alldatabases.sql
mysql < mon-incremental.sql
mysql < temp.sql

二進制日誌:
format:
statment
row
mixed

mysqldump:
--databases db1,db2,...
--all-databases

myisam:溫備份
--lock-all-tables
--lock-tables

innodb:熱備份
--single-transaction
--flush-logs
--events
--routines
--triggers

 --master-data={0|1|2}

邏輯備份:
1、浮點數據丟失精度;
2、備份出的數據更佔用存儲空間;壓縮後可大大節省空間;
3、不合適對大數據庫做完全備份;

對innodb:
mysql>flush tables with read lock;
mysql>show engine innodb status;

mvcc,repeatable-read
--single-transaction

mysql>show global variables like '%log';
mysql>show master status;
mysql>create database mydb;
mysql>show master status;
mysql>show binlog events in 'mysql-bin.0001';
mysql>set sql_log_bin=0;
mysql>create database hellodb;
mysql>show binlog events in 'mysql-bin.00001';
mysql>set sql_log_bin=1;
mysql>drop database hellodb;
mysql>show binlog events in 'mysql-bin.0001';
mysql>select @@sql_log_bin;
mysql>set sql_log_bin=0;
mysql>source /root/jiaowu.sql;

使用select進行備份,只能備份成文本文件

備份
select into outfile '/path/to/somefile.txt' from tb_name [where clause];
mysql>select
into outfile /tmp/tutor.txt from tutors;

恢復,先創建跟原表字段格式屬性一樣的空表
load dta infile '/path/to/somefile.txt' into table tb_name;
mysql>create table tutor like tutors;
mysql>drop table tutors;
mysql>load data infile '/tmp/tutor.txt' into table tutor;

mysql>flush logs;
mysqlbinlog --start-position=605 mysql-bin.0001 > /root/a.sql

mysql>create table tutors like tutor;
mysql>truncate table tutos;
mysql>select * from tutors;
mysql>set sql_bin-log=0;
mysql>source /root/a.sql;
mysql>show warnings;

幾乎熱備:LVM
snapshot:

前提:
1.數據文件要在邏輯捲上;
2.此邏輯卷所在卷組必須有足夠空間使用快照卷
3.數據文件和事務日誌要在同一個邏輯捲上

步驟:
1.打開會話,施加讀鎖,鎖定所有表
mysql>flush tables with read lock;
mysql>flush logs;
2.通過另一個終端,保存二進制日誌文件及相關位置信息;
mysql -uroot -p -e 'show master status\G' > /path/to/master.info
3.創建快照卷
lvcreate -L # -s -p r -n lv_name /path/to/source_lv
4.釋放鎖
mysql>unlock tables;
5.掛在快照卷,備份
mount
cp
6.刪除快照卷
7.增量備份二進制日誌;

備份:
mysql>start transaction;
mysql>insert into tutors(tnname) values('stu0001');
mysql>flush tables with read lock;
mysql>flush logs;
mysql -e 'show master status\G' > /backup/master-date +%F.info
lvcreate -L 50M -s -p r -n mydata-snap /dev/myvg/mydata
mysql>unlock tables;
mount /dev/myvg/mydata/snap /mnt -o ro
cd /mnt
cd data
cp -a ./* /backup/full-backup-2013-05-03/
umont /mnt
lvremove --force /dev/myvg/mydata-snap
cd /backup

如果兩個事件在不同的日誌裏面:
mysqlbinlog --start-datetime='2013-05-03 20:18:34' mysql-bin.0003 mysql-bin.0004 > /backup/incremental-date +%F-%H-%M-%S.sql

恢復:
service mysqld stop
cd /mydata/data/
rm -rf
cp -ar /backup/full-backup-2013-05-03/
/mydata/data/
service mysqld start
mysql>set sql_log_bin=0;
mysql>source /backup/incremental-date +%F-%H-%M-%S.sql
mysql>set sql_log_bin=1;

二進制日誌相關的幾個選項:
innodb_support_xa={true|flase}
存儲引擎事務在存儲引擎內部被賦予了ACID屬性,分佈式(XA)事務是一種高層次的事務,它利用“準備”“提交”(prepare-then-commit)
兩段式的方式將ACID屬性擴展到存儲引擎外部,甚至是數據外部,然而,“準備”階段會導致額外的磁盤刷寫操作,XA需要事務協調員,它會通知所有的參與者準備提交事務(階段1),當協調員從所有參與者那裏收到“就緒”信息時,它會指示所有參與者進行真正的“提交”操作
此變量正是用於定義innodb是否支持兩段式提交的分佈式事務,默認爲啓用,事實上,所有啓用了二進制日誌的病支持多個線程同時向二進制日誌寫入數據的MySQL服務器都需要啓用分佈式事務,否則,多個線程對於二進制日誌的寫入操作可能會以原始次序不同的方式完成,這將會在基於二進制日誌的恢復操作中或者是從服務器上創建出不同原始數據的結果,因此,除了僅有一個線程可以改變數據以外的其它應用場景都不會禁用此功能,而在僅有一個線程就可以修改數據的應用中,禁用此功能是安全並可以提升innodb表的性能,作用範圍爲全局和會話級別,可用於選項文件,屬動態變量

sync_binlog = 1

percona:
ibbackup: InnoDB online physical backup
full
incremental
MyISAM: warm backup,full

LVM --> mylvmbackup(perl scripts)

percona:
xtrabackup
xtradb: innodb的增加版
innodb

www.percona.com

rpm -ivh percona-xtrabackup-2.0.0.rhel5.i386.rpm

rpm -ql percona-xtrabackup

在備份之後都需要執行準備操作用來進行還原

備份:innobackupex+二進制日誌
innobackupex --user=root /backup
innobackupex --apply-log /backup/2013-05-03_22-17-27/

mysql> use jiaowu;
mysql>insert into tutors(Tname) values('stu0005');
mysql>flush logs;

cd /mydata/data
cp mysql-bin.00001 /root/
rm -rf *

恢復:
service mysqld stop
innobackupex --copy-back /backup/2013-05-03_22-17-27/
chown -R mysql.mysql ./*
service mysqld start
mysqlbinlog /root/mysql-bin.0001 > /tmp/abc.sql
mysql>set sql_log_bin=0;
mysql>source /tmp/abc.sql;
mysql>set sql_log_bin=1;

備份:使用innobackupex進行增量備份
mysql>insert into tutors(tname) values('stu0008');

innobackupex --user=root /backup

mysql>insert into tutors(tname) values('stu0009');

第一次增量備份:
innobackupex --incremental /backup --incremental-basedir=/backup/2013-05-03_22-36-37/

第二次增量備份:
mysql>insert into tutors(tname) values('stu000010');

innobackupex --incremental /backup --incremental-basedir=/backup/2013-05-03_22-38-58/

innobackupex --apply-log --redo-only /backup/2013-05-03_22-36-37/

innobackupex --apply-log --redo-only /backup/2013-05-03_22-36-37/ --incremental-dir=/backup/2013-05-03_22-38-85/

innobackupex --apply-log --redo-only /backup/2013-05-03_22-36-37/ --incremental-dir=/backup/2013-05-03_22-41-45/

恢復:
service mysqld stop
cd /mydata/data
rm -rf *
innobackupex --copy-back /backup/2013-05-03_22-36-37/
chown mysql.mysql -R /mydata/data
service mysql start

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