Śledzę dziennik wolnych zapytań witryny opartej na WP (z domyślną wartością long_query_time ustawioną na 10) i zauważyłem, że następujące zapytanie jest często rejestrowane -
# User@Host: root[root] @ localhost []
# Query_time: 0 Lock_time: 0 Rows_sent: 394 Rows_examined: 458
SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes';
Nie rozumiem, jak wykonanie tak małego stołu może zająć tyle czasu. Czy to tylko objaw jakiegoś innego problemu? (Obecnie uruchomione Moodle, phpbb i WP na dedykowanej maszynie wirtualnej).
źródło
Natknąłem się na zapytanie wspomniane w mytopie uruchomionym na moim serwerze kilka dni temu - i rzeczywiście zajęło to sporo czasu (około 10 sekund) dla każdego zapytania! Są więc sytuacje w świecie rzeczywistym, w których wp_options może wzrosnąć do problematycznych rozmiarów. W moim przypadku podejrzewam, że wtyczka buforująca Cachify jest odpowiedzialna za wzdęcie wp_options.
Dane tego konkretnego wp_options:
Jako rozwiązanie dodałem indeks podobny do rozwiązania opublikowanego przez Vinay Pai, który rozwiązał problem bezbłędnie.
źródło
Moja tabela wp_options zawierała tylko około 235 wierszy danych. Próbowałem indeksować tabelę, ale to nie pomogło.
Okazuje się, że około 150 opcji przejściowych zostało wstawionych do tabeli, ale nie zostało automatycznie usuniętych.
Nie wiem, czy jest to powiązane, czy nie, ale przeglądałem moje pliki /var/log/apache2/access.log i zauważyłem, że wiele (prawdopodobnie zagrożonych) serwerów Amazon Web Services (adresy IP zaczynające się od 54). XXX i 32.XXX) próbowały wykorzystać katalog /~web-root-dir/xmlrpc.php.
Po rozwiązywaniu problemów zapytałem tabelę wp_options o nazwy opcji zawierające „przejściowe”
wybierz * z wp_options gdzie nazwa_opcji jak „% transient %”;
Jednym z pól zwróconych z tego zapytania jest „wartość_opcji”, która ma typ danych LONGTEXT. Zgodnie z dokumentacją mySQL, pole LONGTEXT (dla każdego wiersza) może pomieścić do 4 gigabajtów danych.
Kiedy wykonałem zapytanie, niektóre wiersze (pamiętaj, że pracowały z wierszami zawierającymi „przejściowy”) zawierały ogromne ilości danych w polu option_value. Przeglądając wyniki, zobaczyłem również coś, co wyglądało jak próby wstrzyknięcia poleceń do procesu wp-cron z nadzieją, że zostaną one wykonane w cyklu (cyklach) crona.
Moim rozwiązaniem było usunięcie wszystkich „przejściowych” wierszy. Nie zaszkodzi to serwerowi, ponieważ wiersze „przejściowe” zostaną automatycznie ponownie wypełnione (jeśli powinny tam być).
Po wykonaniu tej czynności serwer ponownie zareagował.
Zapytanie o usunięcie tych wierszy:
USUŃ z wp_options gdzie nazwa_opcji jak „% transient %”;
Dodałem również adres IP AWS / 8 superbloków do mojej zapory ogniowej (-:
źródło