public override void ExecuteCommand() { if (!String.IsNullOrEmpty(DatabaseName)) { ConnectionString.InitialCatalog = DatabaseName; } Log.Info("Exporting {0} on {1} to {2}", ConnectionString.InitialCatalog, Util.GetDatabaseServerName(ConnectionString), DestinationStorage.Credentials.AccountName); string serverName = ConnectionString.DataSource; if (serverName.StartsWith("tcp:")) { serverName = serverName.Substring(4); } WASDImportExport.ImportExportHelper helper = new WASDImportExport.ImportExportHelper(Log) { EndPointUri = SqlDacEndpoint.AbsoluteUri, DatabaseName = ConnectionString.InitialCatalog, ServerName = serverName, UserName = ConnectionString.UserID, Password = ConnectionString.Password, StorageKey = Convert.ToBase64String(DestinationStorage.Credentials.ExportKey()) }; // Prep the blob string blobUrl = null; if (!WhatIf) { var client = DestinationStorage.CreateCloudBlobClient(); var container = client.GetContainerReference(DestinationContainer); container.CreateIfNotExists(); var blob = container.GetBlockBlobReference(ConnectionString.InitialCatalog + ".bacpac"); if (blob.Exists()) { Log.Info("Skipping export of {0} because the blob already exists", blob.Name); } else { Log.Info("Starting export to {0}", blob.Uri.AbsoluteUri); // Export! blobUrl = helper.DoExport(blob.Uri.AbsoluteUri, WhatIf); } } Log.Info("Export Complete"); }
public override void ExecuteCommand() { var destClient = DestinationStorage.CreateCloudBlobClient(); var destContainer = destClient.GetContainerReference(DestinationContainer); // Iterate through the blobs int index = 0; var blobs = Util.EnumerateBlobs(Log, destContainer, Prefix ?? String.Empty); Parallel.ForEach(blobs, new ParallelOptions() { MaxDegreeOfParallelism = 10 }, blob => { Interlocked.Increment(ref index); if (blob.CopyState.Status != CopyStatus.Pending) { DateTime start = DateTime.UtcNow; int counter = 0; while (blob.CopyState.Status == CopyStatus.Pending) { Thread.Sleep(1000); counter++; blob.FetchAttributes(); if (counter % 5 == 0) { Log.Info("{1}Waiting on {0} ...", blob.Name, counter > 5 ? "Still " : ""); } } if (counter > 2) { Log.Info("Copy of {0} has finished!", blob.Name); } } index++; }); Log.Info("{0} Copies Complete!", index); }
public override void ExecuteCommand() { var sourceClient = SourceStorage.CreateCloudBlobClient(); var sourceContainer = sourceClient.GetContainerReference(SourceContainer); if (!sourceContainer.Exists()) { Log.Warn("No blobs in container!"); return; } var destClient = DestinationStorage.CreateCloudBlobClient(); var destContainer = destClient.GetContainerReference(DestinationContainer); destContainer.CreateIfNotExists(); Log.Info("Collecting blob names in {0} to copy to {1}", SourceStorage.Credentials.AccountName, DestinationStorage.Credentials.AccountName); var blobs = Util.CollectBlobs( Log, sourceContainer, Prefix ?? String.Empty, condition: b => (!PackageBlobsOnly || (!b.Name.StartsWith("/") && String.Equals(b.Name.ToLowerInvariant(), b.Name, StringComparison.Ordinal))), countEstimate: 140000); var count = blobs.Count; int index = 0; Parallel.ForEach(blobs, new ParallelOptions { MaxDegreeOfParallelism = 10 }, blob => { int currentIndex = Interlocked.Increment(ref index); var percentage = (((double)currentIndex / (double)count) * 100); var destBlob = destContainer.GetBlockBlobReference(blob.Name); try { if (!destBlob.Exists() || Overwrite) { Log.Info("[{1:000000}/{2:000000}] ({3:000.00}%) Started Async Copy of {0}.", blob.Name, currentIndex, count, percentage); if (!WhatIf) { destBlob.StartCopyFromBlob(blob); } } else { Log.Info("[{1:000000}/{2:000000}] ({3:000.00}%) Skipped {0}. Blob already Exists", blob.Name, index, count, percentage); } } catch (StorageException stex) { if (stex.RequestInformation.HttpStatusCode == (int)HttpStatusCode.Conflict && stex.RequestInformation.ExtendedErrorInformation.ErrorCode == BlobErrorCodeStrings.PendingCopyOperation) { Log.Info("[{1:000000}/{2:000000}] ({3:000.00}%) Skipped {0}. Already being copied", blob.Name, index, count, percentage); } } catch (Exception ex) { Log.Error("Error processing {0}: {1}", blob.Name, ex.ToString()); throw; } }); Log.Info("Copies started. Run checkblobcopies with similar parameters to wait on blob copy completion"); }