Can I remove transients in the wp_options table of my WordPress install?

MysqlDatabaseWordpress

Mysql Problem Overview


I have recently noticed that my wp_options table seems to be a bit large. It contains 1161 rows, and is about 2.1mb in size.

I have installed Clean Options. It looks like development stopped on the plugin back in 2010, but it still did the job.

I now have a long list of potentially orphaned entries. Is there an easy way to go about sorting these, and figuring out which to remove and which to keep? Also, could this be responsible for causing performance issues with the website?

Thank you for reading, any ideas are welcomed!

Update: The Clean Options plugin returned some transients in the list, which lead me to find out that there are several hundred transient files in the wp_options table. There are a whole bunch that look like:

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

and so on. Like I said, there are several hundred rows that take look like this. Is it safe to just dump them?

Thanks

Mysql Solutions


Solution 1 - Mysql

You can safetly dump them. Wordpress and some plugins will re-create transients as needed. A transient is more or less the stored value from a complex query. The results are saved as a transient so that the system doesn't have to perform a common query over and over, instead it just looks for the transient if it exists and hasn't expired. Of course, make a backup of your database before making a change lest something goes wrong!

After backing everything up, you can run a mysql statement like this:

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

[EDIT: statement fixed with escape characters, after comment suggestion]

Solution 2 - Mysql

You can delete transients as they will be recreated. There can be buildups of expired transients due to failure situations or design issues with some plugins. One way of coping with this is to remove expired transients while allowing current ones to perform their function. Purging only transients which are expired for a few days gives you a chance to monitor which plugins are resulting in stale transients, and take any action to fix issues or report issues.

The following will find any wp*option tables in the database and delete the five largest transient options which are more than a week stale. This gives long enough for any plugin to delete options which they are going to purge themselves.

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

Solution 3 - Mysql

Install the plugin Delete Expired Transients to automatically clean up the database on a daily basis.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRyanView Question on Stackoverflow
Solution 1 - MysqlLaneView Answer on Stackoverflow
Solution 2 - MysqlClearCrescendoView Answer on Stackoverflow
Solution 3 - MysqlJonas BerlinView Answer on Stackoverflow