简体   繁体   English

设置 MySQL 时出错:表 'mysql.plugin' 不存在

[英]Error setting up MySQL: Table 'mysql.plugin' doesn't exist

I have a MySQL 5.7 instance running without problems on Ubuntu 16, but when i try to install any other package or try to update existing ones through apt-get, i get the following error:我有一个 MySQL 5.7 实例在 Ubuntu 16 上运行没有问题,但是当我尝试安装任何其他 package 或尝试更新现有的错误时:

# apt-get upgrade

Setting up mysql-server-5.7 (5.7.20-0ubuntu0.16.04.1) ...
Checking if update is needed.
Checking server version.
Running queries to upgrade MySQL server.
mysql_upgrade: [ERROR] 1146: Table 'mysql.plugin' doesn't exist
mysql_upgrade failed with exit status 5
 dpkg: error processing package mysql-server-5.7 (--configure):
  subprocess installed post-installation script returned error exit status 1
No apport report written because the error message indicates its a followup error from a previous failure.
dpkg: dependency problems prevent configuration of mysql-server:
mysql-server depends on mysql-server-5.7; however:
Package mysql-server-5.7 is not configured yet.

dpkg: error processing package mysql-server (--configure):
 dependency problems - leaving unconfigured
Errors were encountered while processing:
 mysql-server-5.7
 mysql-server

And if i run a mysqlcheck , it looks like some of the system tables exists but others are missing:如果我运行mysqlcheck ,看起来有些系统表存在,但其他表缺失:

mysql.columns_priv                                 OK
mysql.db                                           OK
mysql.engine_cost
Error    : Table 'mysql.engine_cost' doesn't exist
status   : Operation failed
mysql.event                                        OK
mysql.func                                         OK
mysql.general_log                                  OK
mysql.gtid_executed
Error    : Table 'mysql.gtid_executed' doesn't exist
status   : Operation failed
mysql.help_category
Error    : Table 'mysql.help_category' doesn't exist
status   : Operation failed
mysql.help_keyword
Error    : Table 'mysql.help_keyword' doesn't exist
status   : Operation failed
mysql.help_relation
Error    : Table 'mysql.help_relation' doesn't exist
status   : Operation failed
mysql.help_topic
Error    : Table 'mysql.help_topic' doesn't exist
status   : Operation failed
mysql.innodb_index_stats
Error    : Table 'mysql.innodb_index_stats' doesn't exist
status   : Operation failed
mysql.innodb_table_stats
Error    : Table 'mysql.innodb_table_stats' doesn't exist
status   : Operation failed
mysql.ndb_binlog_index                             OK
mysql.plugin
Error    : Table 'mysql.plugin' doesn't exist
status   : Operation failed
mysql.proc                                         OK
mysql.procs_priv                                   OK
mysql.proxies_priv                                 OK
mysql.server_cost
Error    : Table 'mysql.server_cost' doesn't exist
status   : Operation failed
mysql.servers
Error    : Table 'mysql.servers' doesn't exist
status   : Operation failed
mysql.slave_master_info
Error    : Table 'mysql.slave_master_info' doesn't exist
status   : Operation failed
mysql.slave_relay_log_info
Error    : Table 'mysql.slave_relay_log_info' doesn't exist
status   : Operation failed
mysql.slave_worker_info
Error    : Table 'mysql.slave_worker_info' doesn't exist
status   : Operation failed
mysql.slow_log                                     OK
mysql.tables_priv                                  OK
mysql.time_zone
Error    : Table 'mysql.time_zone' doesn't exist
status   : Operation failed
mysql.time_zone_leap_second
Error    : Table 'mysql.time_zone_leap_second' doesn't exist
status   : Operation failed
mysql.time_zone_name
Error    : Table 'mysql.time_zone_name' doesn't exist
status   : Operation failed
mysql.time_zone_transition
Error    : Table 'mysql.time_zone_transition' doesn't exist
status   : Operation failed
mysql.time_zone_transition_type
Error    : Table 'mysql.time_zone_transition_type' doesn't exist
status   : Operation failed
mysql.user                                         OK
sys.sys_config
Error    : Table 'sys.sys_config' doesn't exist
status   : Operation failed

However, the database is correctly running and if I manually check through an SQL, it looks like the tables exist.但是,数据库正在正确运行,如果我手动检查 SQL,看起来这些表存在。

mysql> SHOW TABLES;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| engine_cost               |
| event                     |
| func                      |
| general_log               |
| gtid_executed             |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| innodb_index_stats        |
| innodb_table_stats        |
| ndb_binlog_index          |
| plugin                    |
| proc                      |
| procs_priv                |
| proxies_priv              |
| server_cost               |
| servers                   |
| slave_master_info         |
| slave_relay_log_info      |
| slave_worker_info         |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+

I use the innodb_file_per_table=1 setting, and the owner of /var/lib/mysql directory is correctly set to mysql user.我使用innodb_file_per_table=1设置,并且/var/lib/mysql目录的所有者正确设置为mysql用户。

I would like to fix this issue without dumping existing data, but i'm running out of ideas.我想在不转储现有数据的情况下解决这个问题,但我的想法已经不多了。

Try running:尝试运行:

bash-4.2# mysql_install_db --user=mysql --ldata=/var/lib/mysql/
Installing MariaDB/MySQL system tables in '/var/lib/mysql/' ...
OK

This should install the system tables in data directory.这应该在数据目录中安装系统表。 Then restart mysql/mariadb service.然后重启 mysql/mariadb 服务。

Finally the only thing that solved the problem was to purge and reinstall the mysql library making a backup of the database and restoring it after all the process: 最后解决问题的唯一方法是清除并重新安装mysql库,备份数据库并在所有进程之后恢复它:

# Backup database
time mysqldump -u root -p database > /var/backups/restore_backup.sql

# Backup config and data
mv /var/lib/mysql /tmp/backups/mysql-lib.bak
cp /etc/mysql/my.cnf /tmp/backups/my.cnf.bak

# Purge library
sudo apt-get remove --purge mysql-server mysql-client mysql-common
sudo apt-get autoremove
sudo apt-get autoclean

# Reinstall
sudo apt-get update
sudo apt-get install mysql-server

# Restore config
cp /tmp/backups/my.cnf.bak /etc/mysql/my.cnf
sudo service mysql restart

# Create database
mysql -u root -p
mysql> CREATE DATABASE database;

# Restore backup
time mysql -u root -p database < /var/backups/restore_backup.sql

I had the same problem today and I managed to solve it without the backup - reinstall - restore steps. 我今天遇到了同样的问题,我设法解决了它没有备份 - 重新安装 - 恢复步骤。 (Though I had backup and everyone should!) (虽然我有备份,但每个人都应该!)

In my case, there was a plugin.ibd file in /var/lib/mysql/mysql/ directory, and the other missing tables also had files there, but maybe they were incomplete for some reason. 在我的例子中, /var/lib/mysql/mysql/目录中有一个plugin.ibd文件,其他缺少的表也有文件,但可能由于某种原因它们不完整。

I did the following: 我做了以下事情:

  1. Moved the files of mysql.plugin table to another directory, eg: mv /var/lib/mysql/mysql/plugin.* /other/place/ mysql.plugin表的文件移动到另一个目录,例如: mv /var/lib/mysql/mysql/plugin.* /other/place/
  2. Ran apt-get upgrade -y to see what happens. Ran apt-get upgrade -y看看会发生什么。 The upgrade script recreated the mysql.plugin table correctly and complained about another table. 升级脚本正确地重新创建了mysql.plugin表并抱怨了另一个表。
  3. I repeated steps above with the table name the upgrade script told me and after recreating 19 tables this way, the upgrade completed successfully. 我用升级脚本告诉我的表名重复上面的步骤,并以这种方式重新创建19个表后,升级成功完成。

All steps I made, as root of course: 我所做的所有步骤,当然是根本:

cd /var/lib/mysql/mysql
mkdir temp
mv engine_cost.*               temp/
mv gtid_executed.*             temp/
mv help_category.*             temp/
mv help_keyword.*              temp/
mv help_relation.*             temp/
mv help_topic.*                temp/
mv innodb_index_stats.*        temp/
mv innodb_table_stats.*        temp/
mv plugin.*                    temp/
mv server_cost.*               temp/
mv servers.*                   temp/
mv slave_master_info.*         temp/
mv slave_relay_log_info.*      temp/
mv slave_worker_info.*         temp/
mv time_zone.*                 temp/
mv time_zone_leap_second.*     temp/
mv time_zone_name.*            temp/
mv time_zone_transition.*      temp/
mv time_zone_transition_type.* temp/
apt-get upgrade -y

I hope it helps someone. 我希望它对某人有帮助。

This worked on CentOS 7.9.2009 w/WHM这适用于 CentOS 7.9.2009 w/WHM

I did not have to reinstall MySQL.我不必重新安装 MySQL。 I was able to automatically recreate the bad/missing tables.我能够自动重新创建坏/丢失的表。

as root or sudo作为 root 或 sudo

cd /var/lib/mysql/mysql

create directory for temp storage (always backup!)创建临时存储目录(始终备份!)

mkdir /root/temp-mysql-mysql-bak

move files for each bad table to your temp directory将每个坏表的文件移动到您的临时目录

mv TABLE_NAME_HERE.* /root/temp-mysql-mysql-bak/

Examples例子

mv engine_cost.* /root/temp-mysql-mysql-bak/
mv time_zone.* /root/temp-mysql-mysql-bak/
mv plugin.* /root/temp-mysql-mysql-bak/

Upgrade升级

yum upgrade -y

MySQL Upgrade MySQL 升级

mysql_upgrade --upgrade-system-tables --force

restart重新开始

systemctl mysql restart

On Arch Linux上拱 Linux

Package: mysql 8.0.29-1 . Package: mysql 8.0.29-1 (need to build from source) (需要从源代码构建)

What worked for me ( For new installation ):什么对我有用(对于新安装):

  1. Rename/Move your current mysql datadir away from your default data directory installation path, in general it can be located at /var/lib/mysql重命名/移动您当前的 mysql 数据目录远离您的默认数据目录安装路径,通常它可以位于/var/lib/mysql
  2. Trigger the following command: mysqld --initialize --user=mysql --basedir=/usr --datadir=/var/lib/mysql to reinitialize the data directory for mysql触发以下命令: mysqld --initialize --user=mysql --basedir=/usr --datadir=/var/lib/mysql重新初始化mysql的数据目录
  3. Proceed to your mysql datadir to check for the presence of the new 'mysql' folder and if this works for you, you may remove the previous mysql datadir ( Note : This may remove all the data previously contained in your database, proceed with caution )继续您的 mysql 数据目录以检查是否存在新的“mysql”文件夹,如果这对您有用,您可以删除以前的 mysql 数据目录(注意这可能会删除数据库中以前包含的所有数据,请谨慎操作

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM