MySQL: “Table ‘mysql.plugin’ doesn’t exist” after MySQL Upgrade

Want to help support this blog? Try out Oh Dear, the best all-in-one monitoring tool for your entire website, co-founded by me (the guy that wrote this blogpost). Start with a 10-day trial, no strings attached.

We offer uptime monitoring, SSL checks, broken links checking, performance & cronjob monitoring, branded status pages & so much more. Try us out today!

Profile image of Mattias Geniar

Mattias Geniar, December 01, 2010

Follow me on Twitter as @mattiasgeniar

After running a MySQL upgrade, you can run into the following problem which prevents you from starting MySQL successfully.

101126 10:29:53 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
101126 10:29:53 [Note] Plugin 'ndbcluster' is disabled.
 /usr/libexec/mysqld: Table 'mysql.plugin' doesn't exist
101126 10:29:53 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
101126 10:29:53  InnoDB: Started; log sequence number 1 3337694676
101126 10:29:53 [ERROR] Can't open and lock privilege tables: Table 'mysql.servers' doesn't exist
101126 10:29:53 [ERROR] Column count of mysql.db is wrong. Expected 22, found 20. Created with MySQL 50045, now running 50153. Please use mysql_upgrade to fix this error.
101126 10:29:41  InnoDB: Shutdown completed; log sequence number 1 3337694676

This is a real chicken and egg problem. To fix the problem, we need to run mysql_upgrade, but in order to run that command, MySQL needs to be functioning. And it won’t do that, until mysql_upgrade is run. Humpf.

It’s most commonly caused by an old my.cnf config file, which could be solved like this.

# cp /etc/my.cnf /etc/my.cnf_backup
# cp /etc/my.cnf.rpmnew  /etc/my.cnf
# /etc/init.d/mysqld start

The reason is because in MySQL 5.0, a config variable named “skip-bdb” would exist in the my.cnf, which was removed in MySQL 5.1. Alternatively, you could comment out the “skip-bdb” parameter in the my.cnf, and try restarting MySQL. A bugreport has already been filed.

After which you need to run the mysql_upgrade.

# mysql_upgrade -u <user> -p

Alternatives to check, if the above does not work, is:

  • Are all files in /var/lib/mysql (or whatever your MySQL datadir is), owned by mysql?
  • Are there old logfiles in /var/lib/mysql named “ib_logfile0” or “ib_logfile1”? If so; rename them, and try restarting MySQL.

Want to subscribe to the cron.weekly newsletter?

I write a weekly-ish newsletter on Linux, open source & webdevelopment called cron.weekly.

It features the latest news, guides & tutorials and new open source projects. You can sign up via email below.

No spam. Just some good, practical Linux & open source content.