• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 升级故障排除

    升级故障处理

    • .frm表文件和InnoDB数据字典之间的MySQL 5.7实例中的架构不匹配会导致升级到MySQL 8.0失败。这种不匹配可能是由于.frm文件损坏。要解决此问题,请转储并还原受影响的表,然后再次尝试升级。
    • 如果出现问题,例如新的mysqld服务器无法启动,请确认my.cnf您以前的安装没有旧文件。您可以使用--print-defaults选项进行检查(例如,mysqld --print-defaults)。如果此命令显示的不是程序名称,则表示您有一个my.cnf影响服务器或客户端操作的活动文件。
    • 如果升级后遇到编译的客户端程序问题,例如Commands out of sync或意外的核心转储,则可能是在编译程序时使用了旧的头文件或库文件。在这种情况下,请检查mysql.h文件和libmysqlclient.库的日期,以验证它们是否来自新的MySQL发行版。如果不是,请使用新的头文件和库重新编译程序。如果库的主要版本号已更改(例如,从libmysqlclient.so.20libmysqlclient.so.21),则对于针对共享客户端库编译的程序,也可能需要重新编译。
    • 如果使用给定名称创建了用户定义函数(UDF),并将MySQL升级到实现具有相同名称的新内置函数的版本,则UDF变得不可访问。若要更正此问题,请使用DROP FUNCTION删除UDF,然后使用CREATE FUNCTION重新创建具有不同名称的UDF。如果新版本的MySQL实现的内置函数的名称与现有存储函数的名称相同,则情况也是如此。有关描述服务器如何解释对不同类型功能的引用的规则,请参见“函数名称解析和解析”。
    • 如果由于“准备升级安装”中概述的任何问题而导致升级到MySQL 8.0失败,则服务器会将所有更改都还原到数据目录。在这种情况下,请删除所有重做日志文件,然后在现有数据目录上重新启动MySQL 5.7服务器以解决错误。重做日志文件(ib_logfile*)默认位于MySQL数据目录中。修复错误之后,请执行缓慢关机(通过设置innodb_fast_shutdown=0),然后再次尝试升级。

    重建或修复表或索引

    本节描述了如何重建或修复表或索引,这可能是由于以下原因:

    • 更改了MySQL处理数据类型或字符集的方式。例如,排序规则中的错误可能已得到纠正,因此必须重建表以更新使用该排序规则的字符列的索引。
    • 所需的表修理或升级报告CHECK TABLEmysqlcheck的,或mysql_upgrade

    重建表的方法包括:

    • 转储和重新加载方法
    • 更改表方法
    • 维修台方法

    转储和重新加载方法

    如果要重建表是因为在二进制(就地)升级或降级后,不同版本的MySQL将无法处理表,则必须使用dump-and-reload方法。使用原始版本的MySQL 升级或降级之前转储表。然后升级或降级重新加载表。

    如果仅出于重建索引的目的而使用重建表的转储和重新加载方法,则可以在升级或降级之前或之后执行转储。之后仍然必须重新加载。

    如果InnoDB由于CHECK TABLE操作指示需要升级表而需要重建表,请使用mysqldump创建转储文件,并使用mysql重新加载文件。如果该CHECK TABLE操作表明存在损坏或InnoDB失败原因,请参阅“强制执行InnoDB恢复”以获取有关使用innodb_force_recovery选项重新启动的信息InnoDB。要了解CHECK TABLE可能遇到的问题类型,请参见“ CHECK TABLE语句”中的InnoDB注释。

    要通过转储并重新加载表来重建表,请使用mysqldump创建转储文件,并使用mysql重新加载该文件:

    mysqldump db_name t1 > dump.sql
    mysql db_name < dump.sql
    

    要重建单个数据库中的所有表,请指定数据库名称,而不使用以下任何表名称:

    mysqldump db_name > dump.sql
    mysql db_name < dump.sql
    

    要重建所有数据库中的所有表,请使用以下--all-databases选项:

    mysqldump --all-databases > dump.sql
    mysql < dump.sql
    

    更改表方法

    要使用重建表ALTER TABLE,请使用“ null ”更改;也就是说,一条ALTER TABLE语句“更改”表以使用它已经拥有的存储引擎。例如,如果t1InnoDB表,则使用以下语句:

    ALTER TABLE t1 ENGINE = InnoDB;
    

    如果不确定在ALTER TABLE语句中指定哪个存储引擎,请使用SHOW CREATE TABLE来显示表定义。

    维修台方法

    REPAIR TABLE方法只适用于MyISAMARCHIVECSV表。

    您可以使用REPAIR TABLE,如果表检查操作表明存在腐败或需要升级。例如,要修复MyISAM表,请使用以下语句:

    REPAIR TABLE t1;
    

    mysqlcheck --repair提供对REPAIR TABLE语句的命令行访问。这是修复表的更方便的方法,因为可以使用--databases--all-databases选项分别修复特定数据库或所有数据库中的所有表:

    mysqlcheck --repair --databases db_name ...
    mysqlcheck --repair --all-databases