Tôi có một SQL 2008 DB. Tôi đang chạy một hình thức sao lưu DB đó, sau đó cố gắng cập nhật nó. Nếu cập nhật thất bại, ý tưởng là khôi phục bản sao lưu đó. Đây là mã tôi đang sử dụng để khôi phục bản sao lưu.Cách khôi phục cơ sở dữ liệu từ C#
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();
}
Vấn đề dường như là tên tệp tôi chọn khác với DB trực tuyến. Về cơ bản tôi muốn thay thế cơ sở dữ liệu trên máy chủ bằng bản sao lưu. Tôi nhận được một ngoại lệ khi tôi gọi SqlRestore.
Ngoại lệ chính nói
{ "Khôi phục thất bại cho Server 'localhost'."}
Đào vào trường hợp ngoại lệ bên trong cho thấy các lỗi
Một ngoại lệ xảy ra trong khi thực hiện câu lệnh hoặc lệnh Transact-SQL.
và sau đó
tập tin logic 'DB' không phải là một phần của cơ sở dữ liệu 'DB'. Sử dụng RESTORE FILELISTONLY để liệt kê tệp hợp lệ tên. \ R \ nRESTORE DATABASE là chấm dứt bất thường.
Tôi giả sử có một số cách để nói điều này chỉ sử dụng thay thế DB hiện tại như hiện tại.
Tôi sử dụng bit mã này để lấy đường dẫn tệp của DB để có thư mục để sao lưu. Có lẽ điều này có thể được sử dụng để có được tên tập tin để tạo lại.
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;
}
Bạn không cần phải di chuyển tệp nếu bạn khôi phục từ bản sao lưu của cùng một db trên cùng một máy.Việc di dời chỉ cần thiết khi di chuyển và sao chép cơ sở dữ liệu thông qua sao lưu/phục hồi. –
Ok, ở đây một số mẹo: liên quan đến đường dẫn tệp sao lưu luôn chú ý nếu tệp thực sự tồn tại trên thư mục nguồn của bạn. Về việc di dời, có thể là vấn đề về quyền để viết tệp mdf. Chú ý nếu ứng dụng của bạn có quyền đọc tệp .bak, trong trường hợp này, hãy kiểm tra Trình quản lý cấu hình SQL: Dịch vụ MSSQLServer phải đang chạy dưới người dùng LocalSystem. –