我们使用全量备份是dump,增量备份选择binlog
1、首先查看binlog是否启动
进入到mysql中:
mysql -uroot -proot
然后执行如下命令:show variables like ‘log_bin%’;
如上图所示,login_bin的value是ON的话说明已经开启,如果log_bin的value是OFF的话那么就是关闭
如果是关闭的话,我们需要先停止mysql服务,修改my.ini或者是my.conf,windows使用my.ini文件,linux系统使用的是my.conf文件
我们需要把下面的几句话拷贝进去
basedir ="C:/BtSoft/mysql/MySQL5.7/"
datadir ="C:/BtSoft/mysql/MySQL5.7/data/"
tmpdir ="C:/BtSoft/mysql/MySQL5.7/data/"
socket ="C:/BtSoft/mysql/MySQL5.7/data/mysql.sock"
log-error="C:/BtSoft/mysql/MySQL5.7/data/mysql_error.log"
log-bin=mysql-bin
binlog_format=mixed
server_id = 1
把你的mysql安装目录换成自己的就可以了(C:/BtSoft/mysql/MySQL5.7/)
然后重新启动一下mysql就可以了,是用一开始的那个命查询一下是否开启成功,还有就是mysql安装路径不要是用中文路径,如果是用中文路径可能配置binlog后无法启动。binlog_format有三种模式,可以自行查阅。
2、编写java代码实现mysql数据库备份
刷新binlog日志的,每当刷新一次就会产生一个新文件,以后的记录都会记录到新的日志文件当中。
@Override
public void flushlogs() throws Exception{
StringBuffer sb = new StringBuffer();
sb.append(System.getenv("MYSQL_HOME")+"\\bin\\mysqladmin.exe ");
sb.append("-uroot ");
sb.append("-pz0vhNswR7XGnjIve ");
sb.append("-h");
sb.append("localhost");
sb.append(" ");
sb.append("flush-logs ");
Runtime cmd = Runtime.getRuntime();
System.out.println(sb.toString());
@SuppressWarnings("unused")
Process p = cmd.exec(sb.toString());
}
全量导出文件
Runtime rt = Runtime.getRuntime();
Process child = rt.exec(MYSQL_HOME+"\\bin\\mysqldump -h localhost -uroot -pz0vhNswR7XGnjIve task_server");
// 把进程执行中的控制台输出信息写入.sql文件,即生成了备份文件。注:如果不对控制台信息进行读出,则会导致进程堵塞无法运行
InputStream in = child.getInputStream();// 控制台的输出信息作为输入流
InputStreamReader xx = new InputStreamReader(in, "utf-8");
// 设置输出流编码为utf-8。这里必须是utf-8,否则从流中读入的是乱码
String inStr;
StringBuffer sb = new StringBuffer("");
String outStr;
// 组合控制台输出信息字符串
BufferedReader br = new BufferedReader(xx);
while ((inStr = br.readLine()) != null) {
sb.append(inStr + "\r\n");
}
outStr = sb.toString();
// 要用来做导入用的sql目标文件:把导出的文件路径放在项目底下
String filePath=MYSQL_HOME+"\\data\\dump.sql";
FileOutputStream fout = new FileOutputStream(filePath);
OutputStreamWriter writer = new OutputStreamWriter(fout, "utf-8");
writer.write(outStr);
writer.flush();
writer.close();
fout.flush();
fout.close();
br.close();
xx.close();
in.close();
增量生成新文件只需刷新文件flushlog就可以了,然后需要怎么操作就怎么操作了。
3、恢复文件
首先全量恢复,使用全量恢复命令恢复。
mysql -uroot -proot 数据库名称 < dumpl.sql
然后再增量恢复
mysqlbinlog --no-defaults binlog二进制文件的路径 |mysql -uroot -proot
如果在恢复增量的时候可能出现重复主键,那么查看是不是重复恢复,可以添加从什么位置开始恢复,也可以添加从什么时间点恢复
可以查看二进制文件:
SHOW BINLOG EVENTS IN ‘mysql-bin.000020’;
可以考到具体在什么位置执行什么命令然后是用–start-position 和–sotp-position 指定恢复的位置