sábado, 20 de julio de 2013

Migrar Managed Metadata entre ambientes (Migrate Managed Metadata to diferrent enviroments) Sharepoint 2013

Antes de iniciar el proceso de migrado, repasaremos algunos conceptos.

La administración de los managed metadata se realiza con Term Store Management Tool, la cual es accesible desde el central Administration o desde el Site Collection.

Un término (Term) es una palabra o frase que puede asociarse a un elemento de SharePoint Server 2013. Un conjunto de términos (Term Set) es una colección de términos relacionados. Se puede especificar que una columna contenga un término de un determinado conjunto de términos. Los metadatos administrados (Managed Metadata) son un modo de indicar que los términos y los conjuntos de términos se pueden crear y administrar independientemente de las propias columnas.

Los conjuntos de términos locales (Local Term Sets) se crean en el contexto de una colección de sitios. Por ejemplo, si se agrega una columna a una lista en una biblioteca de documentos y se crea un nuevo conjunto de términos para enlazar la columna, el nuevo conjunto de términos es local para la colección de sitios que contiene la biblioteca de documentos.

Los conjuntos de términos globales (Global Term Set) se crean fuera del contexto de una colección de sitios. Por ejemplo, el administrador del almacén de términos puede crear un grupo de conjunto de términos denominado "Recursos humanos" y designar a una persona para que lo administre. El administrador del grupo podría crear conjuntos de términos relacionados con recursos humanos, como cargos y categorías salariales en el grupo de conjunto de términos Recursos humanos.

image

Los usuarios pueden ver solo los conjuntos de términos globales y los conjuntos de términos locales de la colección de sitios del usuario.

Groups

Los grupos representan límites en el governance de la taxonomía. Múltiples grupos pueden ser creados dentro de un Managed Metadata Service, cada grupo puede tener múltiples Terms Sets.

image

 

Term Sets

Uno o más Term Sets (hasta 1,000) son definidos dentro de un Group. Term Sets pueden ser creados manualmente o importados a través de la interface . Ej: Company

image

 

Terms

Palabras individuales o frases son agregadas a un Term Set. Un máximo de 30,000 términos pueden ser agregados a un simple Term Set.

image

A continuación explicaré los pasos para migrar la metadata de un ambiente (DEV) a otro (PRD).

El servicio de Managed Metadata se llama “Managed Metadata Service”

image

Cuando se migra un site (site collection) de un ambiente a otro, la managed metadata no es migrada, requiere realizar algunos pasos para que quede consistente la migración.

Hay dos posibilidades para migrar un site collection entre ambientes Export (http://technet.microsoft.com/en-us/library/ee428301.aspx) o Backup (http://technet.microsoft.com/en-us/library/ee748617.aspx).

La operación mediante el Export/Import genera un nuevo GUID para cada objeto en el ambiente de PRD, en cambio Backup/Restore preserva los GUID.

La metadata puede ser exportada (en DEV) mediante powershell o vía UI, pero cuando se importa en el nuevo ambiente (PRD) Sharepoint genera nuevos GUID´s para los términos importados, y por lo cual queda inconsistente el ambiente (las columnas de metadata apuntan a un GUID que no existe).

Para mantener la consistencia haremos uso de dos comandos: Export-SPMetadataWebServicePartitionData, Import-SPMetadataWebServicePartitionData

1- Crear un Shared en el servidor de SQL Server de Sharepoint (eso se debe a que Sharepoint trata de importar los archivos .bak al servidor de SQL Server para poder importar los Term Set). A continuación exportar la partición de metadata. Ejecutar este script en el servidor del ambiente de DEV

Add-PSSnapin Microsoft.SharePoint.PowerShell -erroraction SilentlyContinue 
$proxyName = "Managed Metadata Service Proxy"
$serviceName = "Managed Metadata Service"
$filePath = "\\NombreServerSQLServer\TermStore\terms.bak"
$svc = Get-SPServiceApplication | ?{$_.TypeName -eq "Managed Metadata Service" -and $_.DisplayName -eq $serviceName}
Export
-SPMetadataWebServicePartitionData $svc.Id -ServiceProxy $proxyName -Path $filePath

2- Importar el archivo .bak en el servidor de PRD. Ejecuta este script en el servidor de PRD. Supongo que tienen el mismo nombre el servicio de Managed Metadata.


Add-PSSnapin Microsoft.SharePoint.PowerShell -erroraction SilentlyContinue 
$proxyName = "Managed Metadata Service Proxy"
$serviceName = "Managed Metadata Service"
$filePath = "\\NombreServerSQLServer\TermStore\terms.bak"
$svc = Get-SPServiceApplication | ?{$_.TypeName -eq "Managed Metadata Service" -and $_.DisplayName -eq $serviceName}
Import
-SPMetadataWebServicePartitionData $svc.Id -ServiceProxy $proxyName -Path $filePath -OverwriteExisting

En el caso que se haya utilizado Backup/Restore debería haber quedado correctamente configurado la managed metadata, ya que se mantuvo el GUID del sitio, y los GUID de la metadata.


En el caso que se haya utilizado Export/Import, tendrás que realizar un par de pasos más para que los ambientes queden consistentes.


Supongo que el sitio en DEV se llamaba http://DEVserver/sites/sitecollection, y en PRD se llama http://PRDserver/sites/sitecollection.


Para verificar que se hay importado correctamente la partición de metadata, con sus grupos asociados puedo usar el siguiente comando.



Add-PSSnapin Microsoft.SharePoint.PowerShell -erroraction SilentlyContinue 
$siteURL = "http://prdserver/sites/sitecollection"
$mmsServiceName = "Managed Metadata Service Proxy"
$taxonomySite = Get-SPSite $siteURL
$taxSession = Get-SPTaxonomySession -site $taxonomySite
$termStore = $taxSession.TermStores[$mmsServiceName]
$AllGroups = $taxSession.DefaultSiteCollectionTermStore.Groups
$AllGroups
$siteTermGroup = $taxSession.DefaultSiteCollectionTermStore.Groups | where-object {$_.Id -eq 'd0e7f5c9-3713-4fc5-9245-04b55a452147'}
$siteTermGroup


Este comando nos retornará una lista de Grupos que se habían creado en DEV y los que se crearon en PRD (tanto local terms set como global terms set).


Ej:


image


Lo que tenés que hacer a continuación es buscar el grupo que importaste de DEV, y revisar la propiedad SiteCollectionAccessIds, la misma indica los sites collection que tienen acceso al grupo.



Defino lo siguiente:


IDSiteCollectionErroneo: supongo que el ID que está en la propiedad no es el ID del site Collection de PRD: http://PRDserver/sites/sitecollection


IDGrupo: es el ID del grupo. En la imagen anterior es “af334650-….”


$NombreGrupo: es el nombre del grupo. IMPORTANTE: si no lo definis correctamente, ej: Collección de sitios – PRDserver-sites-sitecollection no lo verás como local term set. Suele definirse de la siguiente manera (en castellano, en inglés varía): webapplicationURL-managedpath-sitecollection. Mi recomendación es que crees un local term set temporal (mediante una nueva columna de metadata), ejecute de nuevo el script donde retorna los grupos de la partición, y registres el nombre del grupo. A continuación borra el local term group (tendrás conflictos sino con la propiedad IsSiteCollectionGroup).


A continuación ejecuto el siguiente script con los datos previamente definidos, el cual mapea el grupo con el site collection mediante la propiedad AddSiteCollectionAccess


Add-PSSnapin Microsoft.SharePoint.PowerShell -erroraction SilentlyContinue 
$siteURL = "http://PRDserver/sites/sitecollection"
$mmsServiceName = "Managed Metadata Service Proxy"
$taxonomySite = Get-SPSite $siteURL
$taxSession = Get-SPTaxonomySession -site $taxonomySite
$termStore = $taxSession.TermStores[$mmsServiceName]
$AllGroups = $taxSession.DefaultSiteCollectionTermStore.Groups
$AllGroups
$IDGrupo = 'es el ID del grupo que quiero attachar al site collectio de PRD como local term set'
$siteTermGroup = $taxSession.DefaultSiteCollectionTermStore.Groups | where-object {$_.Id -eq $IDGrupo}
$siteTermGroup
$siteTermGroup.AddSiteCollectionAccess($taxonomySite.Id)
$NombreGrupo = 'nombre del grupo DEFINIDO POR REGLAS DE SHAREPOINT, VER la sección de suposiciones';
$siteTermGroup.Name = $NombreGrupo
$IDSiteCollectionErroneo = 'ID erroneo que aparece en la propiedad SiteCollectionAccessIds'
$siteTermGroup.DeleteSiteCollectionAccess([System.Guid]($IDSiteCollectionErroneo))
$termStore.CommitAll();


Recuerda reemplazar las variables $IDGrupo, $NombreGrupo, $SiteURL


Una vez ejecutado este script ya podrás ver el Local term set que tenías en DEV, ahora en PRD, sin haber perdidos los GUID´s de los term set, y con una ambiente consistente.

2 comentarios:

  1. Thank you very much for this article, it is so rare to see nowadays written as fervently article. I enjoyed reading it and I learned a lot of things. I will go and continue reading your blog =). Good luck for the future and another one for the quality of it.You can also check out this (http://www.sqiar.com).

    ResponderEliminar