Beispiel #1
0
        /// <summary>
        /// Execute backup
        /// </summary>
        public override void Execute()
        {
            this.backup             = new Backup();
            this.backup.Database    = this.backupInfo.DatabaseName;
            this.backup.Action      = this.backupActionType;
            this.backup.Incremental = this.isBackupIncremental;
            this.SetBackupProps();

            try
            {
                if (this.backup.Action == BackupActionType.Files)
                {
                    IDictionaryEnumerator filegroupEnumerator = this.backupInfo.SelectedFileGroup.GetEnumerator();
                    filegroupEnumerator.Reset();
                    while (filegroupEnumerator.MoveNext())
                    {
                        string currentKey = Convert.ToString(filegroupEnumerator.Key,
                                                             System.Globalization.CultureInfo.InvariantCulture);
                        string currentValue = Convert.ToString(filegroupEnumerator.Value,
                                                               System.Globalization.CultureInfo.InvariantCulture);
                        if (currentKey.IndexOf(",", StringComparison.Ordinal) < 0)
                        {
                            // is a file group
                            this.backup.DatabaseFileGroups.Add(currentValue);
                        }
                        else
                        {
                            // is a file
                            int idx = currentValue.IndexOf(".", StringComparison.Ordinal);
                            currentValue = currentValue.Substring(idx + 1, currentValue.Length - idx - 1);
                            this.backup.DatabaseFiles.Add(currentValue);
                        }
                    }
                }

                this.backup.BackupSetName = this.backupInfo.BackupsetName;

                for (int i = 0; i < this.backupInfo.BackupPathList.Count; i++)
                {
                    string destName   = Convert.ToString(this.backupInfo.BackupPathList[i], System.Globalization.CultureInfo.InvariantCulture);
                    int    deviceType = (int)(this.backupInfo.BackupPathDevices[destName]);
                    switch (deviceType)
                    {
                    case (int)DeviceType.LogicalDevice:
                        int backupDeviceType =
                            GetDeviceType(Convert.ToString(destName,
                                                           System.Globalization.CultureInfo.InvariantCulture));

                        if (this.backupDeviceType == BackupDeviceType.Disk && backupDeviceType == constDeviceTypeFile)
                        {
                            this.backup.Devices.AddDevice(destName, DeviceType.LogicalDevice);
                        }
                        break;

                    case (int)DeviceType.File:
                        if (this.backupDeviceType == BackupDeviceType.Disk)
                        {
                            this.backup.Devices.AddDevice(destName, DeviceType.File);
                        }
                        break;
                    }
                }

                this.backup.CopyOnly           = this.backupInfo.IsCopyOnly;
                this.backup.FormatMedia        = this.backupInfo.FormatMedia;
                this.backup.Initialize         = this.backupInfo.Initialize;
                this.backup.SkipTapeHeader     = this.backupInfo.SkipTapeHeader;
                this.backup.Checksum           = this.backupInfo.Checksum;
                this.backup.ContinueAfterError = this.backupInfo.ContinueAfterError;

                if (!string.IsNullOrEmpty(this.backupInfo.MediaName))
                {
                    this.backup.MediaName = this.backupInfo.MediaName;
                }

                if (!string.IsNullOrEmpty(this.backupInfo.MediaDescription))
                {
                    this.backup.MediaDescription = this.backupInfo.MediaDescription;
                }

                if (this.backupInfo.TailLogBackup &&
                    !this.backupRestoreUtil.IsHADRDatabase(this.backupInfo.DatabaseName) &&
                    !this.backupRestoreUtil.IsMirroringEnabled(this.backupInfo.DatabaseName))
                {
                    this.backup.NoRecovery = true;
                }

                if (this.backupInfo.LogTruncation)
                {
                    this.backup.LogTruncation = BackupTruncateLogType.Truncate;
                }
                else
                {
                    this.backup.LogTruncation = BackupTruncateLogType.NoTruncate;
                }

                if (!string.IsNullOrEmpty(this.backupInfo.BackupSetDescription))
                {
                    this.backup.BackupSetDescription = this.backupInfo.BackupSetDescription;
                }

                if (this.backupInfo.RetainDays >= 0)
                {
                    this.backup.RetainDays = this.backupInfo.RetainDays;
                }
                else
                {
                    this.backup.ExpirationDate = this.backupInfo.ExpirationDate;
                }

                this.backup.CompressionOption = (BackupCompressionOptions)this.backupInfo.CompressionOption;

                if (!string.IsNullOrEmpty(this.backupInfo.EncryptorName))
                {
                    this.backup.EncryptionOption = new BackupEncryptionOptions((BackupEncryptionAlgorithm)this.backupInfo.EncryptionAlgorithm,
                                                                               (BackupEncryptorType)this.backupInfo.EncryptorType,
                                                                               this.backupInfo.EncryptorName);
                }

                if (this.dataContainer.Server.ConnectionContext != null)
                {
                    // Execute backup
                    this.backup.SqlBackup(this.dataContainer.Server);

                    // Verify backup if required
                    if (this.backupInfo.VerifyBackupRequired)
                    {
                        Restore restore = new Restore();
                        restore.Devices.AddRange(this.backup.Devices);
                        restore.Database = this.backup.Database;

                        string errorMessage = null;
                        restore.SqlVerifyLatest(this.dataContainer.Server, out errorMessage);
                        if (errorMessage != null)
                        {
                            throw new DisasterRecoveryException(errorMessage);
                        }
                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
        }