سؤال

لدي SQL 2008 DB. أقوم بتشغيل نموذج يدعم أنه DB UP، ثم يحاول تحديثه. إذا فشل التحديث الفكرة هي استعادة تلك النسخة الاحتياطية. هنا هو الرمز الذي أستخدمه لاستعادة النسخ الاحتياطي.

public void RestoreDatabase(String databaseName, String backUpFile, String serverName, String userName, String password)
{
    Restore sqlRestore = new Restore();
    BackupDeviceItem deviceItem = new BackupDeviceItem(backUpFile, DeviceType.File);
    sqlRestore.Devices.Add(deviceItem);
    sqlRestore.Database = databaseName;
    ServerConnection connection = new ServerConnection(serverName, userName, password);
    Server sqlServer = new Server(connection);
    sqlRestore.Action = RestoreActionType.Database;

    string logFile = System.IO.Path.GetDirectoryName(backUpFile);
    logFile = System.IO.Path.Combine(logFile, databaseName + "_Log.ldf");

    string dataFile = System.IO.Path.GetDirectoryName(backUpFile);
    dataFile = System.IO.Path.Combine(dataFile, databaseName + ".mdf");

    Database db = sqlServer.Databases[databaseName];
    RelocateFile rf = new RelocateFile(databaseName, dataFile);
    sqlRestore.RelocateFiles.Add(new RelocateFile(databaseName, dataFile));
    sqlRestore.RelocateFiles.Add(new RelocateFile(databaseName + "_log", logFile));
    sqlRestore.SqlRestore(sqlServer);
    db = sqlServer.Databases[databaseName];
    db.SetOnline();
    sqlServer.Refresh();
}

يبدو أن المشكلة هي أن أسماء الملفات التي اخترتها تختلف عن DB عبر الإنترنت. أريد أساسا استبدال قاعدة البيانات على الخادم مع النسخة الاحتياطية. أحصل على استثناء عند استدعاء Sqlrestore.

الاستثناء الرئيسي يقول

{"استعادة فشل في خادم" الخادم "."}

يظهر الحفر في الاستثناءات الداخلية هذه الأخطاء

حدث استثناء أثناء تنفيذ عبارة أو دفعة SQL Transact-SQL.

وثم

الملف المنطقي "DB" ليس جزءا من قاعدة البيانات "DB". استخدم استعادة Filelistonly لسرد أسماء الملفات المنطقية. r Nrestore قاعدة البيانات تنتهي بشكل غير طبيعي.

أفترض أن هناك طريقة لمعرفة هذا فقط للاستخدام استبدال DB الحالي كما هو.

يمكنني استخدام هذا القليل من التعليمات البرمجية للحصول على مسار ملف DB لإجراء دليل لتفريغ النسخة الاحتياطية. ربما يمكن استخدام هذا للحصول على أسماء الملفات لإعادة إنشاء.

public string GetDBFilePath(String databaseName, String userName, String password, String serverName)
{
    ServerConnection connection = new ServerConnection(serverName, userName, password);
    Server sqlServer = new Server(connection);
    Database db = sqlServer.Databases[databaseName];
    return sqlServer.Databases[databaseName].PrimaryFilePath;
}
هل كانت مفيدة؟

المحلول

لقد غيرت احتياطي واستعادة الوظائف لتبدو كهذا:

public void BackupDatabase(SqlConnectionStringBuilder csb, string destinationPath)
{
    ServerConnection connection = new ServerConnection(csb.DataSource, csb.UserID, csb.Password);
    Server sqlServer = new Server(connection);

    Backup bkpDatabase = new Backup();
    bkpDatabase.Action = BackupActionType.Database;
    bkpDatabase.Database = csb.InitialCatalog;
    BackupDeviceItem bkpDevice = new BackupDeviceItem(destinationPath, DeviceType.File);
    bkpDatabase.Devices.Add(bkpDevice);
    bkpDatabase.SqlBackup(sqlServer);
    connection.Disconnect();

}

public void RestoreDatabase(String databaseName, String backUpFile, String serverName, String userName, String password)
{
    ServerConnection connection = new ServerConnection(serverName, userName, password);
    Server sqlServer = new Server(connection);
    Restore rstDatabase = new Restore();
    rstDatabase.Action = RestoreActionType.Database;
    rstDatabase.Database = databaseName;
    BackupDeviceItem bkpDevice = new BackupDeviceItem(backUpFile, DeviceType.File);
    rstDatabase.Devices.Add(bkpDevice);
    rstDatabase.ReplaceDatabase = true;
    rstDatabase.SqlRestore(sqlServer);
}

بهذه الطريقة التي يستخدمونها فقط أي ملفات هناك. لم تعد هناك وتوجيهات لنقل الملفات.

نصائح أخرى

شكرا remus لإجابتك!

لقد تعديلت

sqlRestore.RelocateFiles.Add(new RelocateFile(databaseName, dataFileLocation));
sqlRestore.RelocateFiles.Add(new RelocateFile(databaseName + "_log", logFileLocation)); 

هذين السطرين ل

System.Data.DataTable logicalRestoreFiles = sqlRestore.ReadFileList(sqlServer);
sqlRestore.RelocateFiles.Add(new RelocateFile(logicalRestoreFiles.Rows[0][0].ToString(), dataFileLocation));
sqlRestore.RelocateFiles.Add(new RelocateFile(logicalRestoreFiles.Rows[1][0].ToString(), logFileLocation));

وتشغيل التعليمات البرمجية بنجاح.

شكرا على الدعم!

أنت تضيف RelocateFile خيارات بناء على اسم قاعدة البيانات، وهذا غير صحيح. يجب عليك إضافتها بناء على اسم الملف المنطقي لكل ملف يتم نقله. يستخدم Restore.ReadFileList لاسترداد قائمة أسماء الملفات المنطقية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top