Datan säilytys ja turvaaminen

Datan säilytys ja turvaaminen

Tutkimuksessa käytetystä ja tuotetusta datasta huolehtiminen kuuluu tutkijan perustaitoihin. Jo tutkimuksen alkuvaiheessa tutkijoiden on huomioitava datan elinkaari.

Rahoitusta haettaessa monet rahoittajat kuten Suomen Akatemia vaativat datanhallintasuunnitelman, jossa huomioidaan mm. aineistonkeruu ja käsittely, oikeudet ja luvat, tiedostomuodot, metatiedot, pysyvät tunnisteet sekä datan tallennus, säilytys ja avaaminen. Datan sensitiivisyys, jatkuvat datavirrat ja suuret  datamäärät tuovat omat eritysvaatimuksensa datanhallintaan.

Datan tallennus

Hyvä datan tallennuspaikka on tietoturvallinen ja varmuuskopioitu ja data on helposti jaettavissa halutun ryhmän sisällä. Esimerkiksi CSC:n ympäristössä aktiiviselle datalle löytyy projektihakemistot laskentaympäristöstä ja pilvipalveluista tai datan voi tallentaa koko järjestelmän yhteiseen datanhallintaympäristöön. Aktiivisen datan tallennusvaihe on suhteellisen lyhyt ja sen jälkeen pysyvän (muuttumattoman) datan säilytykselle on omat säilytyspalvelunsa ja kansallisesti merkittävät aineistot siirretään digitaalisen pitkäaikaissäilytyksen piiriin.

Datan säilytyspalvelut

Datan säilyttämisellä tarkoitetaan pysyvän datan säilyttämistä useiden vuosien ajan. Tätä varten on olemassa erilaisia säilytyspalveluita. Esimerkiksi opetus- ja kulttuuriministeriön Fairdata-palveluihin kuuluu pysyvän datan säilytykseen ja jakamiseen tarkoitettu IDA ja yhteiseurooppalainen EUDAT tarjoaa B2SHARE-palvelun avoimesti lisensoidun tutkimusdatan säilyttämiselle ja jakamiselle.

Digitaalinen pitkäaikaissaatavuus

Digitaalinen pitkäaikaissäilytys (PAS) tarkoittaa digitaalisen informaation säilyttämistä ymmärrettävänä ja käytettävänä useiden kymmenien tai jopa satojen vuosien ajan.

Pitkäaikaissäilytyksen rinnalla puhutaan myös pitkäaikaissaatavuudesta, joka korostaa sitä, että data on paitsi säilöttynä, myös saatavilla tutkimuskäyttöön satojen vuosien päästäkin ja käytettävissä tulevilla laite- ja ohjelmistoympäristöissä ja tiedostomuodoissa. Tämä edellyttää jatkuvaa datan migraatiota.

Digitaalinen pitkäaikaissäilytys jaetaan usein semanttiseen, loogiseen ja bittitason säilyttämiseen. Näistä semanttinen säilyttäminen keskittyy aineistojen sisältöön, merkittävyyteen ja näiden kuvailuun, looginen säilyttäminen aineistojen käyttökelpoisuuden hallintaan ja bittitason säilyttäminen varmistaa datan eheyden.  

Loogisessa säilyttämisessä keskeinen menetelmä on tiedostomuotojen migraatiot, joita varten kehitetään menetelmiä ja välineitä sekä ylläpidetään tähän liittyvää osaamista. Bittitason säilytyksessä hallitaan datasta riittävää määrää kopioita heterogeenisessä laiteympäristössä maantieteellisesti hajautettuna. Päivittäisessä toiminnassa huolehditaan aineistojen eheydestä, korjataan mahdolliset poikkeamat ja huolehditaan laitteistojen elinkaaren hallinnasta.

Digitaalisessa pitkäaikaissäilytyksessä säilyttäminen muodostuu aktiiviseksi huolehtimiseksi siitä, että informaatio säilyy siihen kohdistuvista erilaisista murroksista huolimatta. Ilman tätä huolehtimista laitteet, ohjelmistot ja tiedostomuodot, mutta myös ihmiset ja osaaminen, vanhenisivat ajan saatossa ja tietosisällöt tuhoutuisivat. Keskeistä on varmistaa hyvin toimivat prosessit, jotka mahdollistavat henkilöriippumattoman toiminnan ja osaamisen siirron uusille tekijöille.

Opetus- ja kulttuuriministeriön kansalliset digitaalisen pitkäaikaissäilytyksen palvelut huolehtivat sekä kulttuuriperinnön että tutkimukseen liittyvien aineistojen säilymisestä tuleville sukupolville. Kulttuuriperintöaineistojen pitkäaikaissäilytys aloitettiin yhdessä kansallisten muistiorganisaatioiden kanssa syksyllä 2015 ja tutkimukseen liittyvien aineistojen pitkäaikaissäilytys vuoden 2019 lopulla.

Fairdata-palvelukokonaisuus

Fairdata-palvelut muodostavat yhteentoimivan palvelukokonaisuuden aineistonhallintaan, aineistojen kuvailuun ja turvalliseen säilytykseen sekä merkittävien tietoaineistojen pitkäaikaisäilytykseen. IDA on tutkimusdatan säilytyspalvelu, Qvaimen avulla tutkimusaineistoon liitetään kuvailutiedot eli metadata ja Fairdata PAS-palvelu on tutkimusaineistojen pitkäaikaissäilytyspalvelu. Etsimen avulla avulla tutkija voi hakea tietoa tutkimusaineistoista tai tutkimusaineistoja käyttöönsä. Palveluiden yhteentoimivuuden varmistaa yhteinen metatietovaranto.

 

Video

CSC – suomalainen tutkimuksen, koulutuksen, kulttuurin ja julkishallinnon ICT-osaamiskeskus

Katso video Youtubessa »

Uusimmat blogit ja artikkelit

Lisää sisältöjä

Funetin juhlavuosi: 40 vuotta toimintaa ja 35 vuotta internetissä

Tänä vuonna on kulunut 40 vuotta Funet-tietoverkon perustamisesta ja 35 vuotta Suomen liittymisestä maailmanlaajuiseen internetiin. Juhlavuottaan viettävä Funet voi olla ylpeä monista saavutuksistaan, eikä Suomen liittäminen internetiin ole niistä vähäisin.

Lue lisää »

EISCAT 3D -tutkajärjestelmä mullistaa ilmakehätutkimuksen

Pian valmistumassa olevan uuden EISCAT 3D -tutkajärjestelmän avulla saadaan revontulista kolmiulotteista kuvaa. Hanketta koordinoi Oulun yliopiston Sodankylän geofysiikan observatorio. CSC on hankkeessa tiiviisti mukana.

Lue lisää »

Poikkeustilasta pysyviin rakenteisiin

Korkeakoulujen IT-johtajien verkostot AAPA ja FUCIO sekä CSC kutsuivat korkeakoulujen pedagogiikan, opiskelun ja opetuksen tuen ja hallinnon sekä muut kiinnostuneet ideapankki.csc.fi -webinaariin kesäkuun lopussa.

Lue lisää »

Koronavirus laitetaan kuriin tieteen tietokantojen avulla

Koronavirus voidaan kukistaa kansainvälisellä yhteistyöllä ja tiedon jakamisella. Apuna ovat sähköiset tutkimusinfrastruktuurit. Suomi on jäsenenä näissä ja hyödyt ovat kiistattomat.

Lue lisää »
 
Virhe tapahtui prosessoidessa esitysmallia.
The following has evaluated to null or missing:
==> assetRenderer.getURLViewInContext(renderRequest, renderResponse, viewURL)  [in template "10154#10192#411426" at line 10, column 32]

----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #assign viewURL = assetRenderer.getUR...  [in template "10154#10192#411426" at line 10, column 13]
----
1<#assign liferay_portlet = taglibLiferayHash["/META-INF/liferay-portlet.tld"] /> 
2<#assign liferay_ui = taglibLiferayHash["/META-INF/liferay-ui.tld"] /> 
3 
4<div class="kooste25 <@liferay_portlet.namespace />container"> 
5    <#list entries as entry> 
6        <#assign entry = entry /> 
7        <#assign assetRenderer = entry.getAssetRenderer() /> 
8        <#assign viewURL = assetPublisherHelper.getAssetViewURL(renderRequest, renderResponse, entry) /> 
9        <#if assetLinkBehavior != "showFullContent"> 
10            <#assign viewURL = assetRenderer.getURLViewInContext(renderRequest, renderResponse, viewURL) /> 
11        </#if> 
12         
13         
14        <#if entry.getClassName() == "com.liferay.journal.kernel.model.JournalArticle"> 
15         
16            <#assign article = entry.getAssetRenderer().getArticle()/> 
17            <#assign document = saxReaderUtil.read(article.getContentByLocale(locale.toString())) /> 
18            <#assign categories = entry.getCategories() /> 
19            <#assign headline = document.valueOf("//dynamic-element[@name='Headline']/dynamic-content/text()") /> 
20            <#assign summary = htmlUtil.escape(assetRenderer.getSummary(locale)) /> 
21    
22            <div class="boksi"> 
23                <div class="article-content"> 
24        <#list categories as category> 
25                     
26                            <#assign categoryTitle = category.getTitle("en_US", true) /> 
27                            <#assign categoryClass = categoryTitle?lower_case/> 
28                            <#assign categoryClass = categoryClass?replace("[^\\d\\w]", "-", "r")/> 
29 
30                            <#assign categoryId = category.getCategoryId() /> 
31                         
32                     
33                     
34                            <#if category.getTitle(locale.toString(), true) == "Artikkeli" || category.getTitle(locale.toString(), true) == "Article"> 
35                                <div class="ac-${categoryClass}">${category.getTitle(locale.toString(), true)}</div> 
36                            </#if> 
37                     
38                    </#list> 
39                <h3><a href="${viewURL}" target="_blank">${headline}</a></h3> 
40              
41                     
42               
43                   <section class="text"> 
44 
45                        <small><@getMetadataField fieldName="publish-date" /></small> 
46                        <p class="article-summary">${stringUtil.shorten(htmlUtil.stripHtml(summary), 200)}</p> 
47 
48                      <p><a class="readmore" href="${viewURL}" target="_blank"><@liferay.language key="read-more" /> »</a></p>   
49                 
50                    </section>  
51                     
52                
53                </div> 
54         
55                     
56             
57                 
58            </div> 
59        </#if> 
60 
61    <#if entry.getClassName() == "com.liferay.blogs.kernel.model.BlogsEntry"> 
62        <div class="boksi"> 
63	 
64		<#assign curEntry = entry /> 
65        <#assign categories = entry.getCategories() /> 
66	 
67		<#assign bloglink = "https://www.csc.fi/web/blog/post/-/blogs/"> 
68		<#assign urltitle = entry.getAssetRenderer().getUrlTitle() /> 
69	 
70		 
71        <div class="blog-content"> 
72 
73           <#list categories as category> 
74                     
75                    <#assign categoryTitle = category.getTitle("en_US", true) /> 
76                    <#assign categoryClass = categoryTitle?lower_case/> 
77                    <#assign categoryClass = categoryClass?replace("[^\\d\\w]", "-", "r")/> 
78 
79                    <#assign categoryId = category.getCategoryId() /> 
80                    <#assign portletURL = renderResponse.createRenderURL() /> 
81                    ${portletURL.setParameter("resetCur", "TRUE")} 
82                    ${portletURL.setParameter("categoryId", categoryId?string)} 
83                     
84                    <#if category.getTitle(locale.toString(), true) == "Blogi" || category.getTitle(locale.toString(), true) == "Blog"> 
85                        <div class="ac-${categoryClass}">${category.getTitle(locale.toString(), true)}</div> 
86                    </#if> 
87                     
88            </#list> 
89            <h3><a href="${bloglink}${urltitle}" target="_blank">${htmlUtil.escape(curEntry.getTitle())}</a></h3> 
90            
91			<section class="text"> 
92				<#assign summary = curEntry.getDescription() /> 
93 
94			 
95				 
96				<p class="article-summary">${stringUtil.shorten(htmlUtil.stripHtml(summary), 200)}</p> 
97              <p><a class="readmore" href="${bloglink}${urltitle}" target="_blank"><@liferay.language key="read-more" /> »</a></p>  
98                 
99			</section> 
100		</div> 
101	 
102        
103	</div> 
104    </#if> 
105    </#list> 
106</div> <!--csc-article-list--> 
107 
108<script type="text/javascript"> 
109    var container = document.querySelector('.csc-article-list'); 
110    var msnry; 
111 
112    // initialize Masonry after all images have loaded 
113    imagesLoaded( container, function() { 
114        msnry = new Masonry( container ); 
115    }); 
116</script> 
117 
118<#macro getMetadataField fieldName> 
119    <#if stringUtil.split(metadataFields)?seq_contains(fieldName)> 
120    <span class="metadata-entry metadata-" ${fieldName}"> 
121        <#assign dateFormat = "dd.MM.yyyy" /> 
122 
123        <#if fieldName == "author"> 
124            <@liferay.language key="by" /> ${portalUtil.getUserName(assetRenderer.getUserId(), 
125        assetRenderer.getUserName())} 
126        <#elseif fieldName == "categories"> 
127            <@liferay_ui["asset-categories-summary"] 
128            className=entry.getClassName() 
129            classPK=entry.getClassPK() 
130            portletURL=renderResponse.createRenderURL() 
131            /> 
132        <#elseif fieldName == "create-date"> 
133        ${dateUtil.getDate(entry.getCreateDate(), dateFormat, locale)} 
134        <#elseif fieldName == "expiration-date"> 
135        ${dateUtil.getDate(entry.getExpirationDate(), dateFormat, locale)} 
136        <#elseif fieldName == "modified-date"> 
137        ${dateUtil.getDate(entry.getModifiedDate(), dateFormat, locale)} 
138        <#elseif fieldName == "priority"> 
139        ${entry.getPriority()} 
140        <#elseif fieldName == "publish-date" && entry.getPublishDate()??> 
141        ${dateUtil.getDate(entry.getPublishDate(), dateFormat, locale)} 
142        <#elseif fieldName == "tags"> 
143            <@liferay_ui["asset-tags-summary"] 
144            className=entry.getClassName() 
145            classPK=entry.getClassPK() 
146            portletURL=renderResponse.createRenderURL() 
147            /> 
148        <#elseif fieldName == "view-count"> 
149            <@liferay_ui["icon"] 
150            image="history" 
151            /> 
152 
153        ${entry.getViewCount()} <@liferay.language key="views" /> 
154        </#if> 
155    </span> 
156    </#if> 
157</#macro>