zoukankan      html  css  js  c++  java
  • 达梦数据库备份-手动备份

    本系列文章用Java实现达梦数据库的备份还原功能,分为本地备份(本服务器),异地备份(备份到其他服务器),手动备份和定时任务备份,及数据还原功能。

    1. 达梦数据库备份还原分类:

      

      代码主要通过dexp和dimp命令实现全库和表级别的逻辑备份还原

    逻辑导出和逻辑导入数据库对象分为四种级别:数据库级、用户级、模式级和表级。四种级
    别独立互斥,不能同时存在。四种级别所提供的功能:
    1) 数据库级(FULL):导出或导入整个数据库中的所有对象。
      例:./dimp USERID=SYSDBA/SYSDBA FILE=/mnt/data/dexp/db_str.dmp LOG=db_str.log FULL=Y DIRECTORY=/mnt/data/dimp
    2)用户级(OWNER):导出或导入一个或多个用户所拥有的所有对象。
      例:./dimp USERID=SYSDBA/SYSDBA FILE=/mnt/data/dexp/db_str.dmp LOG=db_str.log OWNER=USER01 DIRECTORY=/mnt/data/dimp
    3)模式级(SCHEMAS):导出或导入一个或多个模式下的所有对象。
      例:./dimp USERID=SYSDBA/SYSDBA FILE=/mnt/data/dexp/db_str.dmp LOG=db_str.log SCHEMAS=USER01 DIRECTORY=/mnt/data/dimp
    4)表级(TABLE):导出或导入一个或多个指定的表或表分区。
      例:./dimp USERID=SYSDBA/SYSDBA FILE=/mnt/data/dexp/db_str.dmp LOG=db_str.log TABLES=table1,table2 DIRECTORY=/mnt/data/dimp
     
    2. 手动备份 
     //yum文件
     dameng:
      dev:
       #数据库服务器ip地址 ip:
    ip
    #服务器用户名
    userName: dmdba
    #登录密码 userPwd:
    123456  /**    *本地服务器的ip,username,pwd写到配置文件yum中 */   @Value("${dameng.dev.ip}")   private String userIp;   @Value("${dameng.dev.userName}")   private String userName;   @Value("${dameng.dev.userPwd}")   private String userPwd;   /** * 手动备份 -- 部分备份    *@tnames 要备份的表名    *@copytype 备份类型 local本地 foreignLands异地    *@ip,port,user,pwd,dir 异地备份服务器的ip,port,用户名,密码,备份文件存放目录 */ public Map<String, Object> dumpSQL(String tnames, String copyType, String ip, String port, String user, String pwd, String dir) { System.out.println("备份类型:" + copyType); String result = null; // 保存备份列表,备份文件名称=数据库id+T+时间,还原使用 SjglSjbflbParam param = new SjglSjbflbParam(); param.setCjlx(copyType); // 获取服务器连接 if (ip != null && port != null && user != null && pwd != null && dir != null) { param.setIp(ip); param.setPort(port); param.setUsername(user); param.setRepassword(pwd); param.setDir(dir); } StringBuffer tids = new StringBuffer(); for (String s1 : ids) { tids.append(s1).append(","); } param.setTids(tids.toString().substring(0, tids.toString().length() - 1)); param.setBflx("1"); String filename = sjglSjbflbService.add(param);//将备份记录保持到数据库,还原使用 Connection conn = DMruntimeUtil.login(userIp, userName, userPwd); // 本地备份 if (copyType.equals("local")) { String dexpStr = DMruntimeUtil.dumpByTables(hostip, dbname, username, password, tnames, filename); String cmd = "cd /opt/dameng/dmdbms/bin;" + dexpStr; result = DMruntimeUtil.execute(conn, cmd); } else if (copyType.equals("foreignLands")) { // sh dexplocal.sh test2 DEV.SYS_USER root@ip:/opt/data pwd 22 String cmd = "sh /opt/dameng/dmdbms/shelldata/dexphand.sh " + filename + " " + tnames + " " + user + "@" + ip + ":" + dir + " " + pwd + " " + port; result = DMruntimeUtil.execute(conn, cmd); } /* * HttpHeaders headers = new HttpHeaders(); * headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); * headers.setContentDispositionFormData("attachment", "eval.sql"); */ Map<String, Object> map = new HashMap<String, Object>(); if (result != null) { map.put("flag", true); } else { map.put("flag", false); map.put("msg", "备份失败!"); } return map; } /** * 手动备份 -- 全部备份 */ @RequestMapping("/dumpDB") @ResponseBody public Map<String, Object> dumpDataBase(String[] ids, String copyType, String ip, String port, String user, String pwd, String dir) { System.out.println("备份地点:" + copyType); String result = null; SjglSjbflbParam param = new SjglSjbflbParam(); param.setCjlx(copyType); // 获取服务器连接 if (ip != null && port != null && user != null && pwd != null && dir != null) { param.setIp(ip); param.setPort(port); param.setUsername(user); param.setRepassword(pwd); param.setDir(dir); } param.setBflx("1"); String filename = sjglSjbflbService.add(param);//保持备份记录,还原使用 Connection conn = DMruntimeUtil.login(userIp, userName, userPwd); // 本地备份 if (copyType.equals("local")) { String dexpStr = DMruntimeUtil.dumpDB(hostip, dbname, username, password, filename); String cmd = "cd /opt/dameng/dmdbms/bin;" + dexpStr; result = DMruntimeUtil.execute(conn, cmd); } else if (copyType.equals("foreignLands")) { String reurl = user + "@" + ip + ":" + dir; //方式1:运行命令 String cmd = DMruntimeUtil.foreignFullDumpDB(hostip, username, password, filename, reurl, pwd, port); //方式2:运行脚本 // String cmd = "sh /opt/dameng/dmdbms/shelldata/fulldexphand.sh " + filename + " " + user + "@" // + ip + ":" + dir + " " + pwd + " " + port; result = DMruntimeUtil.execute(conn, cmd); } Map<String, Object> map = new HashMap<String, Object>(); if (result != null) { map.put("flag", true); } else { map.put("flag", false); map.put("msg", "备份失败!"); } return map; } }

     工具类DMruntimeUtil

    import ch.ethz.ssh2.Session;
    import com.jcraft.jsch.*;
    import org.apache.commons.lang3.ArrayUtils;
    import org.apache.commons.lang3.StringUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import ch.ethz.ssh2.Connection;
    import ch.ethz.ssh2.StreamGobbler;
    
    import java.io.*;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    /**
     *工具类
     */
    public class DMruntimeUtil {
    
        private static final String DEFAULT_CHARSET = "utf-8";
    
        private static final  Logger LOGGER = LoggerFactory.getLogger(DMruntimeUtil.class);
    
        /**
         * 登录主机
         *
         * @return 登录成功返回true,否则返回false
         */
        public static Connection login(String ip, String userName, String userPwd) {
    
            boolean flg = false;
            Connection conn = null;
            try {
                conn = new Connection(ip);
                conn.connect();// 连接
                flg = conn.authenticateWithPassword(userName, userPwd);// 认证
                if (flg) {
                    LOGGER.info("=========登录成功=========" + conn);
                    return conn;
                }
            } catch (IOException e) {
                LOGGER.error("=========登录失败=========" + e.getMessage());
                e.printStackTrace();
            }
            return conn;
        }
    
        /**
         * 远程执行shll脚本或者命令
         *
         * @param cmd 即将执行的命令
         * @return 命令执行完后返回的结果值
         */
        public static String execute(Connection conn, String cmd) {
            String result = "";
            try {
                if (conn != null) {
                    Session session = conn.openSession();// 打开一个会话
                    session.execCommand(cmd);// 执行命令
                    result = processStdout(session.getStdout(), DEFAULT_CHARSET);
                    // 如果为得到标准输出为空,说明脚本执行出错了
                    if (StringUtils.isBlank(result)) {
                        LOGGER.info("得到标准输出为空,链接conn:" + conn + ",执行的命令:" + cmd);
                        result = processStdout(session.getStderr(), DEFAULT_CHARSET);
                    } else {
                        LOGGER.info("执行命令成功,链接conn:" + conn + ",执行的命令:" + cmd);
                    }
                    System.out.println(result);
                    conn.close();
                    session.close();
                }
            } catch (IOException e) {
                LOGGER.info("执行命令失败,链接conn:" + conn + ",执行的命令:" + cmd + "  " + e.getMessage());
                e.printStackTrace();
            }
            return result;
        }
      
     /**
         * 解析脚本执行返回的结果集
         *
         * @param in      输入流对象
         * @param charset 编码
         * @return 以纯文本的格式返回
         */
        private static String processStdout(InputStream in, String charset) {
            InputStream stdout = new StreamGobbler(in);
            StringBuffer buffer = new StringBuffer();
            ;
            try {
                BufferedReader br = new BufferedReader(new InputStreamReader(stdout, charset));
                String line = null;
                while ((line = br.readLine()) != null) {
                    buffer.append(line + "
    ");
                }
            } catch (UnsupportedEncodingException e) {
                LOGGER.error("解析脚本出错:" + e.getMessage());
                e.printStackTrace();
            } catch (IOException e) {
                LOGGER.error("解析脚本出错:" + e.getMessage());
                e.printStackTrace();
            }
            return buffer.toString();
        }
    
     /**
         * 同城-部分备份
         * 数据库的指定表(包括表结构与数据)
         *
         * @param hostip   数据库IP地址
         * @param dbName   数据库名称
         * @param username 用户名
         * @param password 密码
         * @param tables   待备份的表数组 ./dexp USERID=SYSDBA/SYSDBA@ip:port
         *                 FILE=db_str2.dmp LOG=db_str2.log TABLES=DEV.SYS_USER
         *                 DIRECTORY=/opt/dameng/dmdbms/dm7data/EVAL/dexp"
         */
        public static String dumpByTables(String hostip, String dbName, String username, String password, String tables,
                                          String name,String dexpFileUrl) {
            StringBuffer command = new StringBuffer("./dexp ");
            command.append("USERID=").append(username).append("/").append(password).append("@").append(hostip)
                    .append(" FILE=").append(name).append(".dmp ").append(" LOG=").append(name).append(".log ")
                    .append(" TABLES=").append(tables);
    
    //        int length = command.length();
            String newCommand = command.toString() + " DIRECTORY="+dexpFileUrl;
            System.out.println("命令=    " + newCommand);
            return newCommand;
        }
    
        /**
         * 同城-全部备份
         * 数据库(包括表结构与数据)
         *
         * @param hostip   数据库IP地址
         * @param dbName   数据库名称
         * @param username 用户名
         * @param password 密码
         *                 <p>
         *                 整个数据库导出 ./dexp USERID=SYSDBA/SYSDBA@ip:port
         *                 FILE=db_str2.dmp
         *                 DIRECTORY=/opt/dameng/dmdbms/dm7data/EVAL/dexp
         *                 LOG=db_str2.log FULL=Y
         */
        public static String dumpDB(String hostip, String dbName, String username, String password, String name,String dexpFileUrl) {
            StringBuffer command = new StringBuffer("./dexp ");
            command.append("USERID=").append(username).append("/").append(password).append("@").append(hostip)
                    .append(" FILE=").append(name).append(".dmp")
                    .append(" DIRECTORY=").append(dexpFileUrl)
                    .append(" LOG=").append(name).append(".log FULL=Y");
    
            System.out.println("命令=    " + command.toString());
            return command.toString();
        }
    
        /**
         * 异域--部分备份
         * @param hostip
         * @param username
         * @param password
         * @param name
         * @param reurl
         * @param pwd
         * @param port
         * @param installPath
         * @param dexpFileUrl
         * @return
         */
        public static String foreignDumpDB(String hostip, String username, String password,
                                           String name, String reurl, String pwd,
                                           String port, String installPath,String dexpFileUrl,String tables) {
            StringBuffer command = new StringBuffer("cd ");
            command.append(installPath).append(";")
                    .append("./dexp ").append("USERID=").append(username).append("/").append(password).append("@").append(hostip)
                    .append(" FILE=").append(name).append(".dmp")
                    .append(" DIRECTORY=").append(dexpFileUrl)
                    .append(" LOG=").append(name).append(".log ")
                    .append(" TABLES=").append(tables);
            return command.toString();
        }
    
    
        /**
         * 异域-全部备份
         *
         */
        public static String foreignFullDumpDB(String hostip, String username, String password, String name,
                                               String reurl, String pwd, String port,
                                               String installPath,String dexpFileUrl) {
            StringBuffer command = new StringBuffer("cd ");
            command.append(installPath).append(";")
                    .append("./dexp ").append("USERID=").append(username).append("/").append(password).append("@").append(hostip)
                    .append(" FILE=").append(name).append(".dmp")
                    .append(" DIRECTORY=").append(dexpFileUrl)
                    .append(" LOG=").append(name).append(".log FULL=Y;");
            return command.toString();
        }
    }
    
    
     
  • 相关阅读:
    编译错误error:&nbsp;invalid&amp;nbsp…
    移植OK6410&#039;S&nbsp;dm9000ae…
    JavaScript 正则表达式-严格匹配
    JavaScript indexOf() 方法
    JavaScript splice() 方法
    Css文字效果
    知识点-语句
    知识点—变量、运算符(表达式)
    WPF RichTextBox相关总结
    WPF调用图片路径,或资源图片
  • 原文地址:https://www.cnblogs.com/yjwww/p/12125802.html
Copyright © 2011-2022 走看看