数据库单表增量备份方案
方案1:
对于一个表来说,我们要实现备份最简单的方法就是直接备份,这张表包括数据与结构直接备份,这种情况对已小的数据库表来说是行的通的,但是这种方法存在一些问题:例如,如果这个表的数据很大呢?达到上G、几G、几十个G之类的,这样的话备份的时候很占资源和时间,所以,我觉得这样的备份不值得推荐。
所以针对上面的问题,我用触发器来实现,具体思路如下:
1、 假设现在有一个表mytest需要做备份,然后有mytest_backup表来保存备份的数据,然后这两个表的结构是一样的;
例如:
mytest:
CREATE TABLE `mytest` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`colum1` varchar(50) DEFAULT NULL,
`colum2` varchar(50) DEFAULT NULL,
`colum3` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
mytest_backup:
CREATE TABLE mytest_backup like mytest;
2、 建立触发器mytest_backup,每当mytest有数据插入的时候,就向mytest_backup中也插入刚才的数据,这样就实现了备份,具体的实现如下:
BEGIN
INSERT INTO mytest_backup
SET id = new.id,
colum1 = new.colum1,
colum2 = new.colum2,
colum3 = new.colum3;
END
3、 那更新的时候怎么办呢?新建一个表mytest_update,新建一个触发器,每当我们修改过数据,就把修改的每一条数据都记录下来,备份的时候只需在执行这些数据来更新就可以了:
mytest_update:
CREATE TABLE `mytest_update` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`colum1` varchar(50) DEFAULT NULL,
`colum2` varchar(50) DEFAULT NULL,
`colum3` varchar(50) DEFAULT NULL,
`update_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
触发器如下:
BEGIN
INSERT INTO mytest_update
set update_id = new.id,
colum1 = new.colum1,
colum2 = new.colum2,
colum3 = new.colum3;
END
4、 那么删除以同样的方法也就可以实现,新建mytest_delete表,然后每当有删除操作的时候我们就把id保存下来,备份的时候把备份表所对应的ID删除之后就可以了:
mytest_delete
CREATE TABLE `mytest_delete` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`delete_id` bigint(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
触发器:
BEGIN
INSERT INTO mytest_delete
set delete_id = old.id;
END
5、 恢复:恢复的时候,把test_backup的所有数据记录恢复到原表,然后把test_update表中的所有数据都执行备份,然后再根据mytest_delete的所有ID执行删除,这样就可以把这张表的数据实现恢复。