背景:首先,我们已经从MySQL 5.6升级到MySQL 8.0.12(5.6-->5.7-->8.0.12),并且运行良好.

现在,我们正在try 从8.0.12升级到8.0.32,并通过了此链接中提到的所有初步判断(Prerequisites).

已通过将8.0.12二进制文件替换为8.0.32进行升级,并try 启动服务器.但得到与其中一个数据字典表的datetime值有关的以下错误.

我看到了许多与此错误类似的问题,但这些错误与用户表有关.为此,我做了一个与升级过程相关的标题.

2023-02-28T13:28:00.305202Z 0 \[System\] \[MY-010116\] \[Server\] C:\\Program Files\\MySQL\\MySQL Server       5.6\\bin\\mysqld (mysqld 8.0.32) starting as process 13296

2023-02-28T13:28:00.326722Z 1 \[System\] \[MY-013576\] \[InnoDB\] InnoDB initialization has started.

2023-02-28T13:28:01.109930Z 1 \[System\] \[MY-013577\] \[InnoDB\] InnoDB initialization has ended.

2023-02-28T13:28:01.139462Z 1 [System] [MY-011090] [Server] Data dictionary upgrading from version '80012' to  '80023'.

2023-02-28T13:28:07.931896Z 1 \[ERROR\] \[MY-013178\] \[Server\] Execution of server-side SQL statement 'INSERT   INTO st_spatial_reference_systems SELECT \* FROM mysql.st_spatial_reference_systems' failed with error code = 1292, error message = 'Incorrect datetime value: '0000-00-00 00:00:00' for column 'last_altered' at row 2'.

2023-02-28T13:28:09.524427Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.

2023-02-28T13:28:09.524886Z 0 [ERROR] [MY-010119] [Server] Aborting

2023-02-28T13:28:11.167707Z 0 [System] [MY-010910] [Server] C:\Program Files\MySQL\MySQL Server   5.6\bin\mysqld: Shutdown complete (mysqld 8.0.32)  MySQL Community Server - GPL.

我已经try 访问该数据字典表mysql.st_spatial_reference_systems,但是访问被拒绝.

有什么方法可以更改该列默认值吗?请提个建议.

推荐答案

MySQL8.0强制不允许像‘0000-00-00’这样的日期,这通常是个好主意,因为这些不是有效的日期值.但在一些系统表中仍在使用零日期.这似乎是MySQL开发中的一个不幸的疏忽.

mysql.st_spatial_reference_systems是隐藏的系统表.除非您运行的是MySQL Server的调试版本,否则无法访问它.

因此,要纠正这一点,您必须:

  1. 卸载8.0.32
  2. 重新安装8.0.12的debug build
  3. 更新日期列中有零的mysql.st_spatial_reference_systems中的值,将它们设置为某个有效的非零值.
  4. 再次try 升级到8.0.32.

这个与升级有关的问题在这里被报告为错误:https://bugs.mysql.com/bug.php?id=109075它被关闭为"不是错误",因为他们认为在您升级之前修复任何零日期是您的责任-显然,即使它们存在于MySQL的系统表中.

错误 comments 还表明,从8.0.13升级到8.0.31(在报告该错误的人的情况下)太大了,应该逐步升级.他们是在暗示,在一些中间升级版本中,零日期将被更正,但这只是一次性的修复?但他们没有确定哪个版本的升级可能确定了日期.或者,这一 comments 可能是无关紧要的.

总而言之,这是MySQL验证团队的一个糟糕的react ,也是一个糟糕的用户体验,无法迫使这些步骤进行升级.


另一种解决方案可能是在将选项文件更改为sql_mode以允许零日期后安装8.0.32.老实说,我不知道这是否可行,因为在安装8.0的过程中,我从来没有try 过更改sql_mode.

即使这一次你让它工作,你仍然必须确定零日期,以便你可以在future 升级.要手动更新系统表中的零日期,需要运行调试版本,以便可以访问隐藏表.

我不知道是否有更多的系统表也包含零日期.

Mysql相关问答推荐

如何将左联接的小计/总计行中的所有列作废

使用Check查看过go 两个月是否完成了IRM Meetup

如何从MySQL数据库中提取入职第一个月的工作天数?

Mysql-查找缺少列的表

在MySQL中查找包含无效正则表达式的行

MySQL中如何对字符串进行算术运算?

查询优化并提高性能

Mysql,从两个不同的表中添加原始数据,从第一个表中获取所有内容,仅从第二个表中获取curdate内容

"Shelf服务器容器访问MySQL Docker容器时出现SocketException异常"

MySql SELECT 查找包含数字的区间的时间复杂度是多少?

MYSQL REGEXP_REPLACE 在数字之后

由于长时间操作而断开连接后,我的 sql 查询是否继续执行?

MySQL 每组最大 n 只适用于多行

有没有更好的方法在无限滚动的网页上呈现获取的提要数据?

即使我的约束是正确的,如何解决 errno: 150 外键约束形成错误?

Select 在同一天售出不同活动门票的收银员

MySQL如何为数据库中的所有表生成DDL

MySQL ORDER BY rand(),名称为 ASC

在 MySQL 中签名或未签名

如何在 MYSQL 中使用 SQL 在两个日期时间值之间减go 并以分钟或秒为单位检索结果?