Mariadb 在 Navicat 中转储SQL文件出错:Column count of mysql.proc is wrong...

本文分享了在使用Navicat工具操作数据库时遇到的转储SQL错误,并提供了详细的解决方案,包括使用mysql_upgrade命令升级数据库的具体步骤。

提示:虽然我是用的 Mariadb 数据库,但是此解决方案同样适用于 MySQL 数据库。 Mariadb 和 MySQL
的报错信息和解决方案是一模一样的。

今天在使用 Navicat 工具操作我的数据库时,想要转储SQL语句。不料遇见错误
完整错误如下:

1558 column count of mysql.proc is wrong.Expected37,found 20.created with mysql 50381,now running 100328.please use mysql_upgrade to fix this error。

根据提示使用 mysql_upgrade 命令升级数据库,无奈服务器没有这个命令。后来经过折腾,发现此命令在 mariadb-server-utils 包中。

安装完之后使用命令升级(MySQL也是用这个命令):

mysql_upgrade -uroot -p

然后输入密码,看到控制台输出类似信息即升级成功:

Phase 1/7: Checking and upgrading mysql database
Processing databases
mysql
mysql.columns_priv                                 OK
mysql.db                                           OK
mysql.event                                        OK
mysql.func                                         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.proxies_priv                                 OK
mysql.servers                                      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
Upgrading from a version before MariaDB-10.1
Phase 2/7: Installing used storage engines
Checking for tables with unknown storage engine
Phase 3/7: Fixing views
Phase 4/7: Running 'mysql_fix_privilege_tables'
Phase 5/7: Fixing table and database names
Phase 6/7: Checking and upgrading tables
Processing databases
information_schema
performance_schema
test
TestDB
TestDB.users                                       OK 
Phase 7/7: Running 'FLUSH PRIVILEGES'
OK

再去转储SQL文件…成功!


技 术 无 他, 唯 有 熟 尔。
知 其 然, 也 知 其 所 以 然。
踏 实 一 些, 不 要 着 急, 你 想 要 的 岁 月 都 会 给 你。


<think>好的,我现在要解决用户遇到的MySQL升级错误,即从MariaDB升级到MySQL 5.6.51后出现ERROR 1558 (HY000),提示mysql.user表的列数不匹配,预期43列但实际找到42列。用户提到可能需要运行mysql_upgrade来修复。我需要仔细分析这个问题,并给出正确的解决步骤。 首先,我需要了解这个错误的原因。当用户从MariaDB升级到MySQL时,系统表的结构可能不兼容,导致mysql.user表的列数与MySQL 5.6.51期望的不一致。MariaDBMySQL虽然相似,但在系统表结构上可能存在差异,特别是不同版本之间。用户之前安装的是MariaDB 5.5.68,现在替换为MySQL 5.6.51,这可能导致系统表结构未正确更新。 接下来,我需要确定解决方案。用户提到使用mysql_upgrade,这通常是升级后修复系统表的步骤。但可能需要更详细的步骤,尤其是在升级过程中可能遇到的问题。例如,直接运行mysql_upgrade可能不够,因为如果MySQL服务启动时加载了旧的表结构,可能无法正确更新。 我需要考虑以下步骤: 1. 停止MySQL服务,确保数据目录的旧文件被清理。 2. 备份现有的数据,以防万一。 3. 确保正确安装MySQL 5.6.51,并完全移除MariaDB的残留。 4. 初始化MySQL数据目录,使用mysql_install_db(因为MySQL 5.6可能使用此命令)。 5. 启动MySQL服务,然后运行mysql_upgrade来修复系统表。 6. 最后重新启动服务以应用更改。 同时,用户可能在之前的安装中没有正确清理MariaDB的残留文件,特别是数据目录中的文件,导致升级时出现兼容性问题。需要强调备份的重要性,并指导用户如何彻底移除旧的数据文件。 另外,需要注意权限问题,确保运行命令时具有足够的权限,比如使用sudo。还有,在运行mysql_upgrade时,可能需要指定root用户的密码,特别是如果已经设置了密码的话。如果用户没有正确设置密码,可能需要暂时跳过权限验证,但这存在安全风险,只能作为临时措施。 还要检查是否有其他系统表需要更新,而不仅仅是mysql.user表。mysql_upgrade通常会处理所有系统表的升级,所以运行它是关键步骤。如果在运行过程中出现其他错误,可能需要查看日志文件,如/var/log/mysqld.log,以获取更多信息。 最后,用户可能遇到的问题可能还包括服务无法启动,或者在初始化数据目录时出现权限错误,需要确保目录的所有权和权限正确。例如,MySQL的数据目录通常是/var/lib/mysql,应该属于mysql用户和组。 总结可能的解决步骤: - 停止MySQL服务 - 备份数据 - 清理旧数据目录 - 重新安装MySQL - 初始化数据目录 - 启动服务并运行mysql_upgrade - 验证修复结果 需要确保每一步都正确执行,并且在出现错误时提供相应的解决方法。同时,提醒用户在生产环境中操作前备份数据的重要性,避免数据丢失。</think>### **解决MySQL升级后`mysql.user`列数不匹配错误(ERROR 1558)的分步指南** --- #### **一、问题原因分析** 从MariaDB升级到MySQL 5.6.51时,`mysql.user`表结构因版本差异导致列数不一致(MariaDB 5.5.68的`mysql.user`有42列,而MySQL 5.6.51要求43列)[^1]。该错误通常由以下原因引发: 1. **残留的MariaDB系统表**:未彻底清理旧数据目录,导致MySQL加载了MariaDB的表结构。 2. **未正确运行`mysql_upgrade`**:升级后未更新系统表结构。 --- #### **二、完整修复流程** ##### **1. 停止MySQL服务并备份数据** ```bash # 停止MySQL服务 sudo systemctl stop mysqld # 备份数据目录(默认路径为/var/lib/mysql) sudo cp -r /var/lib/mysql /var/lib/mysql_backup ``` ##### **2. 彻底移除旧数据目录** ```bash # 删除MariaDB残留数据(谨慎操作!) sudo rm -rf /var/lib/mysql/* ``` ##### **3. 重新初始化MySQL系统表** MySQL 5.6使用`mysql_install_db`初始化数据目录: ```bash # 初始化数据目录(需确保安装mysql-community-server) sudo mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql ``` ##### **4. 启动服务并运行`mysql_upgrade`** ```bash # 启动MySQL sudo systemctl start mysqld # 运行升级脚本(强制修复系统表) sudo mysql_upgrade -u root -p --force ``` - **输入root密码**:若已设置密码,需在此处输入。 - **`--force`标志**:强制修复所有表,即使版本号相同。 ##### **5. 重启MySQL服务** ```bash sudo systemctl restart mysqld ``` --- #### **三、验证修复结果** ```bash # 登录MySQL并检查mysql.user表结构 mysql -u root -p -e "DESCRIBE mysql.user;" # 预期输出应包含43列,包括`password_expired`列 +------------------------+-----------------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------------------+-----------------------------------+------+-----+---------+-------+ | Host | char(60) | NO | PRI | | | | User | char(32) | NO | PRI | | | | ... | ... | ... | ... | ... | ... | | password_expired | enum('N','Y') | NO | | N | | <-- 第43列 +------------------------+-----------------------------------+------+-----+---------+-------+ ``` --- #### **四、常见问题解决** 1. **`mysql_upgrade`执行失败?** - **原因**:未正确初始化数据目录或权限错误。 - **解决**: ```bash # 检查数据目录权限 sudo chown -R mysql:mysql /var/lib/mysql sudo chmod 750 /var/lib/mysql ``` 2. **初始化时提示`FATAL ERROR: Could not find my-default.cnf`?** - **原因**:MySQL 5.6配置文件路径变更。 - **解决**: ```bash # 手动创建配置文件 sudo cp /usr/share/mysql/my-default.cnf /etc/my.cnf ``` --- ### **相关问题** 1. 如何从MySQL 5.6升级到更高版本(如8.0)? 2. 如何迁移MariaDB数据到MySQL并避免兼容性问题? 3. `mysql_upgrade`执行后仍报错“表不存在”如何解决? --- [^1]: MariaDBMySQL系统表结构差异是导致升级失败的常见原因,需通过`mysql_upgrade`同步表结构[^1]。 [^2]: `mysql_install_db`在MySQL 5.7后被`mysqld --initialize`取代,但5.6仍需使用旧命令[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值