[성현모] TRA Recovery Tool 추가

This commit is contained in:
SHM
2025-04-17 08:00:44 +09:00
parent 3eeb27cb31
commit 0b69c113ec
15 changed files with 1009 additions and 20 deletions

View File

@ -0,0 +1,211 @@
using DevExpress.Internal.WinApi.Windows.UI.Notifications;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Security.Policy;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace SystemX.Product.CP.RecoveryTool
{
public partial class Form1 : Form
{
string mdfFile = string.Empty;
string ldfFile = string.Empty;
string recoveryName = string.Empty;
public Form1()
{
InitializeComponent();
SelectDBList();
lbAttachResult.Text = string.Empty;
}
private void btnSelectDb_Click(object sender, EventArgs e)
{
mdfFile = string.Empty;
ldfFile = string.Empty;
recoveryName = string.Empty;
textRecoveryName.Text = string.Empty;
using (OpenFileDialog dialog = new OpenFileDialog())
{
dialog.Filter = "*.mdf|*.mdf";
if (dialog.ShowDialog() == DialogResult.OK)
{
mdfFile = dialog.FileName;
string ldfName = $"{Path.GetFileNameWithoutExtension(dialog.FileName)}_log.ldf";
ldfFile = $@"{Path.GetDirectoryName(dialog.FileName)}\{ldfName}";
}
textMdf.Text = mdfFile; //mdf
textLdf.Text = ldfFile; //ldf
}
}
private void btnAttach_Click(object sender, EventArgs e)
{
string error = "success";
if (File.Exists(mdfFile) == true)
ledMdf.BackColor = Color.Lime;
else
{
ledMdf.BackColor = Color.Red;
error = "Invalid FIle";
}
if (File.Exists(ldfFile) == true)
ledLdf.BackColor = Color.Lime;
else
{
ledLdf.BackColor = Color.Red;
error = "Invalid FIle";
}
recoveryName = textRecoveryName.Text;
if (string.IsNullOrEmpty(recoveryName) == false)
ledLdf.BackColor = Color.Lime;
else
{
ledLdf.BackColor = Color.Red;
error = "Invalid RecoveryName";
}
lbAttachResult.Text = error;
if (error == "success")
{
string attachError = Attach(mdfFile, ldfFile, recoveryName);
if (string.IsNullOrEmpty(attachError) == false)
{
lbAttachResult.ForeColor = Color.Red;
lbAttachResult.Text = attachError;
}
else
lbAttachResult.ForeColor = Color.Lime;
}
else
lbAttachResult.ForeColor = Color.Red;
SelectDBList();
}
private string Attach(string mdfFile, string ldfFile, string attachName)
{
string error = string.Empty;
// 프로세스 설정
string command = $" -S localhost -U alis -P Kefico!@34 -Q \"CREATE DATABASE {attachName} ON (FILENAME = '{mdfFile}'), (FILENAME = '{ldfFile}') FOR ATTACH;\"";
Console.WriteLine(command);
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = $"sqlcmd", // cmd.exe로 명령어 실행
Arguments = $"{command}", // /c는 명령어 실행 후 종료하는 옵션
RedirectStandardOutput = true, // 표준 출력 리디렉션
RedirectStandardError = true, // 표준 오류 리디렉션
UseShellExecute = false, // 셸을 사용하지 않도록 설정
CreateNoWindow = true // 새 창을 열지 않도록 설정,
};
// 프로세스 실행
using (Process process = Process.Start(startInfo))
{
if (process != null)
{
// 출력 결과를 읽기
string output = process.StandardOutput.ReadToEnd();
string response = process.StandardError.ReadToEnd();
Console.WriteLine(output);
Console.WriteLine(response);
error = output;
}
}
return error;
}
private void Detach(string dbName)
{
// 프로세스 설정
string command = $" -S localhost -U alis -P Kefico!@34 -Q \"ALTER DATABASE [{dbName}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; EXEC sp_detach_db '{dbName}';\"";
Console.WriteLine(command);
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = $"sqlcmd", // cmd.exe로 명령어 실행
Arguments = $"{command}", // /c는 명령어 실행 후 종료하는 옵션
RedirectStandardOutput = true, // 표준 출력 리디렉션
RedirectStandardError = true, // 표준 오류 리디렉션
UseShellExecute = false, // 셸을 사용하지 않도록 설정
CreateNoWindow = true // 새 창을 열지 않도록 설정,
};
// 프로세스 실행
using (Process process = Process.Start(startInfo))
{
if (process != null)
{
// 출력 결과를 읽기
string output = process.StandardOutput.ReadToEnd();
string response = process.StandardError.ReadToEnd();
Console.WriteLine(output);
Console.WriteLine(response);
}
}
}
private void SelectDBList()
{
//delay
DateTime start = DateTime.Now;
while(true)
{
if (DateTime.Now - start >= TimeSpan.FromMilliseconds(1000))
break;
Thread.Sleep(10);
}
gridDB.Rows.Clear();
var connMain = new SqlConnection("server=127.0.0.1,1433;uid=alis;password=Kefico!@34;");
connMain.Open();
SqlCommand SQLCmd = new SqlCommand("select name from sys.databases with(nolock) where owner_sid != 0x01;", connMain);
SQLCmd.CommandType = CommandType.Text;
DbDataReader dtReader = SQLCmd.ExecuteReader();
DataTable dtResult = new DataTable();
dtResult.Load(dtReader);
List<string> list = dtResult?.AsEnumerable()?.Select(x => x.ItemArray?.First()?.ToString())?.ToList();
foreach(var db in list)
{
gridDB.Rows.Add(gridDB.Rows.Count + 1, db, "Remove");
}
}
private void gridDB_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
//remove button
if (e.ColumnIndex == 2)
{
var dbName = gridDB.Rows[e.RowIndex].Cells[1].Value.ToString();
Detach(dbName);
SelectDBList();
}
}
}
}