Jak oczyścić bazę WordPressa i zmniejszyć jej rozmiar

Z WordPressa korzystam od ponad 2 lat, w miarę systematycznie publikuję wpisy od roku. Ostatnio postanowiłem sprawdzić, jaki jest rozmiar bazy danych mysql, na której działa moja strona. Zalogowałem się do phpmyadmin i zobaczyłem, że największa tabela bazy – wp_posts ma ponad 2MB. Wydało mi się to trochę sporo, tym bardziej, że miałem wtedy nieco ponad 40 opublikowanych wpisów. Zacząłem przeglądać tą tabelę i zauważyłem, że prócz tekstu wpisów, są w niej również przechowywane informacje o załącznikach, np. zdjęciach. Moją uwagę przykuły wpisy, które występowały nawet 40 razy. Miały różne ID, ale ten sam post_title. Analizując dalej, różne były również pola post_status  – inherit, publish, draft czy future, podobnie pole post_type – revision, attachment, post.

Wystarczyła chwila poszukiwań w internecie i wszystko stało się jasne – każde zapisanie pisanego postu i autozapisanie jest umieszczone jako osobny rekord w bazie. I tak można mieć 50 wersji jednego wpisu, utworzonych podczas jego tworzenia. Znalazłem też zapytanie SQL, które usuwa z bazy “wersje robocze” wpisów. Po jego wykonaniu, rozmiar tabeli zmniejszył się ponad 10-krotnie! Oczywiście z bazy nie zniknęły potrzebne rekordy z opublikowanymi wpisami, nieopublikowanymi szkicami i informacjami o załącznikach.

Poniżej kilka screenów z przeprowadzonej optymalizacji bazy, która nie była czyszczona przez miesiąc. Najpierw zrzut z rozmiarem tabeli przed odśmiecaniem:

Baza przed optymalizacją

Jak widać – ponad 700kB.

Następnie w phpmyadmin należy wykonać kopię bazy danych – tak dla bezpieczeństwa, ja korzystam z ustawień zalecanych przez wsparcie WordPressa. Przechodzimy do zakładki Eksport, w polu Eksport wybieramy opcję “Zaznacz wszystkie” co spowoduje podświetlenie wszystkich tabel, reszta ustawień jak na zrzucie:

Ustawienia backupu

Wciśnięcie [Wykonaj] spowoduje ściągnięcie przez przeglądarkę kopii bazy. Wykonanie kopii jest niezbędne i pozwoli nam przywrócić wszystkie dane w razie ich przypadkowego usunięcia.

Teraz czas na wykonanie zapytania SQL, które usunie niepotrzebne rekordy. w phpmyadmin przechodzimy do zakładki “SQL” i w polu Zapytanie SQL dla bazy danych wpisujemy:

DELETE FROM wp_posts WHERE post_status = 'inherit' AND post_type != 'attachment';

Zapytanie spowoduje usunięcie rekordów z tabeli wp_posts, które w polu post_status będą miały wpis inherit, a pole post_type będzie miało każdy innym wpis od attachment. Tak to wyglądało u mnie:

Zapytanie oczyszczające

Po wciśnięciu [Wykonaj] u mnie pojawiło się okno przeglądarki z pytaniem, czy na pewno ma zostać wykonana operacja, po kliknięciu [OK], wyświetliło się podsumowanie – u mnie zostało usuniętych 55 rekordów:

Po wykonaniu zapytania

A teraz najciekawsze, czyli o ile zmniejszyła się tabela wp_posts:

Rozmiar po optymalizacji

W moim przypadku było to ponad 300kB – czyli prawie o połowę, po miesiącu, w czasie którego opublikowałem tylko 5 wpisów. Na koniec warto jeszcze sprawdzić, czy wszystko działa, a ze strony nie poznikały wpisy czy zdjęcia.

Cały proces można sobie zautomatyzować – są do tego celu przeznaczone specjalne wtyczki, można też napisać sobie skrypt, który będzie uruchamiał cron, np. co tydzień. Ja wykonuję jednak to ręcznie od czasu do czasu.

Możesz również polubić…

5 komentarzy

  1. Michał pisze:

    Bardzo przydatny wpis. Co prawda prowadzę stronę opartą na WordPressie od niedawna ale z pewnością w chwili wolnej zerknę ile zajmuje moja baza danych oraz co się w niej znajduje.

  2. elpcmaniak pisze:

    Bardzo pomocny artykuł. Wykonałem właśnie czyszczenie mojej bazy danych według Twojego opisu i moim oczom i ku mojemu zdziwieniu ukazała się zdecydowana różnica, tzn. wielkość tabeli wp_posts z ponad 5 MB zmniejszyła się do 737.2 KB. Oczywiście w razie “W” wykonałem kopię bazy danych.

  3. Sławek pisze:

    Sytemem rewizji wpisów w WP można sterować za pomocą wpisu do pliku wp_config:

    define(‘WP_POST_REVISIONS’, false); – wyłączenie rewizji (każdy post będzie zapisywany raz i po uaktualnieniu stara zawartość będzie nadpisywana nową)

    lub
    define(‘WP_POST_REVISIONS’, 3); – pozostawienie trzech ostatnich rewizji (liczbę można zmieniać)

  1. 11.08.2013

    […] na istniejącej już, nowej i pustej bazie danych mysql. Wykonanie backupu opisałem tutaj: Jak oczyścić bazę WordPressa i zmniejszyć jej rozmiar. Podobny opis można znaleźć tutaj: WordPress […]

Leave a Reply

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.