c#调用达梦数据库dexp、dimp程序,实现数据备份功能
·
代码基于.net 8开发,达梦数据库为V8版本
代码实例
using System;
using System.Diagnostics;
using System.IO;
using System.Text;
namespace DmDmpTool
{
/// <summary>
/// 达梦 dexp 导出、dimp 导入工具类
/// </summary>
public class DmExpImpHelper
{
#region 配置属性
/// <summary>达梦bin目录,如D:\\dmdbms\\bin 或 /dmdbms/bin</summary>
public string DmBinPath { get; set; }
/// <summary>数据库地址</summary>
public string Host { get; set; } = "127.0.0.1";
/// <summary>达梦端口 默认5236</summary>
public int Port { get; set; } = 5236;
/// <summary>登录用户</summary>
public string User { get; set; }
/// <summary>登录密码</summary>
public string Pwd { get; set; }
#endregion
/// <summary>
/// 执行外部命令通用方法
/// </summary>
/// <param name="exeName">dexp.exe / dimp.exe</param>
/// <param name="args">命令参数</param>
/// <param name="outLog">输出日志</param>
/// <returns>true执行成功,false失败</returns>
private bool RunCommand(string exeName, string args, out string outLog)
{
outLog = string.Empty;
StringBuilder logSb = new StringBuilder();
// 拼接完整程序路径
string fullExePath = Path.Combine(DmBinPath, exeName);
if (!File.Exists(fullExePath))
{
outLog = $"工具不存在:{fullExePath}";
return false;
}
Process process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = fullExePath,
Arguments = args,
CreateNoWindow = true, // 不弹出黑窗口
UseShellExecute = false,
RedirectStandardOutput = true, // 捕获标准输出
RedirectStandardError = true, // 捕获错误输出
StandardOutputEncoding = Encoding.GetEncoding("GB2312"), // Windows中文
StandardErrorEncoding = Encoding.GetEncoding("GB2312")
}
};
process.OutputDataReceived += (s, e) =>
{
if (!string.IsNullOrEmpty(e.Data)) logSb.AppendLine(e.Data);
};
process.ErrorDataReceived += (s, e) =>
{
if (!string.IsNullOrEmpty(e.Data)) logSb.AppendLine($"【ERROR】{e.Data}");
};
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit(); // 阻塞等待执行完成
outLog = logSb.ToString();
return process.ExitCode == 0;
}
#region 导出 dexp
/// <summary>
/// 全库导出
/// </summary>
/// <param name="dmpFilePath">dmp完整路径</param>
/// <param name="logPath">导出日志路径</param>
/// <param name="compress">是否压缩</param>
/// <param name="log">执行输出日志</param>
public bool ExportFullDb(string dmpFilePath, string logPath, bool compress = true, out string log)
{
string userId = $"{User}/{Pwd}@{Host}:{Port}";
StringBuilder argSb = new StringBuilder();
argSb.Append($"USERID={userId} ");
argSb.Append($"FILE=\"{dmpFilePath}\" ");
argSb.Append($"LOG=\"{logPath}\" ");
argSb.Append("FULL=Y ");
if (compress) argSb.Append("COMPRESS=Y ");
string exe = IsLinux() ? "dexp" : "dexp.exe";
return RunCommand(exe, argSb.ToString(), out log);
}
/// <summary>
/// 按用户导出(单schema)
/// </summary>
public bool ExportByOwner(string owner, string dmpFilePath, string logPath, out string log)
{
string userId = $"{User}/{Pwd}@{Host}:{Port}";
string args = $"USERID={userId} FILE=\"{dmpFilePath}\" LOG=\"{logPath}\" OWNER={owner} COMPRESS=Y";
string exe = IsLinux() ? "dexp" : "dexp.exe";
return RunCommand(exe, args, out log);
}
/// <summary>
/// 指定表导出
/// </summary>
public bool ExportByTables(string[] tables, string dmpFilePath, string logPath, out string log)
{
string tableStr = string.Join(",", tables);
string userId = $"{User}/{Pwd}@{Host}:{Port}";
string args = $"USERID={userId} FILE=\"{dmpFilePath}\" LOG=\"{logPath}\" TABLES={tableStr} ";
string exe = IsLinux() ? "dexp" : "dexp.exe";
return RunCommand(exe, args, out log);
}
#endregion
#region 导入 dimp
/// <summary>
/// 全库导入
/// </summary>
public bool ImportFullDb(string dmpFilePath, string logPath, bool ignoreExist = true, out string log)
{
string userId = $"{User}/{Pwd}@{Host}:{Port}";
StringBuilder argSb = new StringBuilder();
argSb.Append($"USERID={userId} ");
argSb.Append($"FILE=\"{dmpFilePath}\" ");
argSb.Append($"LOG=\"{logPath}\" ");
argSb.Append("FULL=Y ");
argSb.Append("TAVBLE_EXISTS_ACTION=REPLACE ");
if (ignoreExist) argSb.Append("IGNORE=Y ");
string exe = IsLinux() ? "dimp" : "dimp.exe";
return RunCommand(exe, argSb.ToString(), out log);
}
/// <summary>
/// 导入指定用户,支持schema映射(原用户→新用户)
/// </summary>
public bool ImportRemapSchema(string sourceOwner, string targetOwner, string dmpFilePath, string logPath, out string log)
{
string userId = $"{User}/{Pwd}@{Host}:{Port}";
string args = $"USERID={userId} FILE=\"{dmpFilePath}\" LOG=\"{logPath}\" REMAP_SCHEMA={sourceOwner}:{targetOwner} IGNORE=Y";
string exe = IsLinux() ? "dimp" : "dimp.exe";
return RunCommand(exe, args, out log);
}
#endregion
/// <summary>判断系统是否Linux</summary>
private bool IsLinux()
{
return Environment.OSVersion.Platform == PlatformID.Unix ||
Environment.OSVersion.Platform == PlatformID.MacOSX;
}
}
}
class Program
{
static void Main(string[] args)
{
var dmTool = new DmExpImpHelper
{
DmBinPath = @"D:\dmdbms\bin",
Host = "127.0.0.1",
Port = 5236,
User = "",
Pwd = ""
};
// 1. 全库导出
string dmpFile = @"D:\backup\dm_full.dmp";
string logFile = @"D:\backup\export.log";
bool expResult = dmTool.ExportFullDb(dmpFile, logFile, true, out string expLog);
Console.WriteLine("导出日志:\r\n" + expLog);
if (expResult)
Console.WriteLine("导出成功!");
else
Console.WriteLine("导出失败!");
// 2. 导入全库
string impLog = @"D:\backup\import.log";
bool impResult = dmTool.ImportFullDb(dmpFile, impLog, true, out string impOutLog);
Console.WriteLine("导入日志:\r\n" + impOutLog);
}
}
更多推荐
所有评论(0)