不多说先上代码
/**.
     * 将数据库数据备份到文件中
     */
    public void backUp(){
        String back = "";
        String name = getRequest().getParameter("name");
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");
        String time = name+"_"+sf.format(date).toString();
        try {
            Runtime rt = Runtime.getRuntime();
            String user = "root"; // 数据库帐号
            String password = "root"; // 登陆密码
            String database = "produce"; // 需要备份的数据库名
            String filepath = "d:\\MySQLBase\\"+time+".sql"; // 备份的路径地址
            String stmt1 = "mysqldump " + database + " -R -h 192.168.0.133 " + " -u "
                    + user + " -p" + password
                    + " --default-character-set=utf8 --triggers -R --hex-blob -x --result-file=" + filepath;
            System.out.println("-------:"+stmt1);
            // 调用 mysql 的 cmd:
            Process child = rt.exec(stmt1);// 设置导出编码为utf8。这里必须是utf8
  
            System.out.println("亲,备份成功了哦!");
            back = "1";
        } catch (Exception e) {
            back = "2";
            e.printStackTrace();
        }
        CommonMethod commonMethod = new CommonMethod();
        commonMethod.responseAjax(back, null);
    }
/**.
     * 将备份文件中的数据还原到数据库
     */
    public void recove(){
        String back = "";
        String file = getRequest().getParameter("file");
        file = file.substring(file.lastIndexOf("\\")+1,file.length());
        try {
                String fPath = "e:/bin/bf.sql";
                Runtime rt = Runtime.getRuntime();
                String user = "root"; // 数据库帐号 
                String password = "root"; // 登陆密码 
                String database = "produce"; // 需要备份的数据库名 
                String sour = "localhost";
//                String filepath = "d:\\MySQLBase\\bf.sql"; // 备份的路径地址 
                String filepath = "d:\\MySQLBase\\"+file; // 备份的路径地址 
                // 调用 mysql 的 cmd:
    //          Process child = rt.exec("mysql -u "+user+" -p "+password+" "+database );
                String st = "mysql -h "+sour+" -u "+user+" -p"+password+" -f "+database;
                Process child = 
                    rt.exec(st);
                System.out.println(st);
                OutputStream out = child.getOutputStream();//控制台的输入信息作为输出流
                String inStr;
                StringBuffer sb = new StringBuffer("");
                String outStr;
                BufferedReader br = new BufferedReader(new InputStreamReader(
                new FileInputStream(filepath), "utf8"));
                while ((inStr = br.readLine()) != null) {
                sb.append(inStr + "\r\n");
                }
                outStr = sb.toString();                OutputStreamWriter writer = new OutputStreamWriter(out, "utf8");
                writer.write(outStr);
                // 注:这里如果用缓冲方式写入文件的话,会导致中文乱码,用flush()方法则可以避免
                writer.flush();
                // 别忘记关闭输入输出流
                out.close();
                br.close();
                writer.close();
                System.out.println("亲,数据已经恢复了!");
                back = "1";
            } catch (Exception e) {
                back = "2";
                e.printStackTrace();
            }
            CommonMethod commonMethod = new CommonMethod();
            commonMethod.responseAjax(back, null);
    }代码发完了 现在说下问题  
问题一:可以成功的备份文件但是貌似自定义函数存储过程什么的没有备份上
问题二:视图也备份上了 但是备份时给备份成数据表了 也就是数据还原后 视图都变成数据表了
求救啊~~~~~~~数据库databasejava

解决方案 »

  1.   

     String stmt1 = "mysqldump " + database + " -R -h 192.168.0.133 " + " -u "
                        + user + " -p" + password
                        + " --default-character-set=utf8 --triggers -R --hex-blob -x --result-file=" + filepath;断点调试,看一下你的 stmt1 的实际内容是什么。
    然后直接在命令行下测试这个语句的结果。 你的命令中看上去已经有 -R 应该可以备份存储过程。
      

  2.   

    问题二:视图也备份上了 但是备份时给备份成数据表了 也就是数据还原后 视图都变成数据表了
    直接打开你的备份文件,看其实的VIEW到底备份成什么样了。
      

  3.   

    问题一:可以成功的备份文件但是貌似自定义函数存储过程什么的没有备份上 String stmt1 = "mysqldump " + database + " -R -h 192.168.0.133 " + " -u "
                        + user + " -p" + password
                        + " --default-character-set=utf8 --triggers -R --hex-blob -x --result-file=" + filepath;
                System.out.println("-------:"+stmt1);
    你已经加入了-R
    示例:
    mysqldump -B -R -E -uroot -p123 zz>R:\TEMP\QQ.TXT
    zz为databasename 问题二:视图也备份上了 但是备份时给备份成数据表了 也就是数据还原后 视图都变成数据表了
    确实是这样,不用担心,恢复时可以生成如 cretae view ... as 的SQL语句
      

  4.   


    我查看过了 备份的文件中 如果语句中不加  -t  里面的视图就变成 create Table 而且视图中的数据也是 insert into 插入(还原的时候能把视图创建成数据表但数据插入不进去) 
      

  5.   


    关于您说的问题一 我加了 —E 好像就不能备份成功 加了 -R 可以备份 而且我也把备份的内容(备份后的.sql文件)查看了 并没有找到与函数和存储过程相关的内容关于问题二 : 可能是我没说清楚,我的意思就是 备份后的.sql文件中 把视图备份成cretae table了 在我还原数据后 所有的视图都变成数据表了 并没有像您说的 create view 
      

  6.   


    感谢您的回答 关于问题一 我调试过了打印出来的就是这样的语句 mysqldump basename -R -h 192.168.0.133  -u root -proot --default-character-set=utf8 --triggers -R --hex-blob -x --result-file=d:\xx.sql
    我加了 -R 但是查看备份后的.sql文件内容并没找到存储过程和函数相关的内容关于问题二:查看备份后的.sql文件 其中关于视图的都是  create table xx_view 导致我还原的时候把视图都还原成了数据表了  而且.sql文件中关于视图中的数据也是 insert into的 但还原后视图中并没有数据
      

  7.   

    -R, --routines      Dump stored routines (functions and procedures).将你的stmt1直接在DOS窗口下运行,看看提示什么,查找备份文件中是否有
    PROCEDURE,加入-R是可以备份的关于问题二 : 可能是我没说清楚,我的意思就是 备份后的.sql文件中 把视图备份成cretae table了 在我还原数据后 所有的视图都变成数据表了 并没有像您说的 create view 我是说恢复时可以生成如 cretae view ... as 的SQL语句
      

  8.   

    问题一的中的stmt1在dos下没有任何提示 备份的文件中也没有你说的 PROCEDURE 问题二 应该是我太菜了 不能理解你说的 我直接把我备份文件中关于视图的那段贴出来 您在帮我看下吧
    [code]--
    -- Table structure for table `dynamictbl_view32`
    --DROP TABLE IF EXISTS `dynamictbl_view32`;
    /*!50001 DROP VIEW IF EXISTS `dynamictbl_view32`*/;
    /*!50001 DROP TABLE IF EXISTS `dynamictbl_view32`*/;
    /*!50001 CREATE TABLE `dynamictbl_view32` (
      `eid` int(11),
      `dynamicTbl44` varchar(255),
      `dynamicTbl43` datetime,
      `dynamicTbl42` int(11),
      `dynamicTbl41` int(11),
      `dynamicTbl40` double,
      `dynamicTbl39` datetime,
      `createtime` datetime,
      `sid` int(11),
      `cuserid` varchar(200)
    ) */;
    [/code]
    在备份文件中所有的视图都被备份成这个样子了 
      

  9.   

    问题一的中的stmt1在dos下没有任何提示 备份的文件中也没有你说的 PROCEDURE 呵呵,检查你的库中是否有SP,我用mysqldump -B -R -E -uroot -p123 zz>R:\TEMP\QQ.TXT
    可以备份SP、UDF 问题二 应该是我太菜了 不能理解你说的 我直接把我备份文件中关于视图的那段贴出来 您在帮我看下吧在我的为人中VIEW也是这样,已经说过,恢复时可以生成如 cretae view ... as 的SQL语句,已经测试过 N次了,你可以自行测试
      

  10.   


    我知道您都可以的 现在问题是我这里不可以 但又不知道哪里出了问题 我刚刚按你的备份语句试了下 
    mysqldump -h 192.168.0.133 -B -R -E -u root -proot produce --result-file=d:\MySQLBase\888888_20130110.sql
     为什么提示 mysqldump:unknown option '-E' 会不是我版本的问题呢 我的mysql版本是5.0的
      

  11.   

    你的语句有问题,用下述语句试试,自行修改,在5.5下测试通过
    mysqldump -B -R -E -uroot -p123 zz>R:\TEMP\QQ.TXT
      

  12.   

    mysqldump -B -R -E -uroot -proot -h 192.168.0.133 produce>d:\QQ.TXT
    这个语句 dos 运行 还是 mysqldump: unknown option '-E'  正在下载5.5版..... 
      

  13.   

    去掉 -E 参数
    mysqldump -B -R -uroot -p123 zz>R:\TEMP\QQ.TXT
      

  14.   

    Ok   哈哈  问题解决 找到原因了  是我测试备份的那个数据库有个没有用的视图 而且那个视图就算是官方的备份工具都备份不上  我写的这个备份程序一备份到那个视图就报错 然后就有了后面视图被还原成数据表啊 函数没备份上这些问题了  谢谢大家帮我  尤其谢谢  wwwwb  一直在线帮我解答