<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    靈魂-放水

    為學(xué)日益,為道日損。

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      296 Posts :: 10 Stories :: 274 Comments :: 0 Trackbacks
     

    在虛擬主機的環(huán)境下,因為沒有管理員權(quán)限,只有數(shù)據(jù)庫使用權(quán)限,定時備份SQL數(shù)據(jù)是

    個比較麻煩的問題。解決思路如下:(僅對SQL2000有效)
    1. 利用T-SQL備份數(shù)據(jù)庫到指定目錄,文件名根據(jù)日期指定。
    2. 利用Resin的定時功能,定時執(zhí)行備份。
    3. 用戶定時下載備份并且刪除過期備份。

    導(dǎo)出全部數(shù)據(jù)到Excel也比較實用。下面提供的方法可以導(dǎo)出庫中的全部表,也可以指定

    幾個表導(dǎo)出。注意:
    1. 因為是導(dǎo)出全部數(shù)據(jù),在數(shù)據(jù)比較多的情況下慎用。
    2. 理論上應(yīng)該適用各種JDBC數(shù)據(jù)庫,僅對SQL2000測試過
    3. 對于B/S下載,建議不要在服務(wù)器上生成文件,以免造成垃圾文件。直接從HTTP的Response中取得OutputStream進行輸出。
    4. Excel操作的API請到這里下載:http://www.andykhan.com/jexcelapi/

    package steeven;
    import jxl.write.*;
    import java.util.*;
    import java.sql.Statement;
    import java.sql.ResultSet;
    import java.sql.Types;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.text.DateFormat;
    import java.io.*;

    /**
     * <p>Title: 數(shù)據(jù)庫備份</p>
     * <p>Description: 在Java中備份數(shù)據(jù)庫</p>
     * @author steeven
     * @version 1.0
     */
    public class DBackup{
        Context ctx ;
        public DBackup(Context ctx) {
            this.ctx = ctx;
        }
        /**
         * 備份SQL2000數(shù)據(jù)庫到文件,整個數(shù)據(jù)庫備份
         * 文件名后面將追加備份年月日。例如:c:\dbBackup\mydb031109
         * @param file 導(dǎo)出的文件名全路徑。例如:"c:\\dbBackup\\mydb"
         */
        public void backup(String dbName, String file)throws SQLException{
            String sql = "BACKUP DATABASE ["+dbName+"] TO DISK = N'";
            sql += file + new SimpleDateFormat("yyMMdd").format(new Date());
            sql += "' WITH  NOINIT ,  NOUNLOAD ,  NAME = N'lvdong',  NOSKIP , 

    STATS = 10,  NOFORMAT";
            Statement stmt = ctx.getConnection().createStatement();
            stmt.executeUpdate(sql);
        }
        /**
         * 導(dǎo)出整個數(shù)據(jù)庫到Excel
         * @param conn 數(shù)據(jù)庫連接
         * @param out 輸出Stream
         */
        public static void db2Excel(Connection conn,OutputStream out)throws

    Exception{
            db2Excel(conn,out,getTables(conn));
        }
        /**
         * 導(dǎo)出數(shù)據(jù)庫中指定的表名到Excel
         * @param conn 數(shù)據(jù)庫連接
         * @param out 輸出Stream
         * @param tables 表名
         * @throws Exception
         */
        public static void db2Excel(Connection conn,OutputStream out,List

    tables)throws Exception{
            WritableWorkbook wb = jxl.Workbook.createWorkbook(out);
            for (int i = 0; i < tables.size(); i++) {
                WritableSheet sheet = wb.createSheet(tables.get(i).toString(),i);
                writeSheet(sheet,tables.get(i).toString(),conn);
            }
            wb.write();
            wb.close();
        }
        /**
         * 導(dǎo)出表數(shù)據(jù)到Excel的sheet
         */
        public static void writeSheet(
            WritableSheet sheet,String table,Connection conn)
            throws Exception
        {
            //取得所有表數(shù)據(jù)
            String sql = "select * from "+DB.ESC1+table+DB.ESC2;
            ResultSet rs = conn.createStatement().executeQuery(sql);
            //根據(jù)ResultSet的MetaData取得表頭,列數(shù),列寬
            java.sql.ResultSetMetaData meta = rs.getMetaData();
            int n = meta.getColumnCount();
            int row = 0;
            WritableCellFormat fmt = new WritableCellFormat();
            fmt.setBackground(jxl.format.Colour.YELLOW);
            for (int i = 0; i < n; i++){
                //導(dǎo)出表頭
                sheet.addCell(new Label(i, row, meta.getColumnLabel(i + 1),fmt));
                //設(shè)定列寬
    //            sheet.setColumnView(i,meta.getColumnDisplaySize(i+1));
            }
            row++;
            while(rs.next()){
                for (int i = 0; i < n; i++){
                    //根據(jù)列的類型決定Excel中對應(yīng)的Cell類型,缺省為文本。
                    WritableCell cell ;
                    switch(meta.getColumnType(i+1)){
                        case Types.BIT:
                        case Types.BIGINT:
                        case Types.BOOLEAN:
                        case Types.DECIMAL:
                        case Types.FLOAT:
                        case Types.INTEGER:
                        case Types.NUMERIC:
                        case Types.REAL:
                        case Types.SMALLINT:
                        case Types.TINYINT:
                            double val = rs.getDouble(i+1);
                            if (rs.wasNull()) cell = new jxl.write.Blank(i,row);
                            cell = new jxl.write.Number(i, row, val);
                            break;
                        case Types.DATE:
                        case Types.TIME:
                        case Types.TIMESTAMP:
                            Date date = rs.getDate(i + 1);
                            if (rs.wasNull()) cell = new jxl.write.Blank(i,row);
                            else cell = new jxl.write.DateTime(i, row, date);
                            break;
                        default:
                            cell = new Label(i, row, rs.getString(i + 1));
                    } //end of switch
                    sheet.addCell(cell);
                }//end of for each column
                row++;
            }//end of while(rs.next())
        }
        /**
         * 從Connection的MetaData取得所有數(shù)據(jù)表的名稱
         */
        public static List getTables(Connection conn)throws Exception{
            ResultSet rs = conn.getMetaData().getTables(
                null,null,null,new String[]{"Table"});
            List list = new ArrayList();
            while(rs.next())
                list.add(rs.getString(3));
            rs.close();
            return list;
        }

        public static void main(String[] args) throws Exception{
            Connection conn = DB.getConn();
            FileOutputStream out = new FileOutputStream("c:\\test.xls");
            db2Excel(conn,out);
            out.close();
            conn.close();
        }
    }

    ------------------------------------
    關(guān)于虛擬主機的數(shù)據(jù)庫如何備份
    1.最早的時候用sqlserver的備份功能,在本地可以實現(xiàn),用程序調(diào)用就可以了。后來發(fā)不到虛擬機的時候才發(fā)現(xiàn),虛擬機把大部分的存儲過程都給關(guān)閉了。只好考慮用別的方法。
    2.后來,我就用自己寫的存儲過程來備份數(shù)據(jù)庫,當(dāng)時是虛擬主機和數(shù)據(jù)庫在同一臺機器上,ok沒有問題了。
    3.現(xiàn)在由于速度問題,虛擬主機必須移到香港,所以第二種方法就沒法子實現(xiàn)了。
    想來想去,嘿嘿,利用本地的sqlserver。
    新建一個包,然后點“復(fù)制sqlserver 對象任務(wù)”,然后輸入源/目的/復(fù)制的信息。一般如果是數(shù)據(jù)量比較少的話,我們可以用替換現(xiàn)有數(shù)據(jù),也是最正常的情況,我覺得這個比較可行,如果是追加的話,就會丟失修改的信息。然后,虛擬主機的sqlserver一般需要用戶名密碼,那么我們就在自己本地的sqlserver的安全里面也增加相同用戶名及密碼。這樣我們執(zhí)行的時候就不會出問題了。
    然后我們保存這個包,確信sqlagent服務(wù)已經(jīng)啟動。如果啟動了,那么我們在數(shù)據(jù)轉(zhuǎn)換服務(wù)-本地包,然后右擊我們剛才創(chuàng)建的包,選擇調(diào)度。設(shè)定一個時間段,我一般選擇12點,那時候大家都去吃飯了~~
    posted on 2008-07-02 16:12 放水老倌 閱讀(708) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫
    主站蜘蛛池模板: 成人影片麻豆国产影片免费观看| 亚洲AV无码乱码国产麻豆| 亚洲国产精品无码久久一线| 久久综合给合久久国产免费| 成人精品国产亚洲欧洲| av午夜福利一片免费看久久| 国产一精品一av一免费爽爽| 国内精品久久久久影院亚洲| 国产成人亚洲精品播放器下载 | 国产日韩成人亚洲丁香婷婷| 麻豆高清免费国产一区| 日韩精品免费电影| 亚洲第一成年男人的天堂| 中文字幕亚洲男人的天堂网络| 精品国产亚洲男女在线线电影 | 亚洲国产精品一区二区三区久久| 午夜亚洲AV日韩AV无码大全| 亚洲欧美成aⅴ人在线观看| 亚洲愉拍一区二区三区| 亚洲精品美女视频| 亚洲一区综合在线播放| 亚洲AV网一区二区三区| 99久久精品日本一区二区免费| 亚洲日韩国产精品第一页一区| 亚洲精品一卡2卡3卡四卡乱码 | 亚洲av成人无码网站…| 国产在线a免费观看| 精品久久久久成人码免费动漫| 国产亚洲精品成人a v小说| 亚洲色大成网站www| 久久久久久精品免费免费自慰| 亚洲AV无码一区二区三区性色| 麻豆视频免费观看| 亚洲精品在线免费看| 免费一级不卡毛片| 久久久久亚洲AV无码麻豆| baoyu777永久免费视频| 99免费视频观看| 亚洲图片校园春色| 永久免费在线观看视频| 亚洲大香人伊一本线|