可用的脚本(一直正在用的····) 写道


@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");
 }
 }