Felduzzadt wp_postmeta tábla tisztítása

WordPress 4 perc olvasás

A wp_postmeta tábla a bejegyzések, oldalak, termékek és rendelések kiegészítő adatait tárolja: minden egyedi mező, minden bővítménybeállítás egy-egy sor. Saját takarítója nincs. Ha egy bővítményt eltávolít, a sorai többnyire bent maradnak, mert kevés bővítmény törli az adatait távozáskor, és egy nagy verzióváltás után a régi kulcsnevek is ott ragadhatnak.

Egy webáruháznál a tábla így évek alatt milliós sorszámúra nő. Ezt három helyen érzi meg: a szűrős lekérdezések (például a termékszűrők) lassulnak, a mentés és a visszaállítás tovább tart, és a tárhely is fogy.

1. Mekkora a tábla, és mi van benne?

A táblák méretét a phpMyAdminban (cPanel Adatbázisok csoport) az adatbázis Szerkezet fülén látja. A sorok megoszlása kulcsnév szerint:

SELECT meta_key, COUNT(*) AS db
FROM 1vL7334_postmeta
GROUP BY meta_key
ORDER BY db DESC
LIMIT 40;

A táblaelőtag (a példában 1vL7334_) a WP Toolkittel telepített webhelyeken véletlenszerű; a sajátját a wp db prefix parancs írja ki, és a phpMyAdmin bal oldali listájában is látja. Parancssorból a lekérdezést a mysql paranccsal futtathatja; az aWh cPanel szerverein a wp db query nem működik (a proc_open le van tiltva). A jelszót tartalmazó ~/.my.cnf beállítását a WP-CLI használatáról szóló cikk írja le.

cd ~/public_html
P=$(wp db prefix); DB=$(wp config get DB_NAME)
mysql "$DB" -e "SELECT meta_key, COUNT(*) AS db FROM ${P}postmeta GROUP BY meta_key ORDER BY db DESC LIMIT 40"

2. Mi a felesleges?

Eltávolított bővítmények kulcsai. A kulcsnevek előtagja többnyire a bővítményre utal (_yoast_, _elementor_, _wc_, _aioseo_). Vesse össze a listát a telepített bővítményekkel:

wp plugin list --fields=name,status

Ha egy kulcscsalád nagy, és a bővítménye már nincs a listában, jó eséllyel törölhető. Ha nem biztos benne, keressen rá a kulcsnévre: a bővítmények dokumentációja vagy fóruma többnyire megmondja, melyik bővítményé.

Árva sorok, amelyek bejegyzése már nem létezik (például törölt rendelések vagy a lomtárból véglegesen törölt bejegyzések után):

SELECT COUNT(*)
FROM 1vL7334_postmeta pm
LEFT JOIN 1vL7334_posts p ON p.ID = pm.post_id
WHERE p.ID IS NULL;

Egészséges webhelyen ez nulla vagy nagyon kicsi szám.

WooCommerce-rendelések. Az újabb WooCommerce a rendeléseket saját táblákban tárolja (HPOS). Ha a webhelye átállt, és a szinkronizálás ki van kapcsolva, a régi rendelési adatok a wp_postmeta táblában még ott lehetnek. Ezeket ne kézzel törölje, hanem a WooCommerce saját eszközével (WooCommerce › Beállítások › Haladó › Funkciók), és csak miután meggyőződött róla, hogy a rendelések az új táblákban hiánytalanok.

3. Mentés

Mielőtt bármit töröl, mentse el az adatbázist:

mysqldump --single-transaction --no-tablespaces "$DB" > ~/postmeta-elott-$(date +%F).sql
tail -1 ~/postmeta-elott-$(date +%F).sql

Az utolsó sor legyen -- Dump completed on …. A phpMyAdmin Exportálás füle és a napi JetBackup mentés is jó (visszaállítás mentésből).

4. Törlés kis adagokban

Egyetlen nagy DELETE több százezer soron hosszan zárolja a táblát. Mivel minden bejegyzés- és rendelésmentés ír ebbe a táblába, a webhely ez idő alatt lelassul, a pénztár elakadhat, és a művelet a tárhely erőforráskorlátjába is beleütközhet. Töröljön inkább 5000 soros adagokban, rövid szünetekkel:

KULCS='_regibovitmeny_adat'
while :; do
  N=$(mysql "$DB" -N -e "DELETE FROM ${P}postmeta WHERE meta_key = '${KULCS}' LIMIT 5000; SELECT ROW_COUNT();")
  echo "törölve: $N"
  [ "$N" -eq 0 ] && break
  sleep 1
done

Minden kört kiír, és megáll, ha már nincs mit törölni. Az árva sorokra ugyanez a minta, a lekérdezés:

DELETE pm FROM 1vL7334_postmeta pm
LEFT JOIN 1vL7334_posts p ON p.ID = pm.post_id
WHERE p.ID IS NULL;

Ezt a formát a MySQL nem engedi LIMIT-tel; ha a találatok száma nagy, töröljön azonosító-tartományonként (például AND pm.meta_id < 100000, majd < 200000), vagy használja a WP-Optimize-hoz hasonló takarító bővítményt, amely szintén adagokban dolgozik.

SSH nélkül a phpMyAdmin SQL fülén ugyanezeket a lekérdezéseket futtathatja; a LIMIT 5000 változatot ismételje, amíg az érintett sorok száma nullára nem csökken.

5. A tábla tömörítése

A törölt sorok helye a táblán belül felszabadul, de a fájl a lemezen nem lesz kisebb, és a mentés sem gyorsul, amíg a táblát újra nem építi:

mysql "$DB" -e "OPTIMIZE TABLE ${P}postmeta"

A válaszban a Table does not support optimize, doing recreate + analyze instead megjegyzés normális (InnoDB-táblánál a MySQL így építi újra a táblát), a lényeg az utolsó sor OK állapota. A művelet néhány másodpercre-percre zárolja a táblát, ezért kis forgalmú időszakban futtassa. A phpMyAdminban: jelölje ki a táblát, és válassza a Tábla optimalizálása műveletet.

Ellenőrzés

Futtassa újra az első lekérdezést, és hasonlítsa össze a sorok számát és a tábla méretét. Nézze végig a webhely fontos részeit (termékoldalak, szűrők, pénztár, az oldalépítő sablonjai): ha valami hiányzik, egy még használt kulcsot törölt, és a mentésből visszaállíthatja.

Ha a wp_postmeta mellett az admin felület is lassú, a wp_options tábla automatikusan betöltött adatairól szóló cikk segít; ha az adatbázis a háttérfeladatok miatt nő, az Action Scheduler cikket olvassa el.

Vissza: WordPress leírások (39)