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();
}