Speeding up dump/restore process

As some of you know, I've been working lately for OmniTI company. When doing things for them (PostgreSQL related of course :), I stumbled on very interesting problem.

One of our clients is working on PostgreSQL 8.2, and wants to upgrade to 8.3. This is generally trivial – pg_dump, pg_restore/psql, and you're done.

But, this situation was with a twist – we had only very limited time-frame to do the migration. To be exact – we had 4 hours that we can bring the website down for.

So, we had to dump database, transfer it to new server, and load. All within 4 hours. Simple? Sure. Database was ~ 200GB (after restore – around 130GB). How to do it?

Continue reading Speeding up dump/restore process

[polish only] Historia ku pamięci … – aktualizacja

W piątek, 14 sierpnia, jakoś tak wieczorkiem dostałem maila od bliżej mi nie znanej osoby z firmy Luxmed.

Osoba ta, poprosiła o “pilny kontakt (niezależnie od godziny)", w sprawie “optymalizacji baz PostgreSQL".

Zadzwoniłem.

Okazało się, że potrzebują pomocy, i uważają, że dam radę jakoś “stuningować" Postgresa tak by działał szybciej. I że chodzi o pomoc w dniu jutrzejszym (tzn, w sobotę, 15 sierpnia).

Zapytał się mnie ten pan o oczekiwane wynagrodzenie, powiedział, że się skonsultuje i oddzwoni.

I faktycznie – oddzwonił jeszcze z 20 minut później, z pytaniem czy nie dałoby się taniej. Stwierdziłem, że skoro chcą bym pomógł w sobotę, i mam nie być jednym pracującym, to znaczy, że mają jakieś problemy – i to pewnie istotne. Może deadline na poniedziałek? Może jakaś większa awaria. Trzeba pomóc – nigdy nie wiadomo co i kiedy się komu przydarzy.

Zgodziłem się na zaproponowaną stawkę (około 70% tego co ja powiedziałem). Po czym okazało się, że mam przyjechać do nich do biura następnego dnia na 8. Powiem szczerze – w tym momencie sobie już “plułem w brodę" – praca z dojazdem? do tuningu Postgresa? za 70% standardowej stawki? No ale cóż. Już powiedziałem, że się zgadzam, firma spora, więc może to u nich standard, że trzeba przyjechać, bo np. dostęp z zewnątrz niemożliwy.

OK. Pojechałem. Pracowałem w ustalonym wymiarze, po czym zostałem poproszony czy mógłbym jeszcze zostać dłużej – nie mogłem.

I tu by zasadniczo się sprawa skończyła, gdyby nie prosty fakt.

17 sierpnia (w poniedziałek po tej sobocie) wystawiłem im fakturę i wysłałem. Na ustaloną wcześniej i potwierdzoną kwotę.

Ponieważ płatności mogą być np. robione hurtem na początku miesiąca, nie sprawdzałem czy przyszły za często, ale 4 września (prawie 3 tygodnie później), napisałem z pytaniem kiedy mogę się spodziewać przelewu.

Dostałem odpowiedź:

Spodziewałem się, że już ma Pan odpowiednią kwotę na koncie.
W poniedziałek sprawdzę w księgowości (dzisiaj przeprowadza się biuro).

I od tej pory cisza.

Od tamtej pory napisałem jeszcze dwukrotnie (9 i 12) września, i cisza. brak odpowiedzi, brak “już płacimy" czy “zapłacimy za miesiąc" czy “mamy cię w …, odwal się".

Czemu o tym piszę? Jako przestrogę dla innych. Z tego co się dowiedziałem tą bazą zajmuje się dalej znajoma firma – mam nadzieję, że im zapłacą. A jak nie – to pewnie będą szukać kolejnego “łosia".

AKTUALIZACJA

Przelew wpłynął. 22 września. wystarczyło 5 tygodni. i post na blogu 😉

Getting random interfacelift wallpaper

Just thought I'll share it – maybe somebody else will use it.

I'm using KDE 3.5, so the final “dcop …" command, simply sets the file as current wallpaper.

I also use 1680×1050 resolution – which you can probably guess from the code 🙂

#!/usr/bin/perl -w
use strict;
use English qw( -no_match_vars );
use WWW::Mechanize;
 
my $agent = WWW::Mechanize->new();
 
$agent->get("http://interfacelift.com/wallpaper_beta/downloads/random/widescreen/1680x1050/");
exit unless 200 == $agent->res->code;
 
my @links = $agent->find_all_links(
    'url_regex' => qr{1680x1050.jpg},
);
exit if 0 == scalar @links;
 
$agent->get( $links[ rand @links ] );
exit unless 200 == $agent->res->code;
 
my $username = getpwuid( $REAL_USER_ID );
my $filename = '/tmp/interfacelift.' . $username . '.jpg';
 
open my $fh, '>', $filename or exit;
binmode $fh;
print $fh $agent->res->decoded_content;
close $fh;
 
$ENV{"DISPLAY"} = ':0';
system( qw( /usr/bin/dcop kdesktop KBackgroundIface setWallpaper ), $filename, 4 );
 
exit;

Pretty simplistic, but it does the job. Now, I add this line to my crontab:

*/5  * * * * /home/depesz/bin/interfacelift.pl

And enjoy new, nice wallpaper every 5 minutes 🙂

Waiting for 8.5 – Machine readable EXPLAIN

After very long discussions, on 10th of August, Tom Lane committed patch by Robert Haas:

Log Message:
-----------
Extend EXPLAIN to support output in XML or JSON format.
 
There are probably still some adjustments to be made in the details
of the output, but this gets the basic structure in place.
 
Robert Haas

Continue reading Waiting for 8.5 – Machine readable EXPLAIN

Waiting for 8.5 – Multi-threaded pgbench

On 3rd of August, Tatsuo Ishii committed patch by ITAGAKI Takahiro:

Log Message:
-----------
Multi-threaded version of pgbench contributed by ITAGAKI Takahiro,
reviewed by Greg Smith and Josh Williams.
 
Following is the proposal from ITAGAKI Takahiro:
 
Pgbench is a famous tool to measure postgres performance, but nowadays
it does not work well because it cannot use multiple CPUs. On the other
hand, postgres server can use CPUs very well, so the bottle-neck of
workload is *in pgbench*.
 
Multi-threading would be a solution. The attached patch adds -j
(number of jobs) option to pgbench. If the value N is greater than 1,
pgbench runs with N threads. Connections are equally-divided into
them (ex. -c64 -j4 => 4 threads with 16 connections each). It can
run on POSIX platforms with pthread and on Windows with win32 threads.
 
Here are results of multi-threaded pgbench runs on Fedora 11 with intel
core i7 (8 logical cores = 4 physical cores * HT). -j8 (8 threads) was
the best and the tps is 4.5 times of -j1, that is a traditional result.
 
$ pgbench -i -s10
$ pgbench -n -S -c64 -j1   =>  tps = 11600.158593
$ pgbench -n -S -c64 -j2   =>  tps = 17947.100954
$ pgbench -n -S -c64 -j4   =>  tps = 26571.124001
$ pgbench -n -S -c64 -j8   =>  tps = 52725.470403
$ pgbench -n -S -c64 -j16  =>  tps = 38976.675319
$ pgbench -n -S -c64 -j32  =>  tps = 28998.499601
$ pgbench -n -S -c64 -j64  =>  tps = 26701.877815
 
Is it acceptable to use pthread in contrib module?
If ok, I will add the patch to the next commitfest.

Continue reading Waiting for 8.5 – Multi-threaded pgbench

Getting session variables without touching postgresql.conf

This post has been updated with new code that uses temporary table – the code is at the end of post!

There was this question on Stack Overflow.

For future reference: guy asked how to do session variables – i.e. something he could define once in session, and later reuse in standard sql queries – without modifying postgresql.conf – so usage of custom_variable_classes is forbidden 🙂

While I don't actually see why somebody would want to avoid modifying its postgresql.conf (short of “it's shared hosting and I don't have superuser privileges"), I thought that it will be rather simple, and at the same time, rather interesting.

So, let's do it:

Continue reading Getting session variables without touching postgresql.conf

Waiting for 8.5 – hinting for number of distinct values

Robert Haas wrote, and Tom Lane committed (on 2nd of August) patch which adds interesting capability:

Log Message:
-----------
ADD ALTER TABLE ... ALTER COLUMN ... SET STATISTICS DISTINCT
 
Robert Haas

Log message is rather terse, so what does it exactly do?

Continue reading Waiting for 8.5 – hinting for number of distinct values

Waiting for 8.5 – better messages for unique violation

On 1st of August Tom Lane committed patch from Itagaki Takahiro:

Improve unique-constraint-violation error messages to include the exact
values being complained of.
 
In passing, also remove the arbitrary length limitation in the similar
error detail message for foreign key violations.
 
Itagaki Takahiro

and later added an extension to it:

Department of second thoughts: let's show the exact key during unique index
build failures, too.  Refactor a bit more since that error message isn't
spelled the same.

Continue reading Waiting for 8.5 – better messages for unique violation