aboutsummaryrefslogtreecommitdiff
path: root/docs/postgresql/index.rhtml
blob: 54a6933ad7921117fe378ad52cd26dcb9833d800 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<h1>PostgreSQL</h1>
<h2>SQL Dump</h2>
<p class="hyphens">L'idea dietro a questo metodo di dump &egrave; quello di generare un file con comandi SQL che,
   quando eseguiti dal server, ricrea il database nello stesso stato come quando &egrave; stato
   eseguito il dump. PostgreSQL fornisce uno strumento che si chiama <code>pg_dump</code> che serve
   proprio a questo scopo. L'uso base di qeusto comando &egrave; il seguente:</p>
<pre class="bordered">
pg_dump dbname > dumpfile
</pre>

<p class="hyphens">Come &egrave; facilmente intuibile, il risultato viene scritto nello standard output (nell'esempio
    precedente &egrave; reindirizzato verso il file <i>dumpfile</i>). Si vedr&agrave; pi&ugrave; avanti come questo
    pu&ograve; essere utile, infatti <code>pg_dump</code> pu&ograve; creare file in altri formati oltre a quelli
    testuali; &egrave; un client PostgresSQL classico, ci&ograve; significa che pu&ograve; eseguire i backup da
    qualsiasi postazione remota che abbia un accesso al database. Bisogna ricordarsi che <code>pg_dump</code> non opera
    con alcun permesso speciale. In particolare, deve avere un accesso in lettura a tutte le tabelle delle quali si
    vuole fare un backup, mentre per eseguire un backup di tutto il database &egrave; necessario avviarlo come
    super-utente (se non si hanno abbastanza privilegi per eseguire il backup di un intero database, &egrave; comunque
    possibile farlo tramite le opzioni <code>-n schema</code> o <code>-t tabella</code>).</p>

<p class="hyphens">Per specificare quale database <code>pg_dump</code> debba contattare, si usa l'opzione
    <code>-h host</code> ed eventualmente, specificandone la porta con <code>-p porta</code>. L'host predefinito
    &egrave; <i>localhost</i> o se impostata, viene recuperato il valore dalla variabile d'ambiente
    <code>PGHOST</code>, analogamente, la porta predefinita &egrave; la <i>5432</i>, altrimenti viene recuperata dalla
    variabile d'ambiente <code>PGPORT</code>.</p>

<p class="hyphens">Come qualsiasi altro client di PostgreSQL, <code>pg_dump</code> si connette usando la username
    dell'utente che attualmente sta usando il sistema operativo. Per poter specificare un'altra utenza, si usa
    l'opzione <code>-U utente</code> o impostare la variabile d'ambiente <code>PGUSER</code>.</p>

<p class="hyphens">Tipicamente, i dump generati con <code>pg_dump</code> possono essere caricati anche nelle nuove
    versioni di PostgreSQL e sono internamente consistenti, ci&ograve; significa che rappresentano un'esatta immagine
    del database nell'istante in cui l'operazione di backup &grave; stata avviata. Si consideri inoltre che
    <code>pg_dump</code> non blocca le altre operazioni sul database mentre questo sta lavorando (eccezion fatta per
    quelle operazioni necessitano di un lock esclusivo, come le pi&ugrave; diffuse varianti di
    <code>ALTER TABLE</code>.</p>

<h2>Ripristinare il dump</h2>
<p class="hyphens">Il file creati con <code>pg_dump</code> sono pensati per essere letti dal programma
    <code>psql</code>. Il comando generico per ripristinare un dump &egrave; il seguente:

<pre class="bordered">
psql dbname < dumpfile
</pre>

<p class="hyphens">Dove <i>dumpfile</i> &egrave; il file di output generato tramite il comando <code>pg_dump</code>. Il
    database <i>dbname</i> non viene creato con questo comando, quindi bisogna crearlo manualmente da <i>template0</i>
    prima di eseguire <code>psql</code> (per esempio con <code>createdb -T template0 dbname</code>). <code>psql</code>
    supporta le stesse opzioni di <code>pg_dump</code> per specificare il server al quale connettersi e l'utenza da
    usare. I dump che non sono salvati su file devono essere ripristinati tramite lo strumento
    <code>pg_restore</code>.</p>

<p class="hyphens">Prima di ripristinare un dump SQL, tutti gli utenti che sono proprietari o che hanno permessi su
    oggetti che sono finiti nel dump devono essere gi&agrave; presenti, se non lo sono, il ripristino fallir&agrave;
    cercando di ricreare gli oggetti con i permessi originali (qualche volta &egrave; quello che si vuole, ma
    tipicamente non &egrave; cos&igrave;).</p>

<p class="hyphens"><code>psql</code> in modo predefinito continua l'esecuzione dopo che si verifica un errore SQL,
    si potrebbe desiderare di eseguire <code>psql</code> con la variabile <code>ON_ERROR_STOP</code> impostata per
    alterarne il comportamento ed avere <code>psql</code> che si interrompe con un exit status pari a 3.</p>

<pre class="bordered">psql --set ON_ERROR_STOP=on dbname < dumpfile</pre>

<p class="hyphens">Altrimenti, si ottiene un database ripristinato parzialmente. Altrimenti &egrave; possibile
    specificare che un intero dump debba essere ripristinato come una singola transazione, quindi il restore &egrave;
    completamente ripristinato o viene effettauto un rollback completo. Questa modalit&agrave; pu&ograve; essere
    specificata passando l'opzione <code>-1</code> o <code>--single-transaction</code>. Quando si usa questa
    modalit&agrave;, bisogna essere consapevoli che anche un errore minore pu&ograve; causare un rollback di un
    ripristino che &egrave; stato eseguito molte ore prima. Comunque, &egrave; sempre preferibile piuttosto che
    pulire manualmente un database complesso dopo un ripristino parziale.</p>

<p class="hyphens">L'abilit&agrave; di <code>pg_dump</code> e <code>pssql</code> di scrivere e leggere dalle pipe,
    rende possibile la creazione di un dump direttamente da un server ad un altro, per esempio:</p>

<pre class="bordered">pg_dump -h host1 dbname | psql -h host2 dbname</pre>

<p class="hyphens"><b>IMPORTANTE:</b> i dump prodotti da <code>pg_dump</code> sono relativi a <i>template0</i>, questo
    significa che qualsiasi lingauggio, procedura, ecc. aggiunti tramite <i>template1</i> saranno messi nel dump
    da <code>pg_dump</code>. Come risultato, quando si esegue il ripristino, se si sta usando un <i>template1</i>
    personalizzato, si deve creare un database vuoto da <i>template0</i>, come nell'esempio precedente.</p>

<h2>Usare <code>pg_dumpall</code></h2>
<p class="hyphens"><code>pg_dump</code> effettua il dump di un singolo database alla volta, non effettua il dump delle
    informazioni su ruoli e tablespace. Per effettuare il dump di un intero cluster di database, esiste il programma
    <code>pg_dumpall</code>. L'utilizzo base del comando &egrave; il seguente:</p>

<pre class="bordered">pg_dumpall > dumpfile</pre>

<p class="hyphens">Il dump che ne risulta pu&ograve; essere ripristinato tramite <code>psql</code>:</p>

<pre class="bordered">psql -f dumpfile postgres</pre>

<h2>Gestire grandi database</h2>
<p>Alcuni sistemi operativi hanno i limiti massimi sulla dimensione dei file che potrebbero causare
   problemi creando grandi file con <code>pg_dump</code>. Fortunatamente, <code>pg_dump</code> pu&ograve;
   scrivere sullo standard output, cos&igrave; lo si pu&ograve; usare insieme agli strumenti standard di Unix
   per aggirare questo potenziale problema. Ci sono molteplici metodi:</p>
<p>Usare dei dump compressi:</p>
<p>Si pu&ograve; usare qualsiasi programma di compressione che si preferisce, ad esempio
   con <code>gzip</code>
<pre class="bordered">
pg_dump dbname | gzip > filename.gz
</pre>
<p>Si ripristina con:</p>
<pre class="bordered">
gunzip -c filename.gz | psql dbname
</pre>
<p>Oppure</p>
<pre class="bordered">
cat filename.gz | gunzip | psql dbname
</pre>


<pre style="background: cyan">

Use split. The split command allows you to split the output into smaller files that are acceptable in size to the underlying file system. For example, to make chunks of 1 megabyte:

pg_dump dbname | split -b 1m - filename

Reload with:

cat filename* | psql dbname

Use pg_dump's custom dump format. If PostgreSQL was built on a system with the zlib compression library installed, the custom dump format will compress data as it writes it to the output file. This will produce dump file sizes similar to using gzip, but it has the added advantage that tables can be restored selectively. The following command dumps a database using the custom dump format:

pg_dump -Fc dbname > filename

A custom-format dump is not a script for psql, but instead must be restored with pg_restore, for example:

pg_restore -d dbname filename

See the pg_dump and pg_restore reference pages for details.

For very large databases, you might need to combine split with one of the other two approaches.

Use pg_dump's parallel dump feature. To speed up the dump of a large database, you can use pg_dump's parallel mode. This will dump multiple tables at the same time. You can control the degree of parallelism with the -j parameter. Parallel dumps are only supported for the "directory" archive format.

pg_dump -j num -F d -f out.dir dbname

You can use pg_restore -j to restore a dump in parallel. This will work for any archive of either the "custom" or the "directory" archive mode, whether or not it has been created with pg_dump -j.

</pre>