Řada dnešních hostingů pro WordPress nabízí neomezený (nebo hodně dostatečný) prostor pro soubory, ale omezenější prostor pro databázi (SQL). Co dělat když vám dochází místo v databází?
U většiny hostingů si můžete připlatit na rozšíření databáze, ale možná je lepší se nejprve podívat, co vám vlastně v databázi zabírá místo.
Pokud máte přístup k administraci SQL serveru na hostingu (typicky něco jako PHPMyAdmin), tak začněte klidně tam – umožní vám to zjistit, která z tabulek zabírá nejvíc místa (má nejvíce záznamů) a podle toho se můžete rozhodnout co s tím.
Pokud se nechcete pouštět do ručního čištění (pomoci SQL příkazů) tak je vhodné zkusit některé z pluginů, které to usnadňuj – WPS Cleaner, WP-Sweep, Advanced Database Cleaner, WP Optimize
Nejčastějším důvodem velké databáze mohou být komentáře (wp_commentmeta) za předpokladu, že je máte povolené. A zejména pokud se vám tam procházejí spamovací komentářoví boti.
Druhý nejčastější bude wp_postmeta kde jsou detaily k (nejenom) článkům – má tendenci bobtnat revizemi, nemazat staré věci a vůbec dělat neplechu.
A samozřejmě wp_posts kde jsou všechny typy příspěvků (a nějaké další věci), za předpokladu. že máte web s hodně příspěvky.
Pro FeedIT.cz to byl například právě ten hlavní problém – 59 713 Posts and 785 122 Post Meta – v wp_postmeta bylo 615 845 duplikátů.
U (nejenom) WPS Cleaner ale pozor u hostingů, kde je nastavený velmi krátký PHP Timeout – některé z funkcí (zejména kontrola souborů) mohou být tak časově náročné, že to prostě PHP Timeout znemožní.
Po promazání ale stejně budete zpravidla potřebovat nějaký ten phpMyAdmin – promazané tabulky totiž můžete zkusit optimalizovat aby zmizely smazané věci. Zpravidla se to dělá v přehledu tabulek pro každou jednotlivou (a WP Sweep to umí vyvolat). Samozřejmě to můžete udělat ručně přes SQL příkaz. Celé to ale může mít háček, že se nic s ohledem na velikost SQL databáze nezmění – bude to záležet na nastavení SQL Serveru. Každopádně by to ale mělo pomoci v zastavení růstu – vzniklé volné místo se bude recyklovat.
Chybí-li vám přihlašovací údaje pro SQL server tak to má poměrně snadné řešení – ve wp-config.php na vašem webu najdete jak ID, tak heslo, Případně si můžete v administraci většinou vytvořit dalšího uživatele jen pro sebe.
Pokud se budete rozhodovat mezi WP Sweep a WPS Cleaner, tak možná zkuste ten první – trochu líp ukazuje čísla. Oba ale v zásadě umí přesně to samé a rozhodně neumí vyřešit všechny problémy.
POZNÁMKA: Váš webhosting by měl varovat včas, když se plní databáze – Blueboard to posílá e-mailem (a i SMS, velmi užitečné) když je na 80 % dostupného prostoru (1 GB). Pokud to nedělá a máte kombinaci menšího prostoru vs. větší web, tak to může být komplikace.
Pokud byste chtěli plugin co vám ukáže velikost tabulek v KB/MB tak Advanced Database Cleaner pomůže víc než dvě předchozí.
A pokud byste třeba chtěli zjistit co máte ve wp_posts a co tam zabírá místo, tak třeba takto:
SELECT
post_type,
ROUND(
SUM(
LENGTH(
CONCAT(
ID, post_author, post_date, post_date_gmt, post_content, post_title, post_excerpt, post_status, comment_status, ping_status, post_password, post_name, to_ping, pinged, post_modified, post_modified_gmt, post_parent, guid, menu_order, post_type
)
)
)/1048567, 2
),
COUNT(*)
FROM wp_posts
GROUP BY post_type
Případně detailnější rozpis podle “větších” polí (dívá se i na post_content_filtered kde by v principu nic nemělo být, ale může k tomu dojít)
SELECT post_type,
ROUND(SUM(LENGTH(post_content))/1024/1024,2) as Content,
ROUND(SUM(LENGTH(post_title))/1024/1024,2) as Title,
ROUND(SUM(LENGTH(post_excerpt))/1024/1024,2) as Excerpt,
ROUND(SUM(LENGTH(to_ping))/1024/1024,2) as ToPing,
ROUND(SUM(LENGTH(pinged))/1024/1024,2) as Pinged,
ROUND(SUM(LENGTH(post_content_filtered))/1024/1024,2) as ContentFiltered,
COUNT(*)
FROM wp_posts
GROUP BY post_type
Stejně tak se může hodit podívat se na velikost tabulek a indexu. Musíte tam jenom vyměnit “database_name” za jméno té vaší
SELECT table_name AS "Table",
ROUND(((data_length + index_length) / 1024 / 1024), 2) AS "Size (MB)"
FROM information_schema.TABLES
WHERE table_schema = "database_name"
ORDER BY (data_length + index_length) DESC;
Pokud byste chtěli vidět zvlášť data a zvlášť indexy
SELECT table_name AS "Table",
ROUND(data_length/ 1024 / 1024, 2) AS "data (MB)",
ROUND(index_length/ 1024 / 1024, 2) AS "index (MB)"
FROM information_schema.TABLES
WHERE table_schema = "database_name"
ORDER BY (data_length + index_length) DESC;
WHERE řádku mimochodem můžete vynechat, pak se vám to ukáže prostě pro všechny tabulky, které v databázi máte.



