zoukankan      html  css  js  c++  java
  • 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备份,备份可直接执行语句,也可以执行批处理文件,看你自己的喜好了~~~

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

  • 相关阅读:
    第一章
    第一章 计算机系统漫游
    hihocoder #1014 : Trie树
    第一章
    来个小目标
    poj 1056 IMMEDIATE DECODABILITY
    poj 2001 Shortest Prefixes
    __name__ 指示模块应如何被加载
    Python 常用函数time.strftime()简介
    CentOS安装beEF做XSS平台
  • 原文地址:https://www.cnblogs.com/sguozeng/p/5238817.html
Copyright © 2011-2022 走看看