2012-05-02 64 views
43

我最近注意到我的wp_options表似乎有點大。它包含1161行,大小約爲2.1mb。我可以在我的WordPress安裝的wp_options表中刪除瞬變嗎?

我已經安裝Clean Options。它似乎在2010年停止了插件的開發,但它仍然完成了這項工作。

我現在有一個很長的潛在孤兒條目列表。有沒有簡單的方法去分類這些,並找出哪些要刪除和保留?另外,這可能是導致網站性能問題的原因嗎?

謝謝您的閱讀,歡迎任何想法!

更新:Clean Options插件返回列表中的一些瞬變,這導致我發現wp_options表中有幾百個瞬態文件。有一大堆,看起來像:

  • _site_transient_browser_5728a0f1503de54634b3716638...
  • _site_transient_timeout_browser_03df11ec4fda7630a5...
  • _transient_feed_83dcaee0f69f63186d51bf9a4...
  • _transient_plugin_slugs
  • _transient_timeout_feed_83dcaee0f69f63186d51bf9a4b...

等。就像我說的,有幾百行看起來像這樣。轉儲它們是否安全?

謝謝

+0

也許我們可以啓動一個(表)列表的壞插件附加到這個問題?已知可以淹沒wp_options的插件。名單中的第一個,即「Flare」插件,它增加了社交媒體共享圖標。條目看起來像這樣「_transient_flare」從一個已經填滿了InnoDB緩存的博客中刪除了這個垃圾的353611行(1 Gig)。 –

回答

114

你可以安全地轉儲它們。 Wordpress和一些插件將根據需要重新創建瞬變。瞬態或多或少是來自複雜查詢的存儲值。結果被保存爲一個瞬態,以便系統不必一遍又一遍地執行常見查詢,而只是查找瞬態,如果它存在並且沒有過期。當然,在進行更改之前先備份數據庫,以免出現問題!

備份就緒後,您可以運行MySQL的聲明是這樣的:

DELETE FROM `wp_options` WHERE `option_name` LIKE ('%\_transient\_%') 

[編輯:聲明固定轉義字符,意見建議後]

+15

''%\ _ transient \ _%''。不要忘記'_'是單字符[通配符](http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html)。 –

+3

如果我能 - 我會三倍投票這個答案 - 謝謝! –

+0

我添加了'AND option_value <{$ time};'以確保我刪除了舊瞬變。 – Mohit

1

您可以刪除瞬變他們將被重新創建。由於故障情況或某些插件的設計問題,可能會產生過期瞬變。應對這種情況的一種方法是消除過期的瞬變,同時允許當前的瞬變執行其功能。只清除過期幾天的瞬態會讓您有機會監視哪些插件導致陳舊的瞬變,並採取任何措施解決問題或報告問題。

以下將查找數據庫中的任何wp *選項表,並刪除超過一週陳舊的五個最大瞬態選項。這足以讓任何插件刪除他們將要清除的選項。

#!/bin/bash 

DBNAME="mydatabase" 
DBUSER="${USER}" 
DBPASSWD="secret" 
MYSQLBIN=/usr/bin/mysql # OR MYSQLBIN=/usr/local/mysql/bin/mysql 
MYSQL="${MYSQLBIN} -s -D ${DBNAME} -u ${DBUSER} -p${DBPASSWD}" 
TMP=/var/tmp/ 
ENTRIES_FILE="${TMP}entries.$$" 

# Find option tables 
for OPTION_TABLE in $(echo 'show tables like "%wp%options";' | ${MYSQL}) 
do 
    # Find up to five large long expired transients 
    ${MYSQL} > ${ENTRIES_FILE} <<EOF 
    select option_name from ${OPTION_TABLE} where option_name in 
     (select concat("_transient",substr(option_name,19)) 
      FROM ${OPTION_TABLE} WHERE option_name LIKE '_transient_timeout%' AND 
      option_value < UTC_TIMESTAMP() - INTERVAL 1 WEEK order by option_value) 
    order by length(option_value) desc limit 5; 
EOF 
    for OPTION in $(< ${ENTRIES_FILE}) 
    do 
     echo Deleting ${OPTION} from ${OPTION_TABLE} 
     echo delete from ${OPTION_TABLE} where option_name = \"${OPTION}\"\; | ${MYSQL} 
     if [[ $? -eq 0 ]]; then 
      echo delete from ${OPTION_TABLE} where option_name = \"_transient_timeout${OPTION:10}\"\; | ${MYSQL} 
     fi 
    done 
done 
rm -f ${ENTRIES_FILE} 
相關問題