不知道是不是每次更新 MySQL 软件之后都需要执行数据库升级指令?在我进行过的几次软件升级之后,总会在 MySQL 的日志中见到“[ERROR] Missing system table mysql.proxies_priv; please run mysql_upgrade to create it”之类的错误。虽然这个错误修复起来很简单,却不容易引起注意。
1. 错误描述¶
我在好几次见到这样的错误提示之后才决定好好看看到底写了些什么。因为网站运行很正常,就心想应该不怎么重要吧。错误提示大致内容如下(已将前导的日期时间略去):
[ERROR] Missing system table mysql.proxies_priv; please run mysql_upgrade to create it [ERROR] Native table 'performance_schema'.'events_waits_current' has the wrong structure [ERROR] Native table 'performance_schema'.'events_waits_history' has the wrong structure [ERROR] Native table 'performance_schema'.'events_waits_history_long' has the wrong structure [ERROR] Native table 'performance_schema'.'setup_consumers' has the wrong structure [ERROR] Native table 'performance_schema'.'setup_instruments' has the wrong structure [ERROR] Native table 'performance_schema'.'setup_timers' has the wrong structure [ERROR] Native table 'performance_schema'.'performance_timers' has the wrong structure [ERROR] Native table 'performance_schema'.'threads' has the wrong structure [ERROR] Native table 'performance_schema'.'events_waits_summary_by_thread_by_event_name' has the wrong structure [ERROR] Native table 'performance_schema'.'events_waits_summary_by_instance' has the wrong structure [ERROR] Native table 'performance_schema'.'events_waits_summary_global_by_event_name' has the wrong structure [ERROR] Native table 'performance_schema'.'file_summary_by_event_name' has the wrong structure [ERROR] Native table 'performance_schema'.'file_summary_by_instance' has the wrong structure [ERROR] Native table 'performance_schema'.'mutex_instances' has the wrong structure [ERROR] Native table 'performance_schema'.'rwlock_instances' has the wrong structure [ERROR] Native table 'performance_schema'.'cond_instances' has the wrong structure [ERROR] Native table 'performance_schema'.'file_instances' has the wrong structure [Note] Event Scheduler: Loaded 0 events [Note] /usr/libexec/mysqld: ready for connections. Version: '5.5.20-log' socket: '/var/lib/mysql/mysql.sock' port: 0
有时候可能还会多点儿如下内容:
[ERROR] Incorrect definition of table mysql.proc: expected column 'comment' at position 15 to have type text, found type char(64).
一般看到结尾提示个 ready for connections 一般也就没心思去看前面都提示了什么东西了。我也是有一次在 x86_64 位 CentOS 中的 MySQL 日志中见到了多出来的这个 ERROR 信息才决定好好看看的前面的错误提示的。(水景一页是运行在 32 位 CentOS 上的。)
可是见到错误提示句子结构都差不多就没有仔细往前翻,所以我开始还重新安装了一遍 MySQL 软件包。后来才看到每次执行
service mysql restart
重起 MySQL服务的时候都会出现这样的错误提示。然后该错误提示开头还说了,让执行
mysql_upgrade
指令来修复。才恍然大悟,估计是升级了 MySQL 的软件包,管理数据库的某些表结构发生了变化,所以还需要升级数据库。
2. 修复¶
需要按照如下的格式在 Linux 的 —— 而不是 MySQL 的 —— 命令提示符下运行:
mysql_upgrade -u root -p
然后根据提示输入 mysql 的 root 帐户密码,修复过程就可自动运行。此时会有如下形式的提示信息输出:
mysql_upgrade -u root -p Enter password: Looking for 'mysql' as: mysql Looking for 'mysqlcheck' as: mysqlcheck Running 'mysqlcheck' with connection arguments: '--port=3306' '--socket=/var/lib/mysql/mysql.sock' Running 'mysqlcheck' with connection arguments: '--port=3306' '--socket=/var/lib/mysql/mysql.sock' wp_commentmeta OK wp_comments OK wp_links OK wp_options OK wp_postmeta OK wp_posts OK wp_term_relationships OK wp_term_taxonomy OK wp_terms OK wp_usermeta OK wp_users OK mysql.columns_priv OK mysql.db OK mysql.event OK mysql.func OK mysql.general_log OK mysql.help_category OK mysql.help_keyword OK mysql.help_relation OK mysql.help_topic OK mysql.host OK mysql.ndb_binlog_index OK mysql.plugin OK mysql.proc OK mysql.procs_priv OK mysql.servers OK mysql.slow_log OK mysql.tables_priv OK mysql.time_zone OK mysql.time_zone_leap_second OK mysql.time_zone_name OK mysql.time_zone_transition OK mysql.time_zone_transition_type OK mysql.user OK Running 'mysql_fix_privilege_tables'... OK
看来每次在 Linux 中升级了 MySQL 软件包之后都需要进行类似的数据库升级操作。唉,火星了。©
本文发表于水景一页。永久链接:<http://cnzhx.net/blog/mysql_upgrade-fix-structure-error/>。转载请保留此信息及相应链接。
说明你安装的mysql并不是centos默认源的吧。
我的mysql日志里面就没你这些东西。
我运行的是centos 32位 5.8的。
嗯,不是。
你的MySql升级过吗?
有,通过yum update的官方包。
看来还真是因为我用的不是 CentOS 的官方包啊。
你是不是觉得centos里面默认的mysql版本包太低了? 所以才使用了三方包?
我刚开始,咋一看,centos的包都是有点历史的,包括tomcat包也一样,这点同ubuntu这些更新,差异有点大。但现在用起来,也没啥感觉了,旧就旧点吧。
好像你用的是centos 6吧,看你上回iptables的版本号是1.4开头的了,5的不是1.4的好像
是的,CentOS 是 6.2。我为了直接用 REMI 的 phpMyAdmin 的包,就按照要求升级了 MySQL,倒不是嫌它版本低。之前在安装记录里提过的。
phpmyadmin的源,好像centos默认里面,也有新的。名字叫phpmyadmin3什么之类的。就好像php包一样,有Php也有Php53。
反正现在环境也已经搭配好了,就不管这些了。
CentOS 默认也有 phpMyAdmin 的吗?我当时找了好久没找到,就安装了 Remi 的。
我就添加了一个Extra Packages for Enterprise Linux源,这个应该也可以称为官方的吧。
如果算的话,那就有。phpmyadmin好像是2系列版本,phpmyadmin3是3系列版本。
倒,说了半天咱用的是一样的。你说的这个简称 EPEL。不过我安装的时候用了 Remi 的依赖包。简言之,我同时用了 EPEL 和 Remi 两个源,现在也搞不清楚了 :D
呵呵,我以为epel源是由Fedora来维护,就当成是官方的了。 我发现epel的话,好像一般使用centos都是有选择上的。
是这样。至于他们之间的渊源就懒得去搞清楚了,能用就好。