天天看點

java Mysql 資料庫備份和恢複

package cn.com.git.demo;

import java.io.BufferedReader;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

public class DBsave {

    public static void main(String[] args) {

         backup();

        //load();

    }

    /**

     * 備份檢驗一個sql檔案是否可以做導入檔案用的一個判斷方法:把該sql檔案分别用記事本和ultra

     * edit打開,如果看到的中文均正常沒有亂碼,則可以用來做導入的源檔案(不管sql檔案的編碼格式如何,也不管db的編碼格式如何)

     */

    public static void backup() {

        try {

            Runtime rt = Runtime.getRuntime();

            // 調用 mysql 的 cmd:

            Process child = rt

                    .exec("mysqldump -uroot -proot --set-charset=utf8 demo");// 設定導出編碼為utf8。這裡必須是utf8

            // 把程序執行中的控制台輸出資訊寫入.sql檔案,即生成了備份檔案。注:如果不對控制台資訊進行讀出,則會導緻程序堵塞無法運作

            InputStream in = child.getInputStream();// 控制台的輸出資訊作為輸入流

            InputStreamReader xx = new InputStreamReader(in, "utf8");// 設定輸出流編碼為utf8。這裡必須是utf8,否則從流中讀入的是亂碼

            String inStr;

            StringBuffer sb = new StringBuffer("");

            String outStr;

            // 組合控制台輸出資訊字元串

            BufferedReader br = new BufferedReader(xx);

            while ((inStr = br.readLine()) != null) {

                sb.append(inStr + "\r\n");

            }

            outStr = sb.toString();

            // 要用來做導入用的sql目标檔案:

            FileOutputStream fout = new FileOutputStream(

                    "e:/demo.sql");

            OutputStreamWriter writer = new OutputStreamWriter(fout, "utf8");

            writer.write(outStr);

            // 注:這裡如果用緩沖方式寫入檔案的話,會導緻中文亂碼,用flush()方法則可以避免

            writer.flush();

            // 别忘記關閉輸入輸出流

            in.close();

            xx.close();

            br.close();

            writer.close();

            fout.close();

            System.out.println("/* Output OK! */");

        } catch (Exception e) {

            e.printStackTrace();

        }

     * 導入

     * 導入的時候需要資料庫已經建好。

    public static void load() {

            String fPath = "e:/demo.sql";

        //    rt.exec("create database demo");

            Process child = rt.exec("mysql -uroot -proot demo");

            OutputStream out = child.getOutputStream();// 控制台的輸入資訊作為輸出流

            BufferedReader br = new BufferedReader(new InputStreamReader(

                    new FileInputStream(fPath), "utf8"));

            OutputStreamWriter writer = new OutputStreamWriter(out, "utf8");

            out.close();

            System.out.println("/* Load OK! */");

}

補充一下

指令行下具體用法如下:  mysqldump -u使用者名 -p密碼 -d 資料庫名 表名 腳本名;

    1、導出資料庫為dbname的表結構(其中使用者名為root,密碼為dbpasswd,生成的腳本名為db.sql)

    mysqldump -uroot -pdbpasswd -d dbname >db.sql;

    2、導出資料庫為dbname某張表(test)結構

    mysqldump -uroot -pdbpasswd -d dbname test>db.sql;

    3、導出資料庫為dbname所有表結構及表資料(不加-d)

    mysqldump -uroot -pdbpasswd  dbname >db.sql;

    4、導出資料庫為dbname某張表(test)結構及表資料(不加-d)

    mysqldump -uroot -pdbpasswd dbname test>db.sql;