Frage

Ich habe ein Dutzend verschiedene Blogs lesen, sowie durch die Msdn Beispiele zu lesen und sie arbeiten nicht nur für mich.

Schließlich, was ich versuche, ein DB aus unserer Produktion Instanz unserer dev Instanz bewegen, oder die anderen Richtung zu tun automatisieren wird.

Der Ansatz, den ich gemacht habe, ist also:

  1. Backup / Restore in einem temporären DB
  2. lösen Temp DB
  3. Kopie MDF- und LDF-Dateien auf die andere Instanz
  4. wieder an.

Ich bin fest auf 1, und ich kann nicht verstehen, warum. Alles, was ich habe Ansprüche lesen sollte funktionieren.

Hinweis: Ich habe festgelegt dbName dem db ich wiederherstellen möchten. Ich habe auch festgelegt restore.Database = dbName, wo restore ist eine Instanz der Klasse Restore im smo Namespace.

mdf.LogicalFileName = dbName;
mdf.PhysicalFileName = String.Format(@"{0}\{1}.mdf", server.Information.MasterDBPath, dbName);
ldf.LogicalFileName = dbName + "_log";
ldf.PhysicalFileName = String.Format(@"{0}\{1}.ldf", server.Information.MasterDBPath, dbName);

restore.RelocateFiles.Add(mdf);
restore.RelocateFiles.Add(ldf);
restore.SqlRestore(server);

Das ist die Ausnahme, die ich bin immer:

  

Die Datei 'D: \ MSSQL.MIQ_Dev \ MSSQL.2 \ MSSQL \ Data \ MIQDesign2Detach.mdf' können nicht überschrieben werden. Es wird von der Datenbank ‚MIQDesignTest2‘ verwendet.
  Die Datei 'MIQDesign' kann nicht auf 'D: \ MSSQL.MIQ_Dev \ MSSQL.2 \ MSSQL \ Data \ MIQDesign2Detach.mdf' wiederhergestellt werden. Verwenden Sie WITH MOVE einen gültigen Speicherort für die Datei zu identifizieren.
  Die Datei 'D: \ MSSQL.MIQ_Dev \ MSSQL.2 \ MSSQL \ Data \ MIQDesign2Detach.ldf' können nicht überschrieben werden. Es wird von der Datenbank ‚MIQDesignTest2‘ verwendet.
  Die Datei 'MIQDesign_log' kann nicht auf 'D: \ MSSQL.MIQ_Dev \ MSSQL.2 \ MSSQL \ Data \ MIQDesign2Detach.ldf' gestellt werden. Verwenden Sie WITH MOVE einen gültigen Speicherort für die Datei zu identifizieren.
  Probleme wurden identifiziert, während für die RESTORE-Anweisung Planung. Vorherige Nachrichten nähere Angaben.
  RESTORE DATABASE wird nicht normal beendet.

Warum versucht dies die ursprüngliche MDF- zu überschreiben? Sind das nicht die RelocateFiles Sachen sollen angeben, dass Sie es zu einem gespeichert werden sollen andere physischer Dateiname?

War es hilfreich?

Lösung

Ich lief in ein ähnliches Problem und ich fand diese Lösung sehr hilfreich sein.

Werfen Sie einen Blick - http: // www. eggheadcafe.com/software/aspnet/32188436/smorestore-database-name-change.aspx

Andere Tipps

Es ist funktioniert.

public class DatabaseManager
{
    public Action<int, string> OnSqlBackupPercentComplete;
    public Action<int, string> OnSqlRestorePercentComplete;
    public Action<SqlError> OnSqlBackupComplete;
    public Action<SqlError> OnSqlRestoreComplete;

    public bool IsConnected { get; private set; }

    private ServerConnection _connection;

    public void Connect(string userName, string password, string serverName, bool useInteratedLogin)
    {
        if (useInteratedLogin)
        {
            var sqlCon = new SqlConnection(string.Format("Data Source={0}; Integrated Security=True; Connection Timeout=5", serverName));
            _connection = new ServerConnection(sqlCon);
            _connection.Connect();
            IsConnected = true;
        }
        else
        {
            _connection = new ServerConnection(serverName, userName, password);
            _connection.ConnectTimeout = 5000;
            _connection.Connect();
            IsConnected = true;
        }

    }

    public void BackupDatabase(string databaseName, string destinationPath)
    {
        var sqlServer = new Server(_connection);


        databaseName = databaseName.Replace("[", "").Replace("]", "");
        var sqlBackup = new Backup
            {
                Action = BackupActionType.Database,
                BackupSetDescription = "ArchiveDataBase:" + DateTime.Now.ToShortDateString(),
                BackupSetName = "Archive",
                Database = databaseName
            };

        var deviceItem = new BackupDeviceItem(destinationPath, DeviceType.File);

        sqlBackup.Initialize = true;
        sqlBackup.Checksum = true;
        sqlBackup.ContinueAfterError = true;

        sqlBackup.Devices.Add(deviceItem);
        sqlBackup.Incremental = false;
        sqlBackup.ExpirationDate = DateTime.Now.AddDays(3);

        sqlBackup.LogTruncation = BackupTruncateLogType.Truncate;
        sqlBackup.PercentCompleteNotification = 10;
        sqlBackup.PercentComplete += (sender, e) => OnSqlBackupPercentComplete(e.Percent, e.Message);
        sqlBackup.Complete += (sender, e) => OnSqlBackupComplete(e.Error);
        sqlBackup.FormatMedia = false;
        sqlBackup.SqlBackup(sqlServer);


    }

    public DatabaseCollection GetDatabasesList()
    {
        if (IsConnected)
        {
            var sqlServer = new Server(_connection);
            return sqlServer.Databases;
        }
        return null;
    }



    public void RestoreDatabase(string databaseName, string filePath)
    {
        var sqlServer = new Server(_connection);

        databaseName = databaseName.Replace("[", "").Replace("]", "");

        var sqlRestore = new Restore();
        sqlRestore.PercentCompleteNotification = 10;
        sqlRestore.PercentComplete += (sender, e) => OnSqlRestorePercentComplete(e.Percent, e.Message);
        sqlRestore.Complete += (sender, e) => OnSqlRestoreComplete(e.Error);

        var deviceItem = new BackupDeviceItem(filePath, DeviceType.File);
        sqlRestore.Devices.Add(deviceItem);
        sqlRestore.Database = databaseName;

        DataTable dtFileList = sqlRestore.ReadFileList(sqlServer);

        int lastIndexOf = dtFileList.Rows[1][1].ToString().LastIndexOf(@"\");
        string physicalName = dtFileList.Rows[1][1].ToString().Substring(0, lastIndexOf + 1);
        string dbLogicalName = dtFileList.Rows[0][0].ToString();
        string dbPhysicalName = physicalName + databaseName + ".mdf";
        string logLogicalName = dtFileList.Rows[1][0].ToString();
        string logPhysicalName = physicalName + databaseName + "_log.ldf";
        sqlRestore.RelocateFiles.Add(new RelocateFile(dbLogicalName, dbPhysicalName));
        sqlRestore.RelocateFiles.Add(new RelocateFile(logLogicalName, logPhysicalName));

        sqlServer.KillAllProcesses(sqlRestore.Database);

        Database db = sqlServer.Databases[databaseName];
        if (db != null)
        {
            db.DatabaseOptions.UserAccess = DatabaseUserAccess.Single;
            db.Alter(TerminationClause.RollbackTransactionsImmediately);
            sqlServer.DetachDatabase(sqlRestore.Database, false);
        }

        sqlRestore.Action = RestoreActionType.Database;
        sqlRestore.ReplaceDatabase = true;

        sqlRestore.SqlRestore(sqlServer);
        db = sqlServer.Databases[databaseName];
        db.SetOnline();
        sqlServer.Refresh();
        db.DatabaseOptions.UserAccess = DatabaseUserAccess.Multiple;
    }

    public void Disconnect()
    {
        if (IsConnected)
            _connection.Disconnect();

        IsConnected = false;
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top