zoukankan      html  css  js  c++  java
  • java 操作数据库备份

        /**用于执行某表的备份(内部类)线程
         * @from    fhadmin.cn
         * Callable 有返回值的线程接口
         */
        class DbBackUpCallable implements Callable<Object>{
            String tableName = null;
            public DbBackUpCallable(String tableName){
                this.tableName = tableName;
            }
            @Override
            public Object call() {
                try {
                    String remoteDB = pros.getProperty("remoteDB");            //是否远程备份数据库 yes or no
                    String DBSeverport = pros.getProperty("DBSeverport");    //远程服务器备份程序端口
                    String dbtype = pros.getProperty("dbtype");                //数据库类型
                    String username = pros.getProperty("username");            //用户名
                    String password = pros.getProperty("password");            //密码
                    String address = pros.getProperty("dbAddress");            //数据库连接地址
                    String databaseName = pros.getProperty("databaseName");    //数据库名
                    String dbpath = pros.getProperty("dbpath");            //数据库的安装路径
                    String sqlpath = pros.getProperty("sqlFilePath");        //存储路径
                    String ffilename = DateUtil.getSdfTimes();
                    String commandStr = "";
    
                    if(!"sqlserver".equals(dbtype)){
                        sqlpath = sqlpath+DateUtil.getDays()+"/";            //日期当路径分支
                        if("yes".equals(remoteDB)){//数据库另外一台服务器上(和tomcat不在同一台服务器上)
                            commandStr = DbFH.getExecStr(dbtype,dbpath,"localhost",username,password,sqlpath,tableName,databaseName,ffilename); //命令语句
                            Socket ss = null;
                            DataOutputStream bb = null;
                            DataInputStream dat = null;
                            ss = new Socket(address, Integer.parseInt(DBSeverport));//连接远程服务器数据库备份程序
                            bb = new DataOutputStream(ss.getOutputStream());
                            dat = new DataInputStream(ss.getInputStream());
                            bb.writeUTF("FHQ313596790"+commandStr+"FH313596790"+sqlpath);    //发送指令给服务端
                            bb.flush();
                            Boolean llm = true;
                            while(llm){
                                String returnstr = dat.readUTF();
                                if("errer".equals(returnstr)){
                                    return returnstr;    //远程服务器备份失败或超时
                                }
                                llm = false;
                                ss.close();
                                bb.close();
                                dat.close();
                            }
                        }else{                            //数据库在本地(和tomcat在同一台服务器上)
                            FileUtil.createDir(sqlpath+"/fh.fh");
                            commandStr = DbFH.getExecStr(dbtype,dbpath,address,username,password,sqlpath,tableName,databaseName,ffilename); //命令语句
                            Runtime cmd = Runtime.getRuntime();
                            Process p = cmd.exec(commandStr);
                            p.waitFor();                 // 该语句用于标记,如果备份没有完成,则该线程持续等待
                        }
                    }else{//当数据库为sqlserver时 只能备份整库,不能单表备份
                        String spath = sqlpath + databaseName + "_"+ffilename + ".bak";// name文件名  
                        String bakSQL = "backup database "+databaseName+" to disk=? with init";// SQL语句  
                        PreparedStatement bak = DbFH.getFHCon().prepareStatement(bakSQL);  
                        bak.setString(1, spath);// path必须是绝对路径  
                        bak.execute();             // 备份数据库  
                        bak.close(); 
                    }
                    String fileType=".bak";
                    if("mysql".equals(dbtype)){
                        fileType=".sql";
                    }else if("oracle".equals(dbtype)){
                        fileType=".DMP";
                    }
                    if("".equals(tableName)){
                        return sqlpath+databaseName+"_"+ffilename+fileType;
                    }else{
                        return sqlpath+tableName+"_"+ffilename+fileType;
                    }
                } catch (Exception e) {
                    logger.error("备份操作出现问题", e);
                    return "errer";
                }finally{
                    backUpTableList.remove(tableName); // 最终都将解除
                }
            }
        }
        
        /**数据库备份命令字符串
         * @param dbtype 数据库类型
         * @param dbpaths 数据库的路径
         * @param address 数据库连接地址
         * @param username 用户名
         * @param password 密码
         * @param sqlpath 存储路径
         * @param tableName 表名
         * @param databaseName 数据库名
         * @param ffilename 日期当路径和保存文件名的后半部分
         * @return 完整的命令字符串
         */
        public static String getExecStr(String dbtype,String dbpath,String address,String username,String password,String sqlpath,String tableName,String databaseName,String ffilename){
            StringBuffer sb = new StringBuffer();
            if("mysql".equals(dbtype)){
                address = "localhost";
                sb.append(dbpath);
                sb.append("mysqldump ");
                sb.append("--opt ");
                sb.append("-h ");
                sb.append(address);
                sb.append(" ");
                sb.append("--user=");
                sb.append(username);
                sb.append(" ");
                sb.append("--password=");
                sb.append(password);
                sb.append(" ");
                sb.append("--lock-all-tables=true ");
                sb.append("--result-file=");
                sb.append(sqlpath);
                sb.append(("".equals(tableName)?databaseName+"_"+ffilename:tableName+"_"+ffilename)+".sql");
                sb.append(" ");
                sb.append("--default-character-set=utf8 ");
                sb.append(databaseName);
                sb.append(" ");
                sb.append(tableName);//当tableName为“”时,备份整库
            }else if("oracle".equals(dbtype)){
                if("".equals(tableName)){//备份整库
                    sb.append("EXP "+username+"/"+password+" BUFFER=880000 FILE="+sqlpath+username+"_"+ffilename+".DMP LOG="+sqlpath+username+"_"+ffilename+".LOG OWNER="+username);
                }else{//备份单表
                    sb.append("EXP "+username+"/"+password+" BUFFER=880000 FILE="+sqlpath+tableName+"_"+ffilename+".DMP LOG="+sqlpath+tableName+"_"+ffilename+".LOG TABLES=("+username+"."+tableName+")");
                }
            }
            return sb.toString();
        }
     
  • 相关阅读:
    Polly
    ELK
    Python基础三(选择,循环)
    Python基础二(输入与输出)
    Python关键字
    Python基础一(基本类型和运算符)
    Python发展史
    在虚拟机(vmware)上安装CentOS
    centos7联网
    Hashmap的实现
  • 原文地址:https://www.cnblogs.com/m170981362621/p/15323950.html
Copyright © 2011-2022 走看看