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
这样利用这些逻辑的备份加是完毕备份恢复到当前恢复点就很容易了。这里不演示。
这个操做最好用一个程序完成,当取完罗辑备份后,作一个标记点去清楚备份完的数据,以保证,逻辑记录表里的数据量比较少是正确的。