数据库的完整备份与恢复 "--hex-blob"

11年前

闲言少絮,这个程序利用MySql 数据库自带小程序进行数据库的备份和还原。这两个程序分别是:mysql.exemysqldump.exe。这两个程序在您安装Mysql数据库的时候会自动安装到数据库的bin目录。这两个程序存在的目录为:C:\Program File\MySQL\MySQL Server 5.5\bin 这个目录下。在这个目录下您还可以看到很多MySql自带的工具程序,他们都很方便和实用。

数据库安装程序信息:mysql- 5.5.25a-win32.msi。

安装路径:程序默认路径。

应用程序:Navicat_for_Mysql.exe,默认安装。

依赖项:mysql-connector-java-5.1.10-bin.jar

服务器地址:192.168.0.100

核心语句:

备份:"cmd.exe /C C:\\mysqldump -uroot -p123456 -h 192.168.0.100 " + database + " >" + path + "";

还原:"cmd.exe /C C:\\mysql -uroot -p123456 -h 192.168.0.100 " + database + " <" + path + "";

其他说明:建立的数据库名称为:qqwe,数据库建立在远程服务器上。mysql.exe和mysqldump.exe从bin目录下取出来,放入到 C:\\ 下。

 

这个程序通过读取*.properties配置文件来获取外界传递进来的信息。这个文件是自己定义的。其中定义的内容如下:

EasyRecoveryConfig.properties 中的配置文件信息


OK,简要说明结束,看代码! 

package DatabaseRR;    import java.io.FileInputStream;  import java.io.FileOutputStream;  import java.io.IOException;  import java.io.InputStream;  import java.io.OutputStream;  import java.sql.Connection;  import java.sql.DriverManager;  import java.sql.ResultSet;  import java.lang.Process;  import java.util.ArrayList;  import java.util.List;  import java.util.Properties;  import java.sql.Statement;    public class EasyRecovery   {      Connection conn = null;            public Connection getConnection(String fileNameAndURL)       {       Properties prop = new Properties();       FileInputStream fis;    try{     fis = new FileInputStream(fileNameAndURL);          prop.load(fis);     fis.close();          String userName  = prop.getProperty("userName");        String password  = prop.getProperty("password");        String localHost = prop.getProperty("localHost");//主机名或主机地址IP,如 192.168.0.100        String database  = prop.getProperty("database");//数据库名称                String jdbcDriver = prop.getProperty("jdbcDriver");//加载数据库驱动的名称        String port = prop.getProperty("port");    //端口        String dataBaseCompany = prop.getProperty("dataBaseCompany");                String pathUrl = "jdbc:"+dataBaseCompany+"://"+localHost+":"+port+"/"+database;                      Class.forName(jdbcDriver);          // 加载MySQL数据库驱动              String url = pathUrl;          // 定义与连接数据库的url              String user = userName;         // 定义连接数据库的用户名              String passWord = password;         // 定义连接数据库的密码              conn = DriverManager.getConnection(url, user, passWord); // 连接连接          }     catch (Exception e)           {              e.printStackTrace();          }          return conn;      }            /**       * 获取MySQL所有数据库方法   <pre name="code" class="java">SCHEMATA 这是MySql记录数据库中一共建立了多少个数据库,并保存他们表名的一个数据库表</pre>  * @param fileNameAndURL       * @return list       */      public List<String> getDatabase(String fileNameAndURL)       {          List<String> list = new ArrayList<String>();   // 定义List集合对象          Connection con = getConnection(fileNameAndURL);  // 获取数据库连接          Statement st;       // 定义Statement对象          try           {              st = con.createStatement();  // 实例化Statement对象              ResultSet rs = st.executeQuery("select schema_name from SCHEMATA");// 指定查询所有数据库方法              while (rs.next())     // 循环遍历查询结果集              {                      list.add(rs.getString(1));  // 将查询数据添加到List集合中              }          }          catch (Exception e)           {              e.printStackTrace();          }          return list;       // 返回查询结果      }            /**       * 备份数据库       *        * @param fileNameAndURL 配置文件和他的路径       *        * @param database  数据库名       * @param path  文件保存路径       * @param userName 创建数据库时设定的用户名        * @param password 数据库用户密码        * @param localHost 主机名或主机地址IP,如 192.168.0.100        * @param CmdDisk mysql.exe、mysqldump.exe这两个文件存放的目录       */      private void mysqldump(String fileNameAndURL)      {       Connection con = getConnection(fileNameAndURL);       Properties prop = new Properties();              try {        FileInputStream fis = new FileInputStream(fileNameAndURL);     prop.load(fis);     fis.close();             String userName  = prop.getProperty("userName");        String password  = prop.getProperty("password");        String localHost = prop.getProperty("localHost");//主机名或主机地址IP,如 192.168.0.100        String database  = prop.getProperty("database");//数据库名称        String saveDisk  = prop.getProperty("saveDisk");//要保存的盘符        String fileName  = prop.getProperty("fileName");//要保存成的文件名称        String fileType  = prop.getProperty("fileType");//要保存成的文件格式        String CmdDisk  = prop.getProperty("CmdDisk"); //                String path = saveDisk + fileName + fileType;//构成了完整路径        String Cmd = "cmd.exe /C " + CmdDisk + "mysqldump --hex-blob -u" + userName + " -p" + password + " -h " + localHost + " " + database + " >" + path + "";             //String asd = "cmd.exe /C C:\\mysqldump -uroot -p123456 -h 192.168.0.100 " + database + " >" + path + ""; 原始格式,不要删除该语句                Process p = Runtime.getRuntime().exec(Cmd);    //定义进行数据备份的语句        StringBuffer out1 = new StringBuffer();     //定义字符串缓冲对象        byte[] b = new byte[1024];                  //定义字节数组        for (int i; ((i = p.getInputStream().read(b)) != -1);)  // 将数据写入到指定文件中   mysqldump.exe        {         out1.append(new String(b, 0, i));       //向流中追加数据        }       }       catch (IOException e)        {        e.printStackTrace();       }      }            /**       * 恢复数据库       *        * @param fileNameAndURL 配置文件和他的路径       *        * @param database  数据库名       * @param path  文件保存路径       * @param userName 创建数据库时设定的用户名        * @param password 数据库用户密码        * @param localHost 主机名或主机地址IP,如 192.168.0.100        * @param CmdDisk mysql.exe、mysqldump.exe这两个文件存放的目录       */      private void mysqlresume(String fileNameAndURL)      {       Connection con = getConnection(fileNameAndURL);       Properties prop = new Properties();              try        {        FileInputStream fis = new FileInputStream(fileNameAndURL);     prop.load(fis);     fis.close();             String userName  = prop.getProperty("userName");        String password  = prop.getProperty("password");        String localHost = prop.getProperty("localHost"); //主机名或主机地址IP,如 192.168.0.100        String database  = prop.getProperty("database"); //数据库名称        String saveDisk  = prop.getProperty("saveDisk"); //要保存的盘符        String fileName  = prop.getProperty("fileName"); //要保存成的文件名称        String fileType  = prop.getProperty("fileType"); //要保存成的文件格式        String CmdDisk  = prop.getProperty("CmdDisk");  //mysql.exe、mysqldump.exe这两个文件存放的目录                String path = saveDisk + fileName + fileType;  //构成了完整路径        String Cmd = "cmd.exe /C " + CmdDisk + "mysql -u" + userName + " -p" + password + " -h " + localHost + " " + database + " <" + path + "";              Process p = Runtime.getRuntime().exec(Cmd);                            StringBuffer out1 = new StringBuffer();     // 定义字符串缓冲对象              byte[] b = new byte[1024];         // 定义字节数组                            for (int i; ((i = p.getInputStream().read(b)) != -1);)  // 将数据写入到指定文件中              {                   out1.append(new String(b, 0, i));      // 向流中追加数据              }          }        catch (IOException e)        {              e.printStackTrace();          }      }            /**       * 编辑属性文件,向配置文件中写入新的信息       * @param fileNameAndURL        * @param Key       * @param Value       */      public void propertyEditor(String fileNameAndURL , String Key , String Value)   {    Properties prop = new Properties();    try     {     InputStream fis = new FileInputStream(fileNameAndURL);     prop.load(fis);     prop.setProperty(Key, Value);          OutputStream fos = new FileOutputStream(fileNameAndURL);     prop.store(fos , Key);          fos.flush();     fis.close();         }    catch(IOException e)    {     e.getStackTrace();    }   }      //################################################//      /**       * 备份  可供外界调用的方法       * @param fileNameAndURL       */      public void dataBaseReserve(String fileNameAndURL)      {          EasyRecovery mc = new EasyRecovery();       mc.mysqldump(fileNameAndURL);      }            /**       * 恢复  可供外界调用的方法       * @param fileNameAndURL       */      public void dataBaseRecovery(String fileNameAndURL)      {       EasyRecovery mc = new EasyRecovery();       mc.mysqlresume(fileNameAndURL);      }                  public static void main(String args[])      {       EasyRecovery mc = new EasyRecovery();       String fileNameAndURL = "E:\\propertiesConfig\\EasyRecoveryConfig.properties";             mc.dataBaseReserve(fileNameAndURL);       mc.propertyEditor(fileNameAndURL, "userName", "Doctor Lee");              mc.dataBaseRecovery(fileNameAndURL);      }        }

        --hex-blob;这个命令是用于将导出的内容处理成为2进制流的形式。因为有些时候你会发现,导出的数据库文件大小与数据库本身真实内容的大小存在冲突,往往是小于真实的大小。加入这个命令你就可以解决这个问题了。这个命令加在备份数据库的时候。

 

 这个程序适用于任何Mis系统、ERP系统等,在您的界面中只需要添加两个按钮然后完成相应的事件即可。这个程序也可以将他改成一个Action(EasyRecoveryAction.java),帮助您完成相应的后台请求。初学者,不足之处请您多多指点。相应的项目工程和依赖程序在下面,您可以拿来直接运行。希望对您有所帮助。开源万岁!转载请您注明出处。