我可以删除WordPress安装的wp_options表中的瞬态吗?

时间:2012-05-02 22:25:13

标签: mysql database wordpress wordpress-plugin

我最近注意到我的wp_options表似乎有点大。它包含1161行,大小约为2.1mb。

我已经安装了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...

等等。就像我说的,有几百行看起来像这样。转储它们是否安全?

由于

3 个答案:

答案 0 :(得分:127)

你可以安全地转储它们。 Wordpress和一些插件将根据需要重新创建瞬变。瞬态或多或少是复杂查询的存储值。结果将保存为瞬态,以便系统不必反复执行常见查询,而只是查找瞬态(如果存在且尚未过期)。当然,在进行更改之前,请备份数据库,以免出现问题!

在备份所有内容后,您可以运行如下的mysql语句:

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

[编辑:语句在评论建议后使用转义字符修复]

答案 1 :(得分:2)

您可以删除瞬态,因为它们将被重新创建。由于故障情况或某些插件的设计问题,可能会出现过期瞬态的累积。解决这个问题的一种方法是去除过期的瞬态,同时允许当前的瞬态执行其功能。只清除过期几天的瞬态,让您有机会监控哪些插件导致过时的瞬态,并采取任何措施来解决问题或报告问题。

以下内容将在数据库中找到任何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}

答案 2 :(得分:0)

安装插件Delete Expired Transients,以每天自动清理数据库。