{"id":383,"date":"2017-01-03T10:00:33","date_gmt":"2017-01-03T10:00:33","guid":{"rendered":"https:\/\/sqldoubleg.live-website.com\/?p=383"},"modified":"2017-12-02T20:05:00","modified_gmt":"2017-12-02T20:05:00","slug":"playing-with-azure-stretching-databases","status":"publish","type":"post","link":"https:\/\/www.sqldoubleg.com\/es\/2017\/01\/03\/playing-with-azure-stretching-databases\/","title":{"rendered":"Jugando con Azure, Extendiendo Bases de Datos a la nube"},"content":{"rendered":"<p>Nos guste o no, la nube est\u00e1 cada vez mas presente en nuestras vidas como DBAs, as\u00ed que creo que es buen momento para comprender algunas posibilidades que nos puede ofrecer.&nbsp;Ha pasado un tiempo desde mi \u00faltima publicaci\u00f3n, y quer\u00eda seguir explorando algunas de las nuevas caracter\u00edsticas que ofrece SQL Server 2016.<\/p>\n<p>Esto t\u00e9cnicamente no es nuevo, pero sabes que se dice que es mejor esperar una segunda (o tercera) versi\u00f3n de cualquier tecnolog\u00eda para adoptarlo, as\u00ed que me remangu\u00e9 y actualic\u00e9 mi suscripci\u00f3n a Azure para crear un entorno h\u00edbrido con partes (grupos de archivos) de mi base de datos en local y otras en la nube (almacenamiento blob).<\/p>\n<p>Estas t\u00e9cnicas se explican de alguna manera en <a href=\"https:\/\/msdn.microsoft.com\/library\/dn466438.aspx\" target=\"_blank\">Books online<\/a>, y aunque el ejemplo proporcionado se basa en la copia de seguridad y restauraci\u00f3n, los pasos para preparar las cosas son bastante similares, por lo que lo recomiendo encarecidamente como referencia.<\/p>\n<p>&nbsp;<br \/>\n<strong>Antecedentes<\/strong><\/p>\n<p>Para extender una base de datos de local a la nube (Azure) primero se requiere una suscripci\u00f3n de Azure (se puede obtener una con algo de dinero gratis en unos pocos minutos), que he explicado en otro <a href=\"https:\/\/sqldoubleg.live-website.com\/es\/2016\/09\/13\/t-sql-tuesday-82-my-first-steps-on-azure-database\/\" target=\"_blank\">blog post<\/a> no hace mucho, por lo que voy a saltar esta parte y asumiremos que ya ten\u00e9is una.<\/p>\n<p>Los archivos de base de datos se almacenan en Azure como blobs, por lo que necesitaremos crear una Cuenta de almacenamiento dentro de nuestra suscripci\u00f3n para poder colocar esos archivos de base de datos.<\/p>\n<p>El proceso para crear nuestra propia cuenta de almacenamiento es bastante simple, pod\u00e9is ver en la imagen d\u00f3nde hacer clic desde Azure Dashboard para hacerlo.<\/p>\n<p><a href=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2016\/12\/20161229_create_azure_storage_account.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2016\/12\/20161229_create_azure_storage_account.png\" alt=\"20161229_create_azure_storage_account\" width=\"1110\" height=\"850\" class=\"aligncenter size-full wp-image-384\" srcset=\"https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2016\/12\/20161229_create_azure_storage_account.png 1110w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2016\/12\/20161229_create_azure_storage_account-300x230.png 300w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2016\/12\/20161229_create_azure_storage_account-1024x784.png 1024w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2016\/12\/20161229_create_azure_storage_account-150x115.png 150w\" sizes=\"(max-width: 1110px) 100vw, 1110px\" \/><\/a><\/p>\n<p>En la columna de la derecha tenemos que tomar la decisi\u00f3n m\u00e1s importante, como cada vez que creamos algo en Azure, y esa es la pasta $$, perd\u00f3n, quer\u00eda decir el rendimiento y la disponibilidad \ud83d\ude42 <\/p>\n<p>Cuanto m\u00e1s rendimiento y disponibilidad necesitemos, m\u00e1s dinero se nos facturar\u00e1, as\u00ed que tened cuidado, pero recuerdad que pod\u00e9is (en teor\u00eda) incrementar o reducirlo sin tiempo de inactividad, para que podamos ajustar el rendimiento a nuestro presupuesto o viceversa.<\/p>\n<p>&nbsp;<br \/>\n<strong>Powershell<\/strong> <\/p>\n<p>Yo personalmente recomendar\u00eda usar PowerShell ya que es m\u00e1s f\u00e1cil (tan simple como copiar\/pegar y cambiar algunos valores) y tambi\u00e9n proporcionar\u00e1 la sintaxis para crear la credencial de SQL Server requerida, que se necesita para conectarse desde nuestro servidor SQL local a la instancia en la nube.<\/p>\n<p>Es posible que necesitemos instalar el <a href=\"https:\/\/docs.microsoft.com\/en-us\/powershell\/azureps-cmdlets-docs\/#step-1-install\" target=\"_blank\">m\u00f3dulo de PowerShell antes de ejecutar el script<\/a>.<\/p>\n<p>Despu\u00e9s de algunas modificaciones en el original, el script de powershell se ver\u00eda as\u00ed<\/p>\n<pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\r\n&lt;#   \r\nThis script uses the Azure Resource model and creates a new ARM storage account.  \r\nModify this script to use an existing ARM or classic storage account   \r\nusing the instructions in comments within this script  \r\n\r\nOriginal Script -&gt; https:\/\/msdn.microsoft.com\/en-us\/library\/dn466430.aspx\r\n\r\nModified by -&gt; Raul Gonzalez @SQLDoubleG\r\n\r\n#&gt;  \r\n# Define global variables for the script  \r\n#\r\n# TODO: Set values\r\n#\r\n$prefixName = 'prefixName'  # used as the prefix for the name for various objects, your choice\r\n$subscriptionName='My Subscription Name'   # the name  of subscription name you will use, look for subscriptions in your azure portal.\r\n$locationName = 'ukwest'  # the data center region you will use, see Get-AzureRmLocation for choices \r\n$storageAccountName= 'storageAccountName' # the storage account name you will create or use  \r\n$containerName= 'containerName'  # the storage container name to which you will attach the SAS policy with its SAS token  \r\n$policyName = $prefixName + 'policy' # the name of the SAS policy  \r\n\r\n# Storage Tier options, more money, more performance, see full details about pricing in \r\n# https:\/\/azure.microsoft.com\/en-us\/pricing\/details\/storage\/blobs\/\r\n#\r\n$storageType = 'Standard_LRS'   # cheap\r\n#$storageType = 'Standard_GRS'   # mid\r\n#$storageType = 'Standard_RAGRS' # expensive\r\n\r\n#   \r\n# Using Azure Resource Manager deployment model.\r\n# If you want to use the classic storage account, see original script on the header\r\n#  \r\n\r\n# Set a variable for the name of the resource group you will create or use  \r\n$resourceGroupName= 'blbstg'   \r\n\r\n# adds an authenticated Azure account for use in the session   \r\nLogin-AzureRmAccount   \r\n\r\n# set the tenant, subscription and environment for use in the rest of   \r\nSet-AzureRmContext -SubscriptionName $subscriptionName   \r\n\r\n# check the existance of the resource group and create one if it does not exist\r\nif (!(Get-AzureRmResourceGroup -Name $resourceGroupName)) {\r\n    New-AzureRmResourceGroup -Name $resourceGroupName -Location $locationName   \r\n}\r\n\r\n# check the existance of the ARM storage account and create one if it does not exist\r\nif (!(Get-AzureRmStorageAccount -Name $storageAccountName -ResourceGroupName $resourceGroupName)){\r\n    New-AzureRmStorageAccount -Name $storageAccountName -ResourceGroupName $resourceGroupName -Type $storageType -Location $locationName   \r\n}\r\n\r\n# Get the access keys for the ARM storage account  \r\n$accountKeys = Get-AzureRmStorageAccountKey -ResourceGroupName $resourceGroupName -Name $storageAccountName  \r\n\r\n# Create a new storage account context using an ARM storage account  \r\n$storageContext = New-AzureStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $accountKeys[0].Value \r\n\r\n$container = Get-AzureStorageContainer -Context $storageContext -Name $containerName\r\n# Creates a new container in blob storage if not exists\r\nif (!$container){\r\n    $container = New-AzureStorageContainer -Context $storageContext -Name $containerName \r\n}\r\n$cbc = $container.CloudBlobContainer  \r\n\r\n# Sets up a Stored Access Policy and a Shared Access Signature for the new container  \r\n$permissions = $cbc.GetPermissions();   \r\n$policy = new-object 'Microsoft.WindowsAzure.Storage.Blob.SharedAccessBlobPolicy'  \r\n$policy.SharedAccessStartTime = $(Get-Date).ToUniversalTime().AddMinutes(-5)  \r\n$policy.SharedAccessExpiryTime = $(Get-Date).ToUniversalTime().AddYears(10)  \r\n$policy.Permissions = &quot;Read,Write,List,Delete&quot;  \r\ntry{\r\n$permissions.SharedAccessPolicies.Add($policyName, $policy)  \r\n}\r\ncatch{\r\n    echo 'An item with the same key has already been added. Skipping this step.'\r\n}\r\n\r\n$cbc.SetPermissions($permissions);  \r\n\r\n# Gets the Shared Access Signature for the policy  \r\n$policy = new-object 'Microsoft.WindowsAzure.Storage.Blob.SharedAccessBlobPolicy'  \r\n$sas = $cbc.GetSharedAccessSignature($policy, $policyName)  \r\nWrite-Host 'Shared Access Signature= '$($sas.Substring(1))''  \r\n\r\n# Outputs the Transact SQL to the clipboard and to the screen to create the credential using the Shared Access Signature  \r\nWrite-Host 'Credential T-SQL'  \r\n$tSql = &quot;CREATE CREDENTIAL [{0}] WITH IDENTITY='Shared Access Signature', SECRET='{1}'&quot; -f $cbc.Uri,$sas.Substring(1)   \r\n$tSql | clip  \r\nWrite-Host $tSql  \r\n<\/pre>\n<p>&nbsp;<br \/>\n<strong>Crear la credencial<\/strong><\/p>\n<p>Si todo ha ido de acuerdo con el plan, ya deber\u00edamos tener copiado en el portapapeles el T-SQL para crear la credencial, que deber\u00eda verse como<\/p>\n<pre class=\"brush: tsql; title: ; notranslate\" title=\"\">\r\nUSE master\r\nGO\r\nCREATE CREDENTIAL 'https:\/\/&lt;mystorageaccountname&gt;.blob.core.windows.net\/&lt;mystorageaccountcontainername&gt;' -- this name must match the container path, start with https and must not contain a forward slash.  \r\n   WITH IDENTITY='SHARED ACCESS SIGNATURE' -- this is a mandatory string and do not change it.   \r\n   , SECRET = 'sharedaccesssignature' -- this is the shared access signature key that you by running the powershell script\r\nGO  \r\n\r\n<\/pre>\n<p>&nbsp;<br \/>\n<strong>Estirando nuestra base de datos<\/strong><\/p>\n<p>Si seguis el ejemplo proporcionado en Books Online, terminar\u00e9is restaurando una copia de vuestras bases de datos locales en la nube, pero en este ejemplo, para estirar mi base de datos voy a incluir una combinaci\u00f3n de archivos almacenados en local y algunos m\u00e1s en la nube, probablemente aquellos que no requieran mucha chicha.<\/p>\n<p>Una vez que estemos aqu\u00ed, esto deber\u00eda ser muy familiar para cualquier DBA.<\/p>\n<pre class=\"brush: tsql; title: ; notranslate\" title=\"\">\r\nCREATE DATABASE [stretch_test]\r\nON PRIMARY(\r\n\tNAME = N'st_primary'\r\n\t, FILENAME = 'C:\\Program Files\\Microsoft SQL Server\\MSSQL13.MSSQL2016\\MSSQL\\DATA\\stretch_test\\st_primary.mdf'\r\n\t, SIZE=5MB, FILEGROWTH = 4MB)\r\n, FILEGROUP [USER_DATA](\r\n\tNAME = N'st_user_data'\r\n\t, FILENAME = 'C:\\Program Files\\Microsoft SQL Server\\MSSQL13.MSSQL2016\\MSSQL\\DATA\\stretch_test\\st_user_data.ndf'\r\n\t, SIZE=4MB, FILEGROWTH = 4MB)\r\n, FILEGROUP [STRETCH_DATA]\r\n\t(NAME = N'st_stretch_data'\r\n\t, FILENAME = 'https:\/\/&lt;mystorageaccountname&gt;.blob.core.windows.net\/&lt;mystorageaccountcontainername&gt;\/st_stretch_data.ndf'\r\n\t, SIZE=4MB, FILEGROWTH = 4MB)\r\nLOG ON ( \r\n\tNAME = N'st_Log'\r\n\t, FILENAME = N'C:\\Program Files\\Microsoft SQL Server\\MSSQL13.MSSQL2016\\MSSQL\\DATA\\stretch_test\\st_log.ldf'\r\n\t, SIZE = 4MB , FILEGROWTH = 4MB )\r\nGO\r\n<\/pre>\n<p>Eso es casi lo mismo, pero solo apuntando a nuestro almacenamiento de blobs para colocar all\u00ed los archivos que entendemos que estar\u00e1n mejor en la nube.<\/p>\n<p>Si comprobamos los metadatos de la base de datos, todo parece normal<\/p>\n<pre class=\"brush: tsql; title: ; notranslate\" title=\"\">\r\nSELECT DB_NAME(f.database_id) AS db_name\r\n\t\t, f.file_id\r\n\t\t, f.name AS logical_name\r\n\t\t, FILEGROUP_NAME(f.data_space_id) AS [filegroup]\r\n\t\t, f.type_desc \r\n\t\t, (f.size * 8 \/ 1024) AS size_MB\r\n\t\t, physical_name\r\n\tFROM sys.master_files AS f\r\n\tWHERE f.database_id = DB_ID('stretch_test')\r\n\r\n<\/pre>\n<p><a href=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2016\/12\/02_database_files.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/sqldoubleg.live-website.com\/wp-content\/uploads\/2016\/12\/02_database_files.png\" alt=\"02_database_files\" width=\"1024\" height=\"175\" class=\"aligncenter size-full wp-image-385\" srcset=\"https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2016\/12\/02_database_files.png 1024w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2016\/12\/02_database_files-300x51.png 300w, https:\/\/www.sqldoubleg.com\/wp-content\/uploads\/2016\/12\/02_database_files-150x26.png 150w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>&nbsp;<br \/>\n<strong>Conclusi\u00f3n<\/strong><\/p>\n<p>Una vez m\u00e1s me he sorprendido de la rapidez con la que puedes empezar a utilizar Azure a la vieja usanza, quiero decir con solo un poco de conocimiento adicional, que siempre es algo bueno.<\/p>\n<p>Solo un peque\u00f1o cambio puede abrir m\u00faltiples posibilidades y traer beneficios como la reducci\u00f3n del costo de nuestro almacenamiento, mejorar nuestra disponibilidad sin gastar una fortuna en equipos sofisticados y mucho m\u00e1s.<\/p>\n<p>Realmente me est\u00e1 gustando esto y tengo ganas de explorar en m\u00e1s produndidad, porque tarde o temprano necesitaremos estar preparados para, tal vez no todos, pero seguro que algunos proyectos en la nube.<\/p>\n<p>\u00a1Gracias por leer!<\/p>\n<p>&nbsp;<br \/>\n<\/p>","protected":false},"excerpt":{"rendered":"<p>Nos guste o no, la nube est\u00e1 cada vez mas presente en nuestras vidas como DBAs, as\u00ed que creo que es buen momento para comprender algunas posibilidades que nos puede ofrecer.&nbsp;Ha pasado&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,21],"tags":[46,40,51,57,5],"_links":{"self":[{"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/posts\/383"}],"collection":[{"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/comments?post=383"}],"version-history":[{"count":1,"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/posts\/383\/revisions"}],"predecessor-version":[{"id":466,"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/posts\/383\/revisions\/466"}],"wp:attachment":[{"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/media?parent=383"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/categories?post=383"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqldoubleg.com\/es\/wp-json\/wp\/v2\/tags?post=383"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}