数据库全备与增量备份
1数据库备份简介
-
增量备份
增量备份 是指在一次全备份或上一次增量备份后,以后每次的备份只需备份与前一次相比增加或者被修改的文件。这就意味着,第一次增量备份的对象是进行全备后所产生的增加和修改的文件;第二次增量备份的对象是进行第一次增量备份后所产生的增加和修改的文件,如此类推。这种备份方式最显著的优点就是:没有重复的备份数据,因此备份的数据量不大,备份所需的时间很短。但增量备份的数据恢复是比较麻烦的。您必须具有上一次全备份和所有增量备份磁带(一旦丢失或损坏其中的一个增量,就会造成恢复的失败),并且它们必须沿着从全备份到依次增量备份的时间顺序逐个反推恢复,因此这就极大地延长了恢复时间。 假如我们有一个数据库,有20G的数据,每天会增加10M的数据,数据库每天都要全量备份一次,这样的话服务器的压力比较大,因此我们只需要备份增加的这部分数据,这样减少服务器的负担。
-
binlog简介
MySQL的二进制日志binlog可以说是MySQL最重要的日志,它记录了所有的DDL和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。一般来说开启binlog日志大概会有1%的性能损耗。
注:增量备份是基于binlog日志实现的。
2 环境准备
windows系统下:
- 开启binlog日志
修改 MySQL 的配置文件my.ini如下:
[mysqld]
log-bin=E:\logsql\my-bin
binlog_format=Mixed
binlog-do-db=#需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可
binlog-ignore-db=#不需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可
MySql的配置文件在其安装路径下:
打开后在其中添加即可:
注:配置指定路径时,文件名称不要以sql
开头,会造成路径查找失败或者mysql服务重启失败
-
重启MySql服务
重新启动后,binlog配置生效
3、查看logbin日志是否开启
执行sql命令,log_bin显示为ON则为开启。
show variables like 'log_bin%'
3 JAVA实现MySql备份
思路:用jdk提供的Runtime的exec()方法方法操作本地系统的cmd命令。
全备实现:
#cmd执行sql全备命令
mysqldump -u`账号` -p`密码` `数据库名称` > `保存的路径`
#例子
mysqldump -uroot -p123456 see_monitor > E:/logsql/seemonitor.sql
备份数据库中的某一个表:
#cmd执行的单表全备命令
mysqldump -u`账号` -p`密码` `数据库名称` `表名称` > `保存的路径`
#例子
mysqldump -uroot -p123456 see_monitor equipment > E:/logsql/seemonitor_equipment.sql
//java代码实现
public void Win_dbBackup() throws Exception {
//全备命令
String cmd = "cmd /c mysqldump -uroot -p123456 see_monitor > E:/logsql/seemonitor.sql";
java.lang.Process process = Runtime.getRuntime().exec(cmd);//执行语句
process.waitFor();//等待上述命令执行完毕后打印下面log
System.out.println(process.exitValue());
System.out.println("数据库备份结束,备份结果:{}" + (process.exitValue() == 0 ? "success" : "fail"));
if (process.exitValue() == 0) {
//刷新一次日志
String cmd1 = "cmd /c mysqladmin -uroot -p123456 flush-logs";
java.lang.Process process2 = Runtime.getRuntime().exec(cmd);//执行语句
process2.waitFor();//等待上述命令执行完毕后打印下面log
System.out.println("数据库日志刷新结果:{}" + (process2.exitValue() == 0 ? "success" : "fail"));
}
}
增量备份只需要刷新binlog日志即可:
public void zenbei_dbBackup() throws Exception {
//增量备份
String cmd = "cmd /c mysqladmin -uroot -p123456 flush-logs";
java.lang.Process process = Runtime.getRuntime().exec(cmd);//执行语句
process.waitFor();//等待上述命令执行完毕后打印下面log
System.out.println(process.exitValue());
System.out.println("数据库备份结束,备份结果:{}" + (process.exitValue() == 0 ? "success" : "fail"));
}
因为binlog日志会随着备份的增加而增多,所有可以定时进行binlog日志的清除。
#自动删除binlog
#通过binlog参数(expire_logs_days )来实现mysql自动删除binlog
mysql> show binary logs;
mysql> show variables like 'expire_logs_days'; //该参数表示binlog日志自动删除/过期的天数,默认值为0,表示不自动删除
mysql> set global expire_logs_days=3; //表示日志保留3天,3天后就自动过期。
#手工删除binlog
mysql> reset master; //删除master的binlog,即手动删除所有的binlog日志
mysql> reset slave; //删除slave的中继日志
mysql> purge master logs before '2012-03-30 17:20:00'; //删除指定日期以前的日志索引中binlog日志文件
mysql> purge master logs to 'binlog.000002'; //删除指定日志文件的日志索引中binlog日志文件
mysql> set sql_log_bin=1/0; //如果用户有super权限,可以启用或禁用当前会话的binlog记录
mysql> show master logs; //查看master的binlog日志列表
mysql> show binary logs; //查看master的binlog日志文件大小
mysql> show master status; //用于提供master二进制日志文件的状态信息
mysql> show slave hosts; //显示当前注册的slave的列表。不以--report-host=slave_name选项为开头的slave不会显示在本列表中
mysql> flush logs; //产生一个新的binlog日志文件
为了安全性,可以将全备数据和binlog日志进行转储其他服务器进行灾难备份。