Total surprise. Couple of days ago my wife was driving open convertible, and today we have around 0° (celsius) and snow. And it looks rather nice.
View from my home entrance:
and from my office in basement:
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?
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 😉
One of my clients hit a strange limitation – apparently you cannot inherit CREATE ROLE privilege.
First, let's test if it's really true:
Continue reading CREATE ROLE privilege cannot be inherited?!
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 🙂
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
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.
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
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