~ubuntu-branches/ubuntu/trusty/postgresql-9.3/trusty-updates

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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML
><HEAD
><TITLE
>Reliability</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
REV="MADE"
HREF="mailto:pgsql-docs@postgresql.org"><LINK
REL="HOME"
TITLE="PostgreSQL 9.3.13 Documentation"
HREF="index.html"><LINK
REL="UP"
TITLE="Reliability and the Write-Ahead Log"
HREF="wal.html"><LINK
REL="PREVIOUS"
TITLE="Reliability and the Write-Ahead Log"
HREF="wal.html"><LINK
REL="NEXT"
TITLE="Write-Ahead Logging (WAL)"
HREF="wal-intro.html"><LINK
REL="STYLESHEET"
TYPE="text/css"
HREF="stylesheet.css"><META
HTTP-EQUIV="Content-Type"
CONTENT="text/html; charset=ISO-8859-1"><META
NAME="creation"
CONTENT="2016-05-09T21:13:26"></HEAD
><BODY
CLASS="SECT1"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="5"
ALIGN="center"
VALIGN="bottom"
><A
HREF="index.html"
>PostgreSQL 9.3.13 Documentation</A
></TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="top"
><A
TITLE="Reliability and the Write-Ahead Log"
HREF="wal.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="top"
><A
HREF="wal.html"
ACCESSKEY="U"
>Up</A
></TD
><TD
WIDTH="60%"
ALIGN="center"
VALIGN="bottom"
>Chapter 29. Reliability and the Write-Ahead Log</TD
><TD
WIDTH="20%"
ALIGN="right"
VALIGN="top"
><A
TITLE="Write-Ahead Logging (WAL)"
HREF="wal-intro.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="WAL-RELIABILITY"
>29.1. Reliability</A
></H1
><P
>   Reliability is an important property of any serious database
   system, and <SPAN
CLASS="PRODUCTNAME"
>PostgreSQL</SPAN
> does everything possible to
   guarantee reliable operation. One aspect of reliable operation is
   that all data recorded by a committed transaction should be stored
   in a nonvolatile area that is safe from power loss, operating
   system failure, and hardware failure (except failure of the
   nonvolatile area itself, of course).  Successfully writing the data
   to the computer's permanent storage (disk drive or equivalent)
   ordinarily meets this requirement.  In fact, even if a computer is
   fatally damaged, if the disk drives survive they can be moved to
   another computer with similar hardware and all committed
   transactions will remain intact.
  </P
><P
>   While forcing data to the disk platters periodically might seem like
   a simple operation, it is not. Because disk drives are dramatically
   slower than main memory and CPUs, several layers of caching exist
   between the computer's main memory and the disk platters.
   First, there is the operating system's buffer cache, which caches
   frequently requested disk blocks and combines disk writes. Fortunately,
   all operating systems give applications a way to force writes from
   the buffer cache to disk, and <SPAN
CLASS="PRODUCTNAME"
>PostgreSQL</SPAN
> uses those
   features.  (See the <A
HREF="runtime-config-wal.html#GUC-WAL-SYNC-METHOD"
>wal_sync_method</A
> parameter
   to adjust how this is done.)
  </P
><P
>   Next, there might be a cache in the disk drive controller; this is
   particularly common on <ACRONYM
CLASS="ACRONYM"
>RAID</ACRONYM
> controller cards. Some of
   these caches are <I
CLASS="FIRSTTERM"
>write-through</I
>, meaning writes are sent
   to the drive as soon as they arrive. Others are
   <I
CLASS="FIRSTTERM"
>write-back</I
>, meaning data is sent to the drive at
   some later time. Such caches can be a reliability hazard because the
   memory in the disk controller cache is volatile, and will lose its
   contents in a power failure.  Better controller cards have
   <I
CLASS="FIRSTTERM"
>battery-backup units</I
> (<ACRONYM
CLASS="ACRONYM"
>BBU</ACRONYM
>s), meaning
   the card has a battery that
   maintains power to the cache in case of system power loss.  After power
   is restored the data will be written to the disk drives.
  </P
><P
>   And finally, most disk drives have caches. Some are write-through
   while some are write-back, and the same concerns about data loss
   exist for write-back drive caches as for disk controller
   caches.  Consumer-grade IDE and SATA drives are particularly likely
   to have write-back caches that will not survive a power failure.  Many
   solid-state drives (SSD) also have volatile write-back caches.
  </P
><P
>   These caches can typically be disabled; however, the method for doing
   this varies by operating system and drive type:
  </P
><P
></P
><UL
><LI
><P
>        On <SPAN
CLASS="PRODUCTNAME"
>Linux</SPAN
>, IDE and SATA drives can be queried using
        <TT
CLASS="COMMAND"
>hdparm -I</TT
>; write caching is enabled if there is
        a <TT
CLASS="LITERAL"
>*</TT
> next to <TT
CLASS="LITERAL"
>Write cache</TT
>.  <TT
CLASS="COMMAND"
>hdparm -W 0</TT
>
        can be used to turn off write caching.  SCSI drives can be queried
        using <A
HREF="http://sg.danny.cz/sg/sdparm.html"
TARGET="_top"
><SPAN
CLASS="APPLICATION"
>sdparm</SPAN
></A
>.
        Use <TT
CLASS="COMMAND"
>sdparm --get=WCE</TT
> to check
        whether the write cache is enabled and <TT
CLASS="COMMAND"
>sdparm --clear=WCE</TT
>
        to disable it.
      </P
></LI
><LI
><P
>        On <SPAN
CLASS="PRODUCTNAME"
>FreeBSD</SPAN
>, IDE drives can be queried using
        <TT
CLASS="COMMAND"
>atacontrol</TT
> and write caching turned off using
        <TT
CLASS="LITERAL"
>hw.ata.wc=0</TT
> in <TT
CLASS="FILENAME"
>/boot/loader.conf</TT
>;
        SCSI drives can be queried using <TT
CLASS="COMMAND"
>camcontrol identify</TT
>,
        and the write cache both queried and changed using
        <TT
CLASS="COMMAND"
>sdparm</TT
> when available.
      </P
></LI
><LI
><P
>        On <SPAN
CLASS="PRODUCTNAME"
>Solaris</SPAN
>, the disk write cache is controlled by
        <TT
CLASS="COMMAND"
>format -e</TT
>.
        (The Solaris <ACRONYM
CLASS="ACRONYM"
>ZFS</ACRONYM
> file system is safe with disk write-cache
        enabled because it issues its own disk cache flush commands.)
      </P
></LI
><LI
><P
>        On <SPAN
CLASS="PRODUCTNAME"
>Windows</SPAN
>, if <TT
CLASS="VARNAME"
>wal_sync_method</TT
> is
        <TT
CLASS="LITERAL"
>open_datasync</TT
> (the default), write caching can be disabled
        by unchecking <TT
CLASS="LITERAL"
>My Computer\Open\<TT
CLASS="REPLACEABLE"
><I
>disk drive</I
></TT
>\Properties\Hardware\Properties\Policies\Enable write caching on the disk</TT
>.
        Alternatively, set <TT
CLASS="VARNAME"
>wal_sync_method</TT
> to
        <TT
CLASS="LITERAL"
>fsync</TT
> or <TT
CLASS="LITERAL"
>fsync_writethrough</TT
>, which prevent
        write caching.
      </P
></LI
><LI
><P
>        On <SPAN
CLASS="PRODUCTNAME"
>Mac OS X</SPAN
>, write caching can be prevented by
        setting <TT
CLASS="VARNAME"
>wal_sync_method</TT
> to <TT
CLASS="LITERAL"
>fsync_writethrough</TT
>.
      </P
></LI
></UL
><P
>   Recent SATA drives (those following <ACRONYM
CLASS="ACRONYM"
>ATAPI-6</ACRONYM
> or later)
   offer a drive cache flush command (<TT
CLASS="COMMAND"
>FLUSH CACHE EXT</TT
>),
   while SCSI drives have long supported a similar command
   <TT
CLASS="COMMAND"
>SYNCHRONIZE CACHE</TT
>.  These commands are not directly
   accessible to <SPAN
CLASS="PRODUCTNAME"
>PostgreSQL</SPAN
>, but some file systems
   (e.g., <ACRONYM
CLASS="ACRONYM"
>ZFS</ACRONYM
>, <ACRONYM
CLASS="ACRONYM"
>ext4</ACRONYM
>) can use them to flush
   data to the platters on write-back-enabled drives.  Unfortunately, such
   file systems behave suboptimally when combined with battery-backup unit
   (<ACRONYM
CLASS="ACRONYM"
>BBU</ACRONYM
>) disk controllers.  In such setups, the synchronize
   command forces all data from the controller cache to the disks,
   eliminating much of the benefit of the BBU.  You can run the
   <A
HREF="pgtestfsync.html"
><SPAN
CLASS="APPLICATION"
>pg_test_fsync</SPAN
></A
> program to see
   if you are affected.  If you are affected, the performance benefits
   of the BBU can be regained by turning off write barriers in
   the file system or reconfiguring the disk controller, if that is
   an option.  If write barriers are turned off, make sure the battery
   remains functional; a faulty battery can potentially lead to data loss.
   Hopefully file system and disk controller designers will eventually
   address this suboptimal behavior.
  </P
><P
>   When the operating system sends a write request to the storage hardware,
   there is little it can do to make sure the data has arrived at a truly
   non-volatile storage area. Rather, it is the
   administrator's responsibility to make certain that all storage components
   ensure integrity for both data and file-system metadata.
   Avoid disk controllers that have non-battery-backed write caches.
   At the drive level, disable write-back caching if the
   drive cannot guarantee the data will be written before shutdown.
   If you use SSDs, be aware that many of these do not honor cache flush
   commands by default.
   You can test for reliable I/O subsystem behavior using <A
HREF="http://brad.livejournal.com/2116715.html"
TARGET="_top"
><TT
CLASS="FILENAME"
>diskchecker.pl</TT
></A
>.
  </P
><P
>   Another risk of data loss is posed by the disk platter write
   operations themselves. Disk platters are divided into sectors,
   commonly 512 bytes each.  Every physical read or write operation
   processes a whole sector.
   When a write request arrives at the drive, it might be for some multiple
   of 512 bytes (<SPAN
CLASS="PRODUCTNAME"
>PostgreSQL</SPAN
> typically writes 8192 bytes, or
   16 sectors, at a time), and the process of writing could fail due
   to power loss at any time, meaning some of the 512-byte sectors were
   written while others were not.  To guard against such failures,
   <SPAN
CLASS="PRODUCTNAME"
>PostgreSQL</SPAN
> periodically writes full page images to
   permanent WAL storage <SPAN
CLASS="emphasis"
><I
CLASS="EMPHASIS"
>before</I
></SPAN
> modifying the actual page on
   disk. By doing this, during crash recovery <SPAN
CLASS="PRODUCTNAME"
>PostgreSQL</SPAN
> can
   restore partially-written pages from WAL.  If you have file-system software
   that prevents partial page writes (e.g., ZFS),  you can turn off
   this page imaging by turning off the <A
HREF="runtime-config-wal.html#GUC-FULL-PAGE-WRITES"
>full_page_writes</A
> parameter. Battery-Backed Unit
   (BBU) disk controllers do not prevent partial page writes unless
   they guarantee that data is written to the BBU as full (8kB) pages.
  </P
><P
>   <SPAN
CLASS="PRODUCTNAME"
>PostgreSQL</SPAN
> also protects against some kinds of data corruption
   on storage devices that may occur because of hardware errors or media failure over time,
   such as reading/writing garbage data.
   <P
></P
></P><UL
><LI
><P
>      Each individual record in a WAL file is protected by a CRC-32 (32-bit) check
      that allows us to tell if record contents are correct. The CRC value
      is set when we write each WAL record and checked during crash recovery,
      archive recovery and replication.
     </P
></LI
><LI
><P
>      Data pages are not currently checksummed by default, though full page images
      recorded in WAL records will be protected; see <A
HREF="app-initdb.html#APP-INITDB-DATA-CHECKSUMS"
><SPAN
CLASS="APPLICATION"
>initdb</SPAN
></A
>
      for details about enabling data page checksums.
     </P
></LI
><LI
><P
>      Internal data structures such as <TT
CLASS="FILENAME"
>pg_clog</TT
>, <TT
CLASS="FILENAME"
>pg_subtrans</TT
>, <TT
CLASS="FILENAME"
>pg_multixact</TT
>,
      <TT
CLASS="FILENAME"
>pg_serial</TT
>, <TT
CLASS="FILENAME"
>pg_notify</TT
>, <TT
CLASS="FILENAME"
>pg_stat</TT
>, <TT
CLASS="FILENAME"
>pg_snapshots</TT
> are not directly
      checksummed, nor are pages protected by full page writes. However, where
      such data structures are persistent, WAL records are written that allow
      recent changes to be accurately rebuilt at crash recovery and those
      WAL records are protected as discussed above.
     </P
></LI
><LI
><P
>      Individual state files in <TT
CLASS="FILENAME"
>pg_twophase</TT
> are protected by CRC-32.
     </P
></LI
><LI
><P
>      Temporary data files used in larger SQL queries for sorts,
      materializations and intermediate results are not currently checksummed,
      nor will WAL records be written for changes to those files.
     </P
></LI
></UL
><P>
  </P
><P
>   <SPAN
CLASS="PRODUCTNAME"
>PostgreSQL</SPAN
> does not protect against correctable memory errors
   and it is assumed you will operate using RAM that uses industry standard
   Error Correcting Codes (ECC) or better protection.
  </P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="wal.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
ACCESSKEY="H"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="wal-intro.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Reliability and the Write-Ahead Log</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="wal.html"
ACCESSKEY="U"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Write-Ahead Logging (<ACRONYM
CLASS="ACRONYM"
>WAL</ACRONYM
>)</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>