业务上有这么一个需求:有两台电脑都可以对同一数据库进行操作,但其中一台电脑始终离线,所以与其交互只能通过U盘拷数据库的东西进行增量备份与同步。
分两步实现,先手动实现增量备份的功能,然后再通过java程序调用cmd命令自动执行。实现过程中参照下面链接,最关键的是java调用时,没有配置mysql环境变量。
http://www.jb51.net/article/27919.htm
1、先设置my.ini或者my.cnf(开启二进制日志功能)
C:\ProgramFiles\MySQL\MySQL Server 5.0\my.ini
开启后要找到[mysqld] 區段,並加上 log_bin 參數指定 Binary Log 的儲存位置 ( 類似 "交易記錄檔" )
[mysqld]
log_bin="d:\Backup\mysqllog\mysql-bin.log"
2、配置mysql环境变量(手动实现增量备份时不需要设置此项,用java程序调用命令时设置这项后就会方便很多)
右击桌面上的我的电脑/属性/高级/环境变量/系统变量/path添加C:\ProgramFiles\MySQL\MySQL Server 5.0\bin(要把mysql路径换成本机的)
3、用mysqldump备份,以防出错时恢复
只备份cardmsdb库
C:\ProgramFiles\MySQL\MySQL Server 5.0\bin>mysqldump -uroot -proot cardmsdb>d:\Backup\mysqllog\cardmsdb.sql
备份全部数据库
C:\ProgramFiles\MySQL\MySQL Server 5.0\bin>mysqldump -uroot -proot--single-transaction --flush-logs --master-data=2 --all-databases -r MySQLFull.sql
4、二进制文件按时间,数据库转成sql文件(其中”>>是在原文件后面继续加”)
C:\ProgramFiles\MySQL\MySQL Server 5.0\bin>mysqlbinlog --start-datetime="2013-01-2316:40:00" --stopdatetime="2013-01-24 00:00:00"--database=cardmsdbd:\Backup\mysqllog\mysqlbin.000001>d:\Backup\mysqllog\mysqlbin000001.sql
5、在另一台不通信的机器上执行sql文件(如果出错,则执行第三步的mysqlFull.sql)
进入Mysqlclient
mysql>sourced:/Backup/mysqllog/mysqlbin000001.sql
或者数据库查询,导入语句执行也行
6、通过java来执行上面一些语句(以mysqldump为例,其中source命令变成mysql命令)
String str = "cmd /c mysqldump -h localhost -uroot -proot cardmsdb > "+filePath+"\\"+dataString+"fullBack.sql";
String str = "cmd /c mysql -h 192.168.0.168 -uroot -proot cardmsdb < "+filePath; //source命令
Runtime rt = Runtime.getRuntime();
System.out.println(str);
Process pcs;
try {
pcs = rt.exec(str);
BufferedReader br = new BufferedReader(new InputStreamReader(pcs.getErrorStream()));
String line = new String();
while ((line = br.readLine()) != null) {
System.out.println(line);
}
try {
pcs.waitFor();
} catch (InterruptedException a) {
System.err.println("processes was interrupted");
}
br.close();
pcs.exitValue();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}