C#oracle备份和还原
最近公司的oracle备份工具不好使了,原来是公司的人用VB写的,由于我是主攻C#的,所以想着自己来写一个C#版本的oracle备份和还原工具。
一开始,我按照原来的设计思路来进行编写,想在plussql或者cmd中测试好备份的sql语句,然后开始编写程序。
网上说了一大推关于C#备份oracle的例子,但大多数我觉得都不好使,因为本人测试了很多,都是渣渣~~~~~(虽然我水平也不高。。)
网上说的不外乎用C#来调用windows自带的cmd程序来进行,但是会出现一个问题,就是C#调用cmd程序后,你会发现,怎么样都写不进参数,也看不到结果,而且处理不好,经常会出现“假死”的现象,我问过公司的同事,他们建议我写好批处理,然后调用cmd,执行(最终证明不可行,因为批处理还是要调用cmd程序)
无意中,发现,原来oracle自带的就有备份和还原的工具。如果你安装了oracle的服务端的话,你可以查看目录文件下面的BIN文件下,有两个exe程序,一个是exp.exe,另一个是imp.exe这两个就是备份和还原的工具。手工调用cmd备份时,其实也是调用的这个程序,于是,为何不在C#直接调用呢。
经过一番测试,终于搞出来了~~~
好了,上实例:
//调用oracle exp.exe来备份数据 private void OracleBackUp() { string tables = ""; string sql = "select * from all_users where username like '%_" + LocalMark.Text.Trim().ToUpper() + "'"; using (OracleCommand oracom = new OracleCommand(sql, orclConnection())) { oracom.Connection.Open(); using (OracleDataReader reader = oracom.ExecuteReader()) { while (reader.Read()) { tables += string.IsNullOrEmpty(reader.GetString(reader.GetOrdinal("username"))) ? "" : reader.GetString(reader.GetOrdinal("username")).ToUpper() + ","; } } } tables = tables.Substring(0, tables.Length - 1); //记录备份的所有方案名到一个txt中,为后面的还原做准备 string paths = ExpPath.Text + "\\" + System.DateTime.Today.ToString("yyyyMMdd") + ".txt"; if (!File.Exists(ExpPath.Text +"\\"+ System.DateTime.Today.ToString("yyyyMMdd") + ".txt")) { FileInfo myfile = new FileInfo(ExpPath.Text+"\\"+ System.DateTime.Today.ToString("yyyyMMdd") + ".txt"); FileStream fs = myfile.Create(); fs.Close(); } FileStream afile = new FileStream(ExpPath.Text + "\\" + System.DateTime.Today.ToString("yyyyMMdd") + ".txt", FileMode.OpenOrCreate); StreamWriter sm = new StreamWriter(afile); String[]tabArr=tables.Split(','); foreach(string s in tabArr) { sm.WriteLine(s); sm.Flush();//清除缓冲区 } sm.Close(); //创建一个进程实例 Process p = new Process(); //生成备份文件的文件名称 string filename = ExpPath.Text+"\\" + System.DateTime.Today.ToString("yyyyMMdd") + ".dmp"; string logname = ExpPath.Text+"\\" + System.DateTime.Today.ToString("yyyyMMdd") + ".log"; //导出程序路径 p.StartInfo.FileName = "D:\\app\\loracle\\product\\11.2.0\\dbhome_1\\BIN\\exp.exe"; //启用操作系统外壳程序执行 p.StartInfo.UseShellExecute = true; //显示dos窗口执行过程 p.StartInfo.CreateNoWindow = false; //执行参数用户名和密码还有本机配置的Oracle服务名[kdtc/bjdscoal@tns:orcl file=" + filename + ] // p.StartInfo.Arguments = "system/system@orcl file=" + filename+" owner=HYMGS_SYSINFO_NULL"; p.StartInfo.Arguments = "system/system@orcl file=" + filename + " owner=(" + tables+") log="+logname; p.Start(); p.Dispose(); } //获取要备份的表名 public string GetTables() { string tables = ""; string sql = "select * from all_users where username like '%_" + LocalMark.Text.Trim().ToUpper() + "'"; using (OracleCommand oracom = new OracleCommand(sql, orclConnection())) { oracom.Connection.Open(); using (OracleDataReader reader = oracom.ExecuteReader()) { while (reader.Read()) { tables += string.IsNullOrEmpty(reader.GetString(reader.GetOrdinal("username"))) ? "" : reader.GetString(reader.GetOrdinal("username")).ToUpper()+","; } } } tables = tables.Substring(0, tables.Length - 1); return tables; }
//查询所有后缀为指定后缀的数据库 public void SelectLocalMark() { //生成一个批处理文件 string batpath=Application.StartupPath+"\\back.bat"; string batfile = "back.bat"; if (!File.Exists(batpath)) { FileInfo myinfo = new FileInfo(batpath); FileStream fs = myinfo.Create(); fs.Close(); } //FileInfo myfiles = new FileInfo(batpath); string expstr = ""; string sql = "select * from all_users where username like '%_"+LocalMark.Text.Trim().ToUpper()+"'"; using (OracleCommand cmd = new OracleCommand(sql, orclConnection())) { cmd.Connection.Open(); using (OracleDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { //expstr = "exp " + UserName.Text.Trim() + "/" + Pwd.Text.Trim() + "@" + ServiceName.Text.Trim() + " file=" + dmpPath + "\\back.dmp log=" + dmpPath + "\\back.log owner=" + reader.GetString(reader.GetOrdinal("username")).ToUpper(); ////CMD(expstr); //执行备份语句 ////把备份语句写入批处理文件 //StreamWriter sm = new StreamWriter(batpath); //sm.WriteLine(expstr); //sm.WriteLine("exit"); //sm.Flush(); //sm.Close(); } } } CMD(batfile); }
上面是我做好的备份实例,测试过,完全通过,其中可能涉及到界面上的一些参数的获取和我具体要求的代码,但核心部分就是调用exp.exe备份,备份可直接执行语句,也可以执行批处理文件,看你自己的喜好了~~~
上述实例为个人实例代码,请勿随意转载~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律