天天看點

C#oracle還原imp執行個體

C#來做oracle還原,調用oracle自帶函數imp.exe時,需要注意的是:
1、imp.exe 中fromuser 和touser兩個關鍵字; fromuser與exp.exe中的owner對應,為表的所有者,都可以是多個參數,如:fromuser=(A,B,C)
2、imp.exe 進行恢複資料庫時,要确定一下恢複使用者(方案)的表空間,一般預設為users空間
3、在擷取到表空間權限後,要對使用者進行恢複權限設定,主要是對表空間的限制,一般處理:grant  unlimited tablespace to user(自己的使用者)
4、程式中設定了oracle服務端的exp和imp的路徑
注意:在C#做備份和還原的時候,都是調用的oracle伺服器的自帶函數
    在用程序來調用備份和還原時,備份完成和結束後,要進行程序釋放。
 

//開始恢複資料庫
        private void button1_Click(object sender, EventArgs e)
        {

            string tables = "";

            //建立要還原的方案
                //從備份的方案中讀取
                FileStream fs=new FileStream (textBox6.Text,FileMode.Open);
                StreamReader smread=new StreamReader(fs);
                smread.BaseStream.Seek(0,SeekOrigin.Begin);
                string strLine = "";
                string backusers = "";
                while ((strLine=smread.ReadLine()) != null)
                {
                    backusers += strLine + ",";
                }

                if (backusers.Length > 0)
                {
                    backusers = backusers.Substring(0, backusers.Length - 1);
                    tables = backusers;
                }
                String[]userArr=backusers.Split(',');
                string sqluser="";
                String[] marks;
                string newtables = "";
                using (OracleConnection oracon = orclConnection())
                {
                    try
                    {
                        oracon.Open();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("連結資料庫錯誤,錯誤原因:"+ex.Message.ToString());
                    }
                    using (OracleTransaction tran = oracon.BeginTransaction())
                    {
                        using (OracleCommand com = new OracleCommand())
                        {
                            com.Transaction = tran;

                            string newuser = "";
                            com.Connection = oracon;
                            //com.Connection.Open();
                           
                            foreach (string s in userArr)
                            {
                                newuser = s;
                              
                                //判斷是否按照預設的辨別進行還原
                                if (!checkBox1.Checked)//不預設
                                {
                                    newuser = "";
                                    //tables = "";
                                    //修改還原的方案名稱字尾(辨別)
                                    marks = s.Split('_');
                                    //修改辨別
                                    marks[marks.Count() - 1] = textBox2.Text.ToUpper();
                                    foreach (string mark in marks)
                                    {
                                        newuser += mark + "_";
                                    }
                                    newuser = newuser.Substring(0, newuser.Length - 1);
                                    newtables += newuser + ",";
                                }

                                com.CommandText = "Select count(*) from all_users where username='" + newuser + "'";
                                int i = Convert.ToInt32(com.ExecuteScalar());

                                //如果存在,删除後還原
                                if (i > 0)
                                {
                                    sqluser = "drop user "+newuser+" cascade";
                                 
                                    com.CommandText = sqluser;
                                    try
                                    {
                                        com.ExecuteNonQuery();
                                        com.CommandText =  "create user " + newuser + " identified by " + newuser + " default tablespace users";
                                        com.ExecuteNonQuery();
                                    }
                                    catch (Exception ex)
                                    {
                                        MessageBox.Show(ex.Message);
                                        tran.Rollback();
                                    }
                                }


                                if (i == 0)
                                {
                                    sqluser = "create user " + newuser + " identified by " + newuser+" default tablespace users";
                                    com.CommandText = sqluser;
                                    try
                                    {
                                        com.ExecuteNonQuery();           
                                    }
                                    catch (Exception ex)
                                    {
                                        MessageBox.Show(ex.Message);
                                        tran.Rollback();
                                    }
                                }

                                sqluser = "grant connect,resource,dba to " + newuser;
                                com.CommandText = sqluser;
                                com.ExecuteNonQuery();

                                sqluser = "alter user system quota unlimited on users" ;
                                com.CommandText = sqluser;
                                com.ExecuteNonQuery();

                                //指定還原的方案為還原預設的表空間
                                sqluser = "grant unlimited tablespace to "+newuser ;
                                com.CommandText = sqluser;
                                com.ExecuteNonQuery();
                            }

                            if (!checkBox1.Checked)
                            {
                                tables = newtables.Substring(0, newtables.Length - 1);
                            }
                            tran.Commit();
                        }
                    }
                }
                
            //}



            string filename = textBox5.Text;//恢複檔案路徑
            //導入程式路徑
            Process p = new Process();
            //p.StartInfo.FileName= "D:\\app\\oracle\\product\\11.2.0\\dbhome_1\\BIN\\imp.exe";
            p.StartInfo.FileName = System.Configuration.ConfigurationSettings.AppSettings["pathrestroe"].ToString();
            p.StartInfo.UseShellExecute = true;
            p.StartInfo.CreateNoWindow = false;
            p.StartInfo.Arguments = "system/system@orcl file=" + filename + " fromuser=("+backusers+") touser=(" +tables+ ") ignore=y" ;
            //p.StartInfo.Arguments = "system/system@orcl file=" + filename + " fromuser=HYGISTK_CONTROLLINE_ZL2  touser=HYGISTK_CONTROLLINE_ZL ignore=y";
            p.Start();
            p.WaitForExit();
            p.Dispose();
        }