漫步红林

品味技术与生活之间的差距,追求代码与国画之间的艺术.

BlogJava 联系 聚合 管理
  0 Posts :: 28 Stories :: 2 Comments :: 0 Trackbacks

最近想写一个mysql的备份,竟然发现不会写了!现在做个记录。
       首先,设置mysql的环境变量(在path中添加%MYSQL_HOME%\bin),重启电脑。
完整代码:

备份: 
    

  1/** 
  2     * @param args 
  3     */
 
  4    public static void main(String[] args) 
  5        /* 
  6         * 备份和导入是一个互逆的过程。 
  7         * 备份:程序调用mysql的备份命令,读出控制台输入流信息,写入.sql文件; 
  8         * 导入:程序调用mysql的导入命令,把从.sql文件中读出的信息写入控制台的输出流 
  9         * 注意:此时定向符">"和"<"是不能用的 
 10         */
 
 11        backup(); 
 12        load(); 
 13    }
 
 14
 15    /** 
 16     * 备份检验一个sql文件是否可以做导入文件用的一个判断方法:把该sql文件分别用记
 17     * 事本和ultra 
 18     * edit打开,如果看到的中文均正常没有乱码,则可以用来做导入的源文件(不管sql文
 19     * 件的编码格式如何,也不管db的编码格式如何) 
 20     */
 
 21    public static void backup() 
 22        try 
 23            Runtime rt = Runtime.getRuntime(); 
 24
 25            // 调用 mysql 的 cmd: 
 26            Process child = rt.exec("mysqldump -u root --set-charset=utf8 bjse act_obj");// 设置导出编码为utf8。这里必须是utf8 
 27           
 28            // 把进程执行中的控制台输出信息写入.sql文件,即生成了备份文件。注:如
 29//果不对控制台信息进行读出,则会导致进程堵塞无法运行 
 30            InputStream in = child.getInputStream();// 控制台的输出信息作为输入流 
 31                       
 32            InputStreamReader xx = new InputStreamReader(in, "utf8");
 33// 设置输出流编码为utf8。这里必须是utf8,否则从流中读入的是乱码 
 34           
 35            String inStr; 
 36            StringBuffer sb = new StringBuffer(""); 
 37            String outStr; 
 38            // 组合控制台输出信息字符串 
 39            BufferedReader br = new BufferedReader(xx); 
 40            while ((inStr = br.readLine()) != null
 41                sb.append(inStr + "\r\n"); 
 42            }
 
 43            outStr = sb.toString(); 
 44           
 45            // 要用来做导入用的sql目标文件: 
 46            FileOutputStream fout = new FileOutputStream( 
 47                    "e:/mysql-5.0.27-win32/bin/bjse22.sql"); 
 48            OutputStreamWriter writer = new OutputStreamWriter(fout, "utf8"); 
 49            writer.write(outStr); 
 50   // 注:这里如果用缓冲方式写入文件的话,会导致中文乱码,用flush()方法则可以避免 
 51            writer.flush(); 
 52
 53            // 别忘记关闭输入输出流 
 54            in.close(); 
 55            xx.close(); 
 56            br.close(); 
 57            writer.close(); 
 58            fout.close(); 
 59
 60            System.out.println("/* Output OK! */"); 
 61
 62        }
 catch (Exception e) 
 63            e.printStackTrace(); 
 64        }
 
 65
 66    }
 
 67
 68    /** 
 69     * 导入 
 70     * 
 71     */
 
 72    public static void load() 
 73        try 
 74                   String fPath = "e:/mysql-5.0.27-win32/bin/bjse22.sql"
 75                    Runtime rt = Runtime.getRuntime(); 
 76
 77                   // 调用 mysql 的 cmd: 
 78                   Process child = rt.exec("mysql -u root bjse "); 
 79                   OutputStream out = child.getOutputStream();//控制台的输入信息作为输出流 
 80                   String inStr; 
 81                   StringBuffer sb = new StringBuffer(""); 
 82                   String outStr; 
 83                   BufferedReader br = new BufferedReader(new InputStreamReader( new FileInputStream(fPath), "utf8")); 
 85               while ((inStr = br.readLine()) != null
 86                            sb.append(inStr + "\r\n"); 
 87                   }
 
 88                    outStr = sb.toString(); 
 89
 90                   OutputStreamWriter writer = new OutputStreamWriter(out, "utf8"); 
 91                   writer.write(outStr); 
 92                    // 注:这里如果用缓冲方式写入文件的话,会导致中文乱码,用flush()方法则可以避免 
 93                     writer.flush(); 
 94                    // 别忘记关闭输入输出流 
 95                     out.close(); 
 96                      br.close(); 
 97                      writer.close(); 
 98
 99                      System.out.println("/* Load OK! */"); 
100
101        }
 catch (Exception e) 
102            e.printStackTrace(); 
103        }
 
104
105    }
 
106


备份语句:

 1mysql> SELECT * INTO OUTFILE "D:\\data\\db_testtemp.txt" fields terminated by '
 2' from db_testtemp where std_state='1'
 3Query OK, 1 row affected (0.00 sec) 
 4
 5mysql> SELECT * INTO OUTFILE "D:\\data\\db_testtemp.txt" fields terminated by '
 6' from db_testtemp ; 
 7Query OK, 2 rows affected (0.00 sec) 
 8
 9生成一个只有数据的.txt:SELECT * INTO OUTFILE "D:\\data\\db_testtemp.txt" fields terminated by ',' lines terminated by '\r\n' from db_testtemp ; 
10
11只生成一个只有数据的.txt:mysqldump -uroot -pncae2010 -"std_state='1'"  -T D:\data --no-create-info --fields-terminated-by=, exam db_testtemp 
12
13生成一个创建数据库语句的sql,一个只有数据的.txt:mysqldump -uroot -pncae2010 -"std_state='1'"  -T D:\data --fields-terminated-by=, exam db_testtemp 
14
15只生成insert语句:mysqldump -uroot -pncae2010 -"std_state='1'"  -t exam db_testtemp > D:\data\a.sql 


        在Manager工具盛行的今天,也许我们的这些操作基本都不用手动去写,直接在工具上备份就行了,UI操作,非常方便。
posted on 2009-02-22 18:37 苦瓜 阅读(284) 评论(1)  编辑  收藏

Feedback

# re: MySql 备份与整理问题 2009-02-28 00:07 路过
兄弟直接写个脚本,内容是mysqldump 备份语句
直接运行脚本就行了,不需要写代码那么麻烦吧?而且你还可以通过crontab设定脚本执行时间,自动备份,轻松。  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: