最近公司的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(, tables.Length - ); //记录备份的所有方案名到一个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(, tables.Length - );
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备份,备份可直接执行语句,也可以执行批处理文件,看你自己的喜好了~~~

上述实例为个人实例代码,请勿随意转载~

C#oracle备份和还原的更多相关文章

  1. Oracle 备份与还原

    oracle 备份与还原 一.备份数据库(exp) 1.完全备份 exp demo/demo@orcl buffer=1024 file=d:\back.dmp full=y demo:用户名.密码 ...

  2. oracle 备份与还原 及相关操作

    drop user 用户名 cascade; ........删除用户 create user 用户名 identified by 密码 default tablespace 数据文件名 tempor ...

  3. oracle备份与还原(导入导出)

    Oracle数据导入导出imp/exp 功能:Oracle数据导入导出imp/exp相当于oracle数据还原与备份.说明:大多情况都可以用Oracle数据导入导出完成数据的备份和还原(不会造成数据的 ...

  4. oracle备份与还原数据

    一.表数据备份与还原 creat table  备份表   select * from  原表  where insert  into  原表  select  *  from  备份表 二.利用备份 ...

  5. oracle 备份和还原还有创建用户、表空间、授权

    --找到存放dbf文件的路径--E:\oracle\product\10.2.0\oradata\orcl--可以通过此语句进行查询select * from v$datafile; --创建表空间c ...

  6. oracle备份、还原

    ----第一步:设置空表导出 ----由于Oracle 11G在用EXPORT导出时,空表不能导出.解决方法如下:(11G中有个新特性,当表无数据时,不分配segment,以节省空间) select ...

  7. Oracle备份、还原数据库

    备份数据库 创建备份目录(用sys账号),若已创建备份目录,此步可忽略 create directory db_bak as 'D:\ ECIMS_DB' --查看创建的目录 select * fro ...

  8. oracle备份和还原

    用exp命令即可完成,但要看具体的备份方式. 1. 导出一个完整数据库 exp system/manager file=bible_db log=dible_db full=y 2. 导出数据库定义而 ...

  9. oracle数据泵备份与还原

    完整的常用的一套oracle备份以及还原方案 --在新库中新建数据目录,我没有特别说明在哪执行的语句都可在plsql中执行 CREATE OR REPLACE DIRECTORY dump_dir A ...

随机推荐

  1. webrtc 学习资源1

    1,http://www.webrtc.org/  webrtc官网,神马编译,神马下载,这里的解决方案才是最权威的. --------------------------------- 2,http ...

  2. (转)使用cygwin注意事项一

    原文出处:http://gotgit.readthedocs.io/en/latest/01-meet-git/050-install-on-windows-cygwin.html 在Windows下 ...

  3. pcieport 0000:00:1c.5: PCIe Bus Error

    进入Linux系统 root身份 编辑/etc/default/grub GRUB_CMDLINE_LINUX_DEFAULT="quiet" 将quiet改为 pci=nomsi ...

  4. CSS:CSS 选择器参考手册

    ylbtech-CSS:CSS 选择器参考手册 1.返回顶部 1. 我们会定期对 W3School 的 CSS 参考手册进行浏览器测试. CSS3 选择器 在 CSS 中,选择器是一种模式,用于选择需 ...

  5. ascall文件和二进制文件

    ascall文件可以打开让我们看你们的具体内容. 二进制文件打开我们看到的就是一堆乱码. ascall在换行时不同的平台不一样: windows上面用  \r\n linux上面用 \n 二进制的内容 ...

  6. hibernate的优缺点和适用场合

    Hibernate优点: 1.对象化.人员以面相对象的思想来操作数据库.Hibernate支持许多面向对象的特性,如组合,继承,多态等. 2.更好的移植性.对于不同的数据库,开发者只需要使用相同的数据 ...

  7. U盘安装 Linux 显示 “Faild to copy file from CD-ROM”

    解决方案 使用 UltraISO 刻录 U盘做镜像时,出现这种情况.查阅别人的 blog,尝试手动挂载发现还是不能成功.然后使用 win32diskimager 重新刻录,再次安装时未出现该情况. 参 ...

  8. Interval query

    题意: 给出数轴上的N个区间,M个询问"QUERY(a, b)", 意为[a, b]之间不相交的集合的最大数量是多少. 解法: 考虑 $O(n)$ 的贪心做法,预处理出对于每一个位 ...

  9. dockerfile创建镜像(二)

    ENTRYPOINT 两种格式: ENTRYPOINT [“executable”, “param1”, “param2”] ENTRYPOINT command param1 param2 (she ...

  10. Flutter实战视频-移动电商-09.首页_项目结构建立和获取数据

    09.首页_项目结构建立和获取数据 在config下创建service_url.dart 用来配置我们后端接口的配置文件 一个变量存 接口地址,一个接口方法地址 所有后天请求数据的方法都放在这个文件夹 ...