达梦数据库备份-手动备份

本系列文章用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: 39.98.218.179
    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 [email protected]:/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 hostip        数据IP地址
     * @param dbName        数据库名称
     * @param username      用户名
     * @param password      密码
     * @param excludeTables 待去除的指定表数组
     */
    public static String dumpByExcludeTables(String hostip, String dbName, String username, String password,
                                             String[] excludeTables) {
        if (ArrayUtils.isEmpty(excludeTables)) {
            return null;
        }

        StringBuffer result = new StringBuffer();

        StringBuffer command = new StringBuffer("dmdump ");
        command.append(" -u").append(username).append(" -p").append(password).append(" -h").append(hostip).append(" ")
                .append(dbName).append(" --ignore-table=");

        // 遍历表数组
        for (String table : excludeTables) {
            command.append(dbName).append(".").append(table).append(",");
        }

        return command.toString();

    }

    /**
     * 备份数据库的指定表(包括表结构与数据)
     *
     * @param hostip   数据库IP地址
     * @param dbName   数据库名称
     * @param username 用户名
     * @param password 密码
     * @param tables   待备份的表数组 ./dexp USERID=SYSDBA/[email protected]:52996
     *                 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) {
        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=/opt/dameng/dmdbms/dm7data/EVAL/dexp";
        System.out.println("命令=    " + newCommand);
        return newCommand;
    }

    /**
     * 备份数据库(包括表结构与数据)
     *
     * @param hostip   数据库IP地址
     * @param dbName   数据库名称
     * @param username 用户名
     * @param password 密码
     *                 <p>
     *                 整个数据库导出 ./dexp USERID=SYSDBA/[email protected]:52996
     *                 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) {
        StringBuffer command = new StringBuffer("./dexp ");
        command.append("USERID=").append(username).append("/").append(password).append("@").append(hostip)
                .append(" FILE=").append(name).append(".dmp")
                .append(" DIRECTORY=/opt/dameng/dmdbms/dm7data/EVAL/dexp")
                .append(" LOG=").append(name).append(".log FULL=Y");

        System.out.println("命令=    " + command.toString());
        return command.toString();
    }

    /**
     * 异域全部导出
     *
     * @Author: Shaoyy
     * @Date: 2019/11/1
     */
    public static String foreignFullDumpDB(String hostip, String username, String password, String name, String reurl, String pwd, String port) {
        StringBuffer command = new StringBuffer("cd /opt/dameng/dmdbms/bin;");
        command.append("./dexp ").append("USERID=").append(username).append("/").append(password).append("@").append(hostip)
                .append(" FILE=").append(name).append(".dmp")
                .append(" DIRECTORY=/opt/dameng/dmdbms/dm7data/EVAL/dexp")
                .append(" LOG=").append(name).append(".log FULL=Y;")
                .append("sshpass -p ").append(pwd).append(" scp -P ").append(port)
                .append(" /opt/dameng/dmdbms/dm7data/EVAL/dexp/").append(name).append(".dmp ")
                .append(reurl).append("/").append(name).append(".dmp");
        return command.toString();
    }

    public static String dimpByTables(String hostip, String dbName, String username, String password, String name,
                                      String tnames) {
        // ./dimp USERID=SYSDBA/SYSDBA FILE=/mnt/data/dexp/db_str.dmp LOG=db_str.log
        // DIRECTORY=/mnt/data/dimp
        StringBuffer command = new StringBuffer("./dimp ");
        Date date = new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
        String str = dateFormat.format(date);
        String[] names = name.split("T");
        command.append("USERID=").append(username).append("/").append(password).append("@").append(hostip)
                .append(" FILE=/opt/dameng/dmdbms/dm7data/EVAL/dexp/").append(name).append(" LOG=").append(names[0])
                .append(str).append(".log").append(" TABLES=").append(tnames).append(" DIRECTORY=")
                .append("/opt/dameng/dmdbms/dm7data/EVAL/dimp ignore=y TABLE_EXISTS_ACTION=TRUNCATE");

        String newCommand = command.toString();
        System.out.println("命令=    " + newCommand);
        return newCommand;
    }

}

原文地址:https://www.cnblogs.com/yjwww/p/12125802.html

时间: 2024-08-29 05:15:13

达梦数据库备份-手动备份的相关文章

达梦数据库备份实操

达梦数据库备份方式:物理备份,逻辑备份 物理备份冷备:(dmap服务打开的状态下,数据库是关闭的)热备:(dmap服务一定是打开的,数据库是打开的,数据库要开归档) 逻辑备份导入导出:dexp dimp集群:数据守护(dw),DSC (RAC)达梦支持第三方的备份工具:如第三方备份一体机 备份首先要开归档SQL> alter database mount; #mount状态SQL> alter database add archivelog 'type=local,dest=/dm7/arch

达梦数据库的备份和还原

达梦数据库的备份和还原 达梦数据库的备份还原方式:物理备份还原和逻辑备份还原物理备份:冷备:(dmap服务打开的状态下,数据库是关闭的)热备:(dmap服务一定是打开的,数据库是打开的,数据库要开归档)物理备份还原是对数据库的操作系统物理文件(如数据文件.控制文件和日志文件等)的备份还原. 逻辑备份:导出:dexp导入:dimp逻辑导出和逻辑导入数据库对象分为四种级别:数据库级.用户级.模式级和表级.四种级别独立互斥,不能同时存在.四种级别所提供的功能: ? 数据库级(FULL):导出或导入整个

Linux平台达梦数据库V7单实例安装方式之静默方式

一 前言 我们在学习任何一个应用时,了解它的最初步骤通常是学会如何进行安装配置,后序才去关心如何使用,学习达梦数据库也是如此,而达梦数据库的安装提供了多种方式,接下来会一一介绍每种安装方式,达梦数据库支持多个操作系统平台的安装,本篇主要介绍Linux平台下的静默方式安装. 二 安装需求 2.1 硬件需求 用户应根据 DM 及应用系统的需求来选择合适的硬件配置,如 CPU 的指标.内存及磁盘容量等.档次一般应尽可能高一些,尤其是作为数据库服务器的机器,基于 Java 的程序运行时最好有较大的内存.

达梦数据库(第一部分)

达梦数据库相关的操作 1. 安装步骤 1.1下载达梦安装包,下载完成之后解压,双击setup.exe,得到如下图所示,语言和时区默认为"简体中文"."中国标准时间",点击"确定": 1.2进入安装向导,点击"开始",如下图: 1.3进入许可证协议,选择"我接受",点击"下一步",如下图: 1.4进入组件版本信息界面,点击"下一步",如下图: 1.5进入上传key文件界

[转帖]达梦数据库(DM6)和ORACLE 10g的异同点

达梦数据库(DM6)和ORACLE 10g的异同点    https://bbs.aliyun.com/detail/351337.html 花花浪子 级别: 小白 发帖 0 云币 -41 加关注 写私信 只看楼主 更多操作楼主  发表于: 2017-03-24 比较惭愧,在当上本版版主后一直没有贡献一篇有营养的帖子,由于手上正好有达梦数据 DM6的版本,加上对ORACLE 10G比较熟悉,所以就这2种数据库的异同点做一个对比,也请大家不吝赐教. 对于达梦数据库,因为目前的工作是DBA,主要是对

Linux平台达梦数据库V7单实例安装方式之图形方式

一 前言 我们在学习任何一个应用时,了解它的最初步骤通常是学会如何进行安装配置,后序才去关心如何使用,学习达梦数据库也是如此,而达梦数据库的安装提供了多种方式,接下来会一一介绍每种安装方式,达梦数据库支持多个操作系统平台的安装,本篇主要介绍Linux平台下的图形方式安装. 二 安装需求 2.1 硬件需求 用户应根据 DM 及应用系统的需求来选择合适的硬件配置,如 CPU 的指标.内存及磁盘容量等.档次一般应尽可能高一些,尤其是作为数据库服务器的机器,基于 Java 的程序运行时最好有较大的内存.

达梦数据库的用户管理

达梦数据库的用户管理 安装完达成梦数据库,系统默认会自带有一些系统级的用户:1.sys -----达梦数据库内置管理用户,不能登录数据库,数据库使用的大部分的数据字典和动态性能视图sys.2.Sysdba -----数据库的管理员3.Sysauditor---审计用户4.Syssso---安全用户 在达梦数据库里每一个用户都有一个默认的表空间,对于 SYS.SYSSSO.SYSAUDITOR 系统用户,默认的用户表空间是 SYSTEM,SYSDBA 的默认表空间为 MAIN,新创建的用户如果没有

达梦数据库的问题随手记--持续更新

达梦数据库的问题随手记 这篇主要是记录在操作达梦数据库过程中出现的问题随手做记录,有些问题是刚开始不熟悉原因乱操作导致的,部分问题因为各种原因没详细研究,部分问题已经处理有做了描述. 20191016安装时提示法执行二进制文件 /tmp/DMInstall/install/install_zh_UTF.sh:行334: /tmp/DMInstall/source/jdk/bin/java: 无法执行二进制文件 继续执行后还是有提示错误,如下: 原因:是DM7版本不匹配.针对泰山服务器,要用arm

达梦数据库的初始运用

用命令方式建立数据库 在达梦的bin目录下使用dminit ./dminit path=/dm7/data db_name=DM01 instance_name=EST port_num=5327 达梦数据库的状态 4种状态 shutdown mount open suspend 状态切换 shutdown -- mount shutdown -- open open -- mount 查看状态 select status$ from v$instance; 启动数据库 方式一 在达梦安装bin