|
|
# Manual de instruções para migração do _DSpace_
|
|
|
|
|
|
### Motivação
|
|
|
|
|
|
O **Portal MEC** utiliza o **DSpace** como repositório de arquivos e objetos educacionais principalmente devido à sua API REST. Sua compatibilidade com diversos padrões de metadados o torna capaz de ser facilmente compartilhável e integrado com outros repositórios educacionais, por exemplo.
|
|
|
Atualmente, o DSpace se encontra no ambiente de produção do projeto na versão 5.x e temos o interesse de manter uma versão mais recente neste ambiente. A versão mais recente é a 6.x.
|
|
|
O software é parte muito crítica do funcionamento para que nos arrisquemos a uma simples atualização, em destaque esta, que muda os principais elos de ligação com o Portal. Desta forma, algumas outras alternativas tiveram de ser pesquisadas. A abordagem que teve mais sucesso até agora é esta explicada aqui.
|
|
|
Nesta abordagem, se instala a nova versão em outra máquina, migra-se seu conteúdo, mantendo o registro de mapeamento entre objetos no antigo repositório e objetos no novo. Assim que a migração é concluída, a etapa de migrar o Portal para utilizar o novo DSpace também é muito crítica e deve ser estudada antes de posta em prática.
|
|
|
|
|
|
Este relatório tem como objetivo listar instruções para migrar um repositório DSpace. Assume-se já existirem duas instalações funcionais do software.
|
|
|
|
|
|
O processo pode ser dividido em duas etapas, como a seguir;
|
|
|
|
|
|
* Extração
|
|
|
* Importação
|
|
|
|
|
|
## Extração
|
|
|
|
|
|
A própria documentação oficial abrange esta etapa [aqui (5.x)](https://wiki.duraspace.org/display/DSDOC5x/Importing+and+Exporting+Items+via+Simple+Archive+Format#ImportingandExportingItemsviaSimpleArchiveFormat-AddingItemstoaCollectionfromazipfile). O DSpace possui um utilitário que, entre outras tarefas, exporta suas estruturas via _Simple Archive Format_ (SAF), gerando arquivos zip que podem ser importados mais tarde. Quando se exporta uma estrutura muito grande, o procedimento pode levar várias horas. Devido a um problema na importação<sup>[1](#importacaolenta)</sup>, a importação deve ser feita em partes, com granularidade a nível de itens.
|
|
|
|
|
|
#### Instruções
|
|
|
|
|
|
O primeiro passo é conseguir as informações necessárias para exportar cada objeto, estas informações ficam no banco de dados _postgresql_ do DSpace. Para conseguí-las, colete o _id_ das coleções a serem migradas (na mecdb3, são listadas [aqui](https://mecdb3.c3sl.ufpr.br:8443/rest/collections)) e acesse o banco na máquina a exportar;
|
|
|
```sql
|
|
|
$ su - dspace
|
|
|
$ psql
|
|
|
$ \copy (select h.handle, i.item_id, i.owning_collection from item i inner join \
|
|
|
handle h on h.resource_id = i.item_id where i.owning_collection in (2, 6)) \
|
|
|
to '/tmp/export_info.csv' with csv delimiter ',';
|
|
|
```
|
|
|
###### _Atenção: todos os comandos e códigos aqui listados são apenas exemplos (possivelmente funcionais) e devem ser reescritos com cuidado._
|
|
|
|
|
|
Neste exemplo, o _handle_, _item\_id_ e a coleção a que pertence cada objeto das coleções 2 e 6 serão copiados para um arquivo _csv_ em `/tmp/export_info.csv`.
|
|
|
|
|
|
Depois, acesse a pasta anterior à da instalação do DSpace. Crie uma pasta para cada coleção a ser migrada com o nome no formato `coll_{id}` e execute o seguinte script.
|
|
|
|
|
|
```shell
|
|
|
#! /bin/bash
|
|
|
|
|
|
DSPACE_ADMIN="admin@mecdb3.c3sl.ufpr.br"
|
|
|
|
|
|
for i in $(cat /tmp/export_info.csv); do
|
|
|
handle=$(echo $i | cut -d',' -f1)
|
|
|
suffix=$(echo $handle | cut -d'/' -f2)
|
|
|
collid=$(echo $i | cut -d',' -f3)
|
|
|
./installdir/bin/dspace packager -d -u -a -t AIP -e $DSPACE_ADMIN -i $handle coll_$collid/ITEM@123456789-$suffix.zip
|
|
|
done;
|
|
|
```
|
|
|
###### _Atenção: todos os comandos e códigos aqui listados são apenas exemplos (possivelmente funcionais) e devem ser reescritos com cuidado._
|
|
|
|
|
|
É recomendado salvar a saída padrão e a de erros do script em algum arquivo, para garantir que todos os objetos foram exportados com sucesso. Devido ao tempo que isso pode levar, também é uma boa ideia rodá-lo sem estar associado à um tty ou sessão ssh, através de uma _screen_, por exemplo.
|
|
|
|
|
|
Ao final deste processo, espera-se que as pastas de coleções estejam cheias de objetos em formato _zip_. Copie-as para a máquina de importação, assim como o arquivo.
|
|
|
|
|
|
## Importação
|
|
|
|
|
|
Para a importação, é necessário criar as estruturas superiores aos itens (comunidades e coleções) manualmente. Crie-as manualmente (através da _xmlui_, por exemplo), copiando os dados das coleções a serem migradas e salve o novo _handle_ de cada uma delas.
|
|
|
|
|
|
Na máquina de importação, mova o arquivo com as informações de migração e as pastas com os arquivos para o diretório anterior ao da instalação do DSpace. Em seguida, configure o seguinte script, de acordo com as novas coleções e execute-o.
|
|
|
|
|
|
```shell
|
|
|
#! /bin/bash
|
|
|
|
|
|
DSPACE_ADMIN="admin@mecdb1.c3sl.ufpr.br"
|
|
|
|
|
|
declare -A COLLECTIONS=(
|
|
|
# ["id da colecao no antigo dspace"]="handle da colecao no novo dspace"
|
|
|
["2"]="123456789/2"
|
|
|
["6"]="123456789/3"
|
|
|
)
|
|
|
|
|
|
for coll in "${!COLLECTIONS[@]}"; do
|
|
|
for item in $(ls coll_$coll); do
|
|
|
prefix=$(echo $item | cut -d'@' -f2 | cut -d'-' -f1)
|
|
|
suffix=$(echo $item | cut -d'-' -f2 | cut -d'.' -f1)
|
|
|
handle="${prefix}/${suffix}"
|
|
|
../installdir/bin/dspace packager -s -t AIP -e $DSPACE_ADMIN -i $handle -p "${COLLECTIONS[$coll]}" $item
|
|
|
done;
|
|
|
done;
|
|
|
```
|
|
|
###### _Atenção: todos os comandos e códigos aqui listados são apenas exemplos (possivelmente funcionais) e devem ser reescritos com cuidado._
|
|
|
|
|
|
Este script importará todos os dados, atribuindo a cada item uma coleção "pai". A saída desta etapa é muito importante, por conter as novas informações dos mesmos itens, e deve ser tratada com cuidado para garantir o mapeamento correto dos itens velhos para os novos. A mesma recomendação de rodá-lo numa _screen_ pode ser feita aqui.
|
|
|
|
|
|
> **Possível problema**:
|
|
|
> Enquanto eu fazia isto da primeira vez, houve um _nullPointerException_ durante a importação. O erro indicava problema com o md5 dos arquivos. Caso tenha o mesmo problema, vasculhe os logs do próprio dspace e, para cada arquivo com problema, "injete" o md5 correto no banco de dados do DSpace. A causa do problema não está confirmada, mas parece ser relacionada a algum tipo de corrupção no disco (?).
|
|
|
> **Possível incômodo**:
|
|
|
> Surgiram vários bitstreams de tamanho 0, *acho* que apagá-los não geraria
|
|
|
> outros problemas
|
|
|
|
|
|
Após este passo, espera-se que todos os itens tenham sido migrados com sucesso. Mas ainda é necessário construir o mapeamento entre itens velhos e novos para a resincronização entre o Portal MEC e o DSpace.
|
|
|
|
|
|
## Mapeamento (Deve-se a estudar mais a fundo)
|
|
|
|
|
|
Os principais dados utilizados pelo portal são guardados pelo postgresql do próprio portal, em conjunto com as informações referentes à rede social. Em grande maioria, são identificadores e índices para busca e download de arquivos. Deve-se garantir que, durante a migração, todos os dados antigos sejam corretamente trocados para os novos.
|
|
|
|
|
|
Esta etapa<sup>[2](#csvs)</sup> deve ser regida pelo arquivo de saída da importação, que contém o mapeamento entre itens no DSpace antigo e seus equivalentes no DSpace novo. Uma abordagem possível seria, por exemplo, reunir (seja via scripts que enviam requisições REST, seja via consultas direto no postgresql do DSpace) as bitstreams e seus _md5-checksum_ de cada item em ambos os DSpaces e depois associar as bitstreams entre DSpaces através do md5.
|
|
|
|
|
|
Testes devem ser conduzidos com instâncias locais do Portal, para garantir que o downtime seja mínimo e que não hajam problemas imprevistos.
|
|
|
|
|
|
Obs.: Há um csv [neste repositório](https://gitlab.c3sl.ufpr.br/jmb15/dspace-migration) que contém o mapeamento entre os dados que o
|
|
|
portal utiliza para indexação interna de objetos educacionais no dspace
|
|
|
obtido através da importação realizada em março de 2018.
|
|
|
|
|
|
## Notas de rodapé
|
|
|
<b name="importacaolenta">1</b>: Existe uma falha conhecida, em que a importação fica cada vez mais lenta quando a estrutura importada é muito grande. Ela está ligada à versão 6.x e é referenciada [aqui](https://groups.google.com/forum/m/#!topic/dspace-tech/DjecetZKINM) por Tim Donohue. Numa tentativa de migrar o DSpace atual todo, duas semanas não foram o suficiente para metade do conteúdo (depois disso, a máquina importando desligou-se inesperadamente e a importação foi perdida).
|
|
|
|
|
|
<b name="csvs">2</b>: Recomendo, nesta etapa, transformar todos os dados em _csv_ e então manuseando-os com a biblioteca _pandas_, em Python. |