MySql数据定时备份

可用的脚本(一直正在用的····) 写道
@echo 取日期、时间变量值
set yy=%date:~0,4%
set mm=%date:~5,2%
set dd=%date:~8,2%
if /i %time:~0,2% lss 10 set hh=0%time:~1,1%
if /i %time:~0,2% geq 10 set hh=%time:~0,2%
set mn=%time:~3,2%
set ss=%time:~6,2%
set date=%yy%%mm%%dd%
set time=%hh%%mn%%ss%
set filename=%date%_%time%
mysqldump -uroot -proot --default-character-set=utf8 --opt --extended-insert=false --triggers -R --hex-blob -x baba>D:\baba%filename%.sql
@echo 导出已经完成
@pause
 

由于系统使用到了MySQL 数 据库,所以每天的工作,就设计到了MySQL数据库的备份问题.但如果每天手工来做MySQL数据库的定时备份,工作量不说,时间还不准确,有时候还会忘 记做备份,哪一天忙起来忘记了,数据库出了问题,就不好搞了.所以,将MySQL数据库的备份,做成系统定时执行的,就很有必要.
一般情况下,我们手工备份MySQL数据库,会使用下面的命令:
复制内容到剪贴板
代码:
mysqldump --opt --add-locks -u root --password=xxxx db_name> x:/db_backup/db_name.sql
这是我们在命令行模式下备份数据库的常用命令.但现在要让系统自动执行,就不能这样了.
1.在windows下定时备份MySQL数据库.
使用editplus建立 db_bak.bat文件,也就是windows下常用的批处理文件.
内容为:
复制内容到剪贴板
代码:
@echo
mysqldump --opt --add-locks -u root --password=xxxx db_name> x:/db_backup/db_name.sql
然后保存,接下来在window 的定时任务中,定义windows的定时任务,每天备份多少次都可以.
2.在linux下定时备份MySQL数据库.
命令跟上面的类似,不过这里要使用linux下的定时任务了.
说到这里,可能大伙都感觉数据库的备份工作已经完成了,其实不然,我们备份数据库,不单要应对数据库坏掉或被误删除的问题,同时,还需要应对服务器损坏,硬盘损坏或是服务器遭遇未可预知的灾难的问题.
所 以,我们就不能把数据库仅仅备份到本机,我们同时,需要将备份好的数据库,同步传输到其它至少一台服务器上,这样,才可以保证我们数据的绝对安全,在进行 数据传输之前,为了减少数据的传输量,提高传输速度,需要对数据库备份文件进行压缩.在linux下,可以使用系统自带的命令进行压缩,但在 windows下,我不太喜欢使用window自带的命令进行压缩.在这里,我借助ant对MySQL数据库备份文件进行压缩,ant的 build.xml 文件定义如下(文件命名为:db_target.xml)
复制内容到剪贴板
代码:
<?xml version="1.0" encoding="UTF-8"?>
<project name="xxxx" basedir=".">
<property name="db-bak-dir" value="x:/db_backup"/>
<target name="db-bak">
  <exec dir="${basedir}" executable="cmd.exe">
   <arg line="/c db-bak.bat" />
  </exec>
</target>
<target name="bak" depends="db-bak">
     <tstamp prefix="source.">
   <format property="TimeSign" pattern="yyyy-MM-dd HH.mm.ss" />
    </tstamp>
    <mkdir dir="${db-bak-dir}/${source.TimeSign}"/>
    <zip destfile="${db-bak-dir}/${source.TimeSign}/db-bak.zip">
      <zipfileset dir="${db-bak-dir}" includes="*.sql"/>
       </zip>
       <antcall target="clean"/>
</target>
<target name="clean">
    <delete file="${db-bak-dir}/db_name.sql"/>
</target>
</project>
上面的ant配置文件的意思,就是说,让ant调用windows的MySQL数据库备份.bat文件并执行.
对数据库进行备份,然后,以当前日期,作为压缩文件名,对MySQL数据库备份文件进行压缩.
那既然我们是让 ant来调用了MySQL 数据库备份命令文件,就没有理由再让windows 定时任务调用 MySQL数据库备份命令文件了,所以,我们对window的定时任务做一修改,让window定时执行ant脚本,再写一个.bat文件.
内容如下:
复制内容到剪贴板
代码:
@echo
ant -f x:/db-target.xml bak
文件命名为:db-target.bat.
以上三个文件在同一文件夹下.接下来就是将文件传输到其它服务器了,由于个人喜欢ant ,所以,在这里,还是使用ant 脚本来实现文件的远程传输,在这里,需要使用linux ssh命令,所以,需要一个额外的.jar包,传输不在本文讨论之列,下次再行讨论,
linux 下的文件传输,会很方便,给出一个小的示例.
1.压缩备份文件:
复制内容到剪贴板
代码:
tar -zcvf /db_bak/db_name.tar.gz /db_bak/db_name.sql
2.文件传输:
复制内容到剪贴板
代码:
scp /db_bak/db_name.tar.gz ip:port /dir/xxx

 

-----------------------------------------------------

Java调用MySQL命令备份与恢复数据库

 

package util.dbak;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;


public class DatabaseBackup {

/** MySQL安装目录的Bin目录的绝对路径 */
private String mysqlBinPath;

/** 访问MySQL数据库的用户名 */
private String username;

/** 访问MySQL数据库的密码 */
private String password;

public String getMysqlBinPath() {
   return mysqlBinPath;
}

public void setMysqlBinPath(String mysqlBinPath) {
   this.mysqlBinPath = mysqlBinPath;
}

public String getUsername() {
   return username;
}

public void setUsername(String username) {
   this.username = username;
}

public String getPassword() {
   return password;
}

public void setPassword(String password) {
   this.password = password;
}

public DatabaseBackup() {
   super();
}

public DatabaseBackup(String mysqlBinPath, String username, String password) {
   super();
   if (!mysqlBinPath.endsWith(File.separator)) {
    mysqlBinPath = mysqlBinPath + File.separator;
   }
   this.mysqlBinPath = mysqlBinPath;
   this.username = username;
   this.password = password;
}

/**
* 备份数据库
*
* @param output 输出流
* @param dbname 要备份的数据库名
*/
public void backup(OutputStream output, String dbname) {
   String command = "cmd /c " + mysqlBinPath + "mysqldump -u" + username + " -p" + password + " --set-charset=utf8 "
     + dbname;
   System.out.println(command);
   PrintWriter p = null;
   BufferedReader reader = null;
   try {
    p = new PrintWriter(new OutputStreamWriter(output, "utf8"));
    Process process = Runtime.getRuntime().exec(command);
    InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream(), "utf8");
    reader = new BufferedReader(inputStreamReader);
    String line = null;
    while ((line = reader.readLine()) != null) {
     p.println(line);
    }
    p.flush();
   } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
   } catch (IOException e) {
    e.printStackTrace();
   } finally {
    try {
     if (reader != null) {
      reader.close();
     }
     if (p != null) {
      p.close();
     }
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
}

/**
* 备份数据库,如果指定路径的文件不存在会自动生成
*
* @param dest 备份文件的路径
* @param dbname 要备份的数据库
*/
public void backup(String dest, String dbname) {
   try {
    OutputStream out = new FileOutputStream(dest);
    backup(out, dbname);
   } catch (FileNotFoundException e) {
    e.printStackTrace();
   }
}

/**
* 恢复数据库
*
* @param input 输入流
* @param dbname 数据库名
*/
public void restore(InputStream input, String dbname) {
   String command = "cmd /c " + mysqlBinPath + "mysql -u" + username + " -p" + password + " " + dbname;
   try {
    Process process = Runtime.getRuntime().exec(command);
    OutputStream out = process.getOutputStream();
    String line = null;
    String outStr = null;
    StringBuffer sb = new StringBuffer("");
    BufferedReader br = new BufferedReader(new InputStreamReader(input, "utf8"));
    while ((line = br.readLine()) != null) {
     sb.append(line + "\r\n");
    }
    outStr = sb.toString();

    OutputStreamWriter writer = new OutputStreamWriter(out, "utf8");
    writer.write(outStr);
    writer.flush();
    out.close();
    br.close();
    writer.close();
   } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
   } catch (IOException e) {
    e.printStackTrace();
   }

}

/**
* 恢复数据库
*
* @param dest 备份文件的路径
* @param dbname 数据库名
*/
public void restore(String dest, String dbname) {
   try {
    InputStream input = new FileInputStream(dest);
    restore(input, dbname);
   } catch (FileNotFoundException e) {
    e.printStackTrace();
   }
}

public static void main(String[] args) {
   DatabaseBackup bak = new DatabaseBackup("C:/MySQL/UTF8/bin", "root", "root");
   bak.restore("c:/t.sql", "ttk");
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值