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:
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:
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:
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:
A teraz najciekawsze, czyli o ile zmniejszyła się tabela wp_posts:
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.
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.
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.
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ć)
Dziękuję za bardzo przydatne informacje. Szkoda, że tych opcji nie można zmienić z poziomu ustawień w kokpicie.