Tu sei qui: Portale > LPI > LPIC-301 > Backup del database

Backup del database

Il contenuto qui presente viene distribuito sotto la licenza CC BY-NC-SA v3.0. Per maggiori dettagli http://creativecommons.org/licenses/by-nc-sa/3.0/. Content on this page is licensed under Creative Commons Attribution Non Commercial Share Alike v3.0. For details visit http://creativecommons.org/licenses/by-nc-sa/3.0/
— archiviato sotto: , , , , ,

Vediamo come effettuare il backup del nostro database

Introduzione

Una volta popolato il nostro database sarà anche opportuno effettuarne il backup, o più precisamente effettuarne un dump brutale, perchè come potremo vedere non sarà gestita nativamente un differenziale delle modifiche, ma soltanto il travaso del nostro database in un file ldif, con la "sola" possibilità di filtrare in vari modi l'output in uscita.
Per fare questo utilizzeremo il comando slapcat; un aspetto di questo comando è che a differenza del suo cugino slapadd,  è possibile lanciarlo a "caldo" senza prima dover obbligatoriamente effettuare lo stop del demone slapd.

Dump globale

Il comando slapcat, come tutti i comandi della serie slap* agisce direttamente sui file di configurazione e sui file contenenti il database vero e proprio, necessitando così dell'accesso ai file e alle directory di configurazione del database stesso, che nel nostro caso corrisponderà a /usr/local/var/openldap-data.
Vediamo come effettuare un dump dell'intero database:

$ sudo slapcat

dove sullo standard output restituirà il seguente listato:

dn: dc=example,dc=com
description: Example com Industries
o: example.com
dc: example
objectClass: top
objectClass: dcObject
objectClass: organization
structuralObjectClass: organization
entryUUID: bfd155ce-e846-102f-843d-e56d766ad1e2
creatorsName: cn=Admin,dc=example,dc=com
createTimestamp: 20110321203714Z
entryCSN: 20110321203714.392253Z#000000#000#000000
modifiersName: cn=Admin,dc=example,dc=com
modifyTimestamp: 20110321203714Z

...

dn: uid=amedeo,ou=people,dc=example,dc=com
uid: amedeo
ou: people
sn: Amedeo
cn: Amedeo Salvati
displayName: Amedeo Salvati
mail: amedeo@example.com
userPassword:: cGFzc3dvcmQ=

Dove potremo vedere che per ogni record il nostro demone ha creato, ed in autonomia ne mantiene la consistenza, tutta una serie di record come entryUUID, creatorsName, createTimestamp, entryCSN, modifiersName e modifyTimestamp; ovvero:

  • chi ha creato il record e quando tramite gli attributi creatorsName e createTimestamp;
  • chi ha modificato il record e quando tramite gli attributi modifiersName e modifyTimestamp;
  • un identificativo univoco del record tramite entryUUID;
  • il Change Sequence Number dell'entry (entryCSN), che assieme al contextCSN sono utilizzati per la replica syncrepl.

In ultimo invece possiamo vedere che la userPassword viene codificata in base64 nel nostro db e non in chiaro, anche se è facilmente decodificabile tramite poche righe di codice:

$ python -c 'import base64 
foo = base64.b64decode( "cGFzc3dvcmQ=" )
print "La password in base64: %s" % (foo)'                                                                                
La password in base64: password

Ovvero è equivalente ad avere una password scritta in chiaro.

Redirezione su un nuovo file

Adesso però vediamo come effettuare veramente il backup del nostro database redirezionando l'output verso un nuovo file:

$ sudo /usr/local/sbin/slapcat > /tmp/example.ldif

oppure

$ sudo /usr/local/sbin/slapcat \
   -f /usr/local/etc/openldap/slapd.conf \
   -l /tmp/example.ldif

Dove con il parametro -l potremo indicare il nome del file che conterrà il dump del nostro database, e con -f indicheremo il file di configurazione principale del demone slapd.

Aggiunta dei filtri

Ora vediamo come aggiungere alcuni filtri al nostro dump in modo da poter selezionare soltanto ciò che ci interessa, come ad esempio il dominio, la specifica organizational unit e via discorrendo.

Dominio example.com

$ sudo /usr/local/sbin/slapcat \
   -a "(entryDN:dnSubtreeMatch:=dc=example,dc=com)"

Oppure usando il suffisso

$ sudo /usr/local/sbin/slapcat -b "dc=example,dc=com"

Dump del contenuto della organizational unit people

$ sudo /usr/local/sbin/slapcat -b "ou=people,dc=example,dc=com"

Ripristino da un backup

Per poter ripristinare un database da un backup possiamo utilizzare il comando slapadd, facendo prima un erase del nostro db.

Per fare questo dobbiamo seguire i seguenti passi:

  • stop del demone slapd;
  • cancellazione dell'intero database;
  • lancio del comando slapadd passandogli come file ldif un nostro backup precedentemente creato.

Iniziamo con lo stop

$ sudo cat /usr/local/etc/openldap/slapd.conf | egrep '^pidfile' | \
   awk '{print $2}' | xargs sudo cat | xargs sudo kill

Successivamente effettuiamo la cancellazione dei file associati al nostro database presenti nella directory /usr/local/var/openldap-data

$ cd /usr/local/var/openldap-data
$ sudo rm __db.*
$ sudo rm *.bdb
$ sudo rm log.*

Ed infine ricarichiamo il tutto da un backup precedentemente creato

$ sudo /usr/local/sbin/slapadd -v 
   -f /usr/local/etc/openldap/slapd.conf \
   -l /tmp/example.ldif

Piccolo esempio per intercettare le differenze

Supponiamo di voler tracciare le differenze giornaliere apportate al nostro db, avendo dei semplici file testuali possiamo giocarci con il comando diff e/o patch:

Creiamo il nostro dump iniziale

$ sudo /usr/local/sbin/slapcat \
   -f /usr/local/etc/openldap/slapd.conf \
   -l /tmp/example01.ldif

Aggiungiamo l'uid luca nella nostra organizationalUnit people, di seguito il file ldif da creare:

dn: uid=luca,ou=people,dc=example,dc=com
uid: luca
ou: people
sn: Luca
cn: Luca Ferrari
displayName: Luca Ferrari
mail: luca@example.com
userPassword: password
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
structuralObjectClass: inetOrgPerson

ed il comando per aggiungerlo al nostro db:

$ sudo slapadd -v -l luca.ldif

Adesso facciamo nuovamente il dump:

$ sudo slapcat > /tmp/example02.ldif

verifichiamo cosa è cambiato:

$ diff /tmp/example01.ldif /tmp/example02.ldif

Questo produrrà il listato seguente:

140a141,159
> dn: uid=luca,ou=people,dc=example,dc=com
> uid: luca
> ou: people
> sn: Luca
> cn: Luca Ferrari
> displayName: Luca Ferrari
> mail: luca@example.com
> userPassword:: cGFzc3dvcmQ=
> objectClass: person
> objectClass: organizationalPerson
> objectClass: inetOrgPerson
> structuralObjectClass: inetOrgPerson
> entryUUID: 1d585674-ebe5-102f-8632-aba2b7b1ff6e
> creatorsName: cn=Admin,dc=example,dc=com
> createTimestamp: 20110326110825Z
> entryCSN: 20110326110825.276743Z#000000#000#000000
> modifiersName: cn=Admin,dc=example,dc=com
> modifyTimestamp: 20110326110825Z
>

Ovviamente possiamo giocarci come vogliamo, creando anche dei file di patch incrementali.

Azioni sul documento