【问题标题】:Can I remove transients in the wp_options table of my WordPress install?我可以在我的 WordPress 安装的 wp_options 表中删除瞬态吗?
【发布时间】:2012-05-12 10:45:35
【问题描述】:

我最近注意到我的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...

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

谢谢

【问题讨论】:

  • 也许我们可以开始一个(表格)不良插件列表以附加到这个问题?已知会淹没 wp_options 的插件。列表中的第一个是“Flare”插件,它添加了社交媒体共享图标。条目看起来像这样“_transient_flare”刚刚从一个博客中删除了这个垃圾的 353611 行 (1 Gig),它已经填满了 InnoDB 缓存。

标签: mysql database wordpress


【解决方案1】:

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

备份所有内容后,您可以像这样运行 mysql 语句:

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

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

【讨论】:

  • '%\_transient\_%'。不要忘记_ 是一个单字符wildcard
  • 我添加了AND option_value < {$time}; 以确保我删除了旧的瞬态。
  • 应该使用 $wpdb->prefix 而不是 wp_ 以便它适用于任何 wordpress db.. 甚至 $wpdb->options 并替换整个东西
【解决方案2】:

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

以下将查找数据库中的任何 wp*option 表并删除超过一周陈旧的五个最大的临时选项。这为任何插件提供了足够长的时间来删除它们将自行清除的选项。

#!/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}

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多