MySQL大表備份是一個咱們常見的問題,下面就爲您介紹一個MySQL大表備份的簡單方法,但願對您學習MySQL大表備份方面能有所幫助。mysql
這裏所說的大表是超過4G以上的表,我目前見到過最大爲60多G的單表,對於這種表天天一個全備能夠說是一件很痛苦的事。
那麼有沒有辦法,能夠實現一個全備加增量的備份呢。
答案固然是有的。sql
在常規環境直能夠用全備加binlog一同保存。
這種環境大多能夠用一個Slave上進行備份操做。併發
思路:
先中止Slave的同步,刷新buffer,對於Innodb 若是想直接拷貝還須要把innodb_max_dirty_pages_pct這個值置爲零,而後在執行一次flush tables;
就能夠cp了。若是是Dump出來能夠這這樣作。性能
這個方案目前來看也是比較完美的,但一個併發力度大的應用一天的Binlog有可能能達到50G-60G,這樣的系統開Binlog能夠說是對系統的IO性能及總體性能都有早影響。學習
另外一種方案就是基於表的上數據的羅輯變化進行備份。
主體思想:全備加邏輯備份。
邏輯備份:當有數據插入時,利用觸發器同時寫入另外一個表,當數據更新時,咱們同時記錄一下,更新後的數據狀況到另外一個表。
當有刪除操做時,只須要記錄一下,刪除的主建ID就行。spa
例子:
要備份的表:xml
- CREATE TABLE `wubx` ( `id` int(11) NOT NULL auto_increment,
- `user_id` int(11) NOT NULL default '0',
- `friend_id` int(11) NOT NULL default '0',
- `dir_id` int(11) NOT NULL default '0',
- `created` int(11) NOT NULL default '0',
- UNIQUE KEY `id` (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
對於這個表咱們須要建一個記錄有新數據變化的表爲:htm
- mysql> create table wubx_ii like wubx;
- Query OK, 0 rows affected (0.00 sec)
-
- mysql> create table wubx_uu like wubx;
- Query OK, 0 rows affected (0.00 sec)
- mysql> create table wubx_dd ( id int(11));
- Query OK, 0 rows affected (0.00 sec)
-
創建相應的觸發程器rem
- 記錄insert的操做:
- delimiter //
- create trigger wubx_ii after insert on wubx for each row begin insert into wubx_ii set id=new.id,user_id=new.user_id,friend_id=new.friend_id,dir_id=new.dir_id,created=new.created; end//
- 記錄update的操做:
- create trigger wubx_uu after update on wubx for each row begin replace into wubx_uu set id=new.id,user_id=new.user_id,friend_id=new.friend_id,dir_id=new.dir_id,created=new.created; end//
- 記錄刪除的操做:
- create trigger wubx_dd after delete on wubx for each row begin insert into wubx_dd values(old.id); end//
-
- delimiter ;
-
操做:
先備份原始表wubx裏的數據:
進行:get
- insert into wubx values(」,1,10,1,1198464252);
- insert into wubx values(」,1,11,1,1198464252);
- insert into wubx values(」,1,2,1,1198464252);
- insert into wubx values(」,2,10,1,1198464252);
- insert into wubx values(」,2,12,1,1198464252);
- insert into wubx values(」,3,12,1,1198464252);
- update wubx set dir_id=5 where user_id=3;
- update wubx set dir_id=4 where user_id=3;
- delete from wubx where user_id=2 and friend_id=12;
如今要實現增量備份:
取出insert的操做:
- mysql -e 」 select concat(‘replace into wubx set id=’,id,’,user_id=’,user_id,’,friend_id=’,friend_id,’,dir_id=’,dir_id,’,created=’,created,’;') from wubx_ii;」>>backup_ii.sql
取出update的操做:
- mysql -e 」 select concat(‘update wubx set user_id=’,user_id,’,friend_id=’,friend_id,’,dir_id=’,dir_id,’,created=’,created,’ where id=’,id,’;') from wubx_uu;」>>backup_uu.sql
取出delete的操做:
- mysql -e 「select concat(‘delete from wubx where id=’,id,’;') from wubx_dd」>>backup_dd.sql
這樣利用這些邏輯的備份加是完畢備份恢復到當前恢復點就很容易了。這裏不演示。
這個操做最好用一個程序完成,當取完羅輯備份後,作一個標記點去清楚備份完的數據,以保證,邏輯記錄表裏的數據量比較少是正確的。