MariaDB:未知数据类型 "MYSQL_JSON"

MariaDB: Unknown data type "MYSQL_JSON"

根据 MariaDB 的网站,您可以简单地将 MySQL 替换为 MariaDB。 太好了,我想,但是在安装 MariaDB (10.5.7) 之后,我的一些 InnoDB tables 已损坏。错误是 Unknown data type "MYSQL_JSON"。 其中一个损坏的 table 还在 phpmyadmin 中显示“正在使用”,我根本无法访问它。

所以,我到处寻找解决方案,显然 MariaDB 不支持该类型。有什么办法可以解决这个问题吗?一定有一些方法可以隐藏这些列,对吗?

我试图降级回 MySQL 5.7,但现在 MySQL 不再工作了,所以我再次重新安装了 MariaDB。我也找不到任何降级指南。


这是从我的本地测试数据库创建的损坏 table 的创建 table 语句。我能够成功地 mysqldump 所有其他的。只是不是这个。诚然,我有 1 天前的备份,但是一整天丢失工作无论如何都不是一件好事。

CREATE TABLE `news` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `author_id` int(10) unsigned DEFAULT NULL,
 `title` varchar(180) COLLATE utf8mb4_unicode_ci NOT NULL,
 `content` longtext COLLATE utf8mb4_unicode_ci DEFAULT NULL,
 `excerpt` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
 `sources` longtext COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '(DC2Type:json)',
 `header` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
 `copyright` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
 `category` smallint(5) unsigned DEFAULT NULL,
 `featured` tinyint(1) NOT NULL,
 `language` smallint(5) unsigned NOT NULL,
 `published` datetime DEFAULT NULL,
 `status` smallint(5) unsigned NOT NULL,
 PRIMARY KEY (`id`),
 KEY `IDX_1DD39950F675F31B` (`author_id`),
 CONSTRAINT `FK_1DD39950F675F31B` FOREIGN KEY (`author_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=167 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

table 由 Doctrine ORM 自动生成。

如果我能以某种方式从 table 中获取几行数据,那将是我的一周。我只需要最后一天的内容栏。 我从备份中恢复了系统 运行。就是那些新闻不见了。


更新

我能够在 /var/lib/mysql/{mydatabase}/ 下找到一个 .ibd 文件,其中包含我需要的所有纯文本数据。我只是手动复制内容并将其重新插入数据库。

mysql-5.7 到 MariaDB 的就地升级,对于 JSON 类型需要一个插件来读取其数据格式:

将以下内容添加到您的 MariaDB 服务器配置中:

plugin_load_add=mysql_json=type_mysql_json
plugin_maturity=alpha

运行 mysql_upgrade --force 提取所有 JSON 数据类型并进行转换。

或者 ALTER TABLE news FORCE 更改那个 table。

在从 MySQL 迁移到 MariaDB 时的一般情况下修复 Unknown data type "MYSQL_JSON"

您有 2 个选择。

  1. 从 MySQL 转储您的数据库并将其导入 MariaDB。
  2. 修复所有具有 JSON 类型列的表。

第一个选项很简单,但要按照 MariaDB website 的建议选择第二个选项。

停止 MySQL 服务,如果它是 运行ning

sudo service mysql stop

启动一个新的 mysql 服务器实例

mysqld --no-defaults --datadir=<Your data dir directory> --lc-messages_dir=./share --plugin-dir=<path to directory containing type_mysql_json.so> --plugin-maturity=alpha

默认datadir目录(mysql 5.7,ubuntu 18.04)是/var/lib/mysql/

默认插件目录是/usr/lib/mysql/plugin

保持服务器 运行 启动新的 MySQL command-line 客户端并安装 mysql_json 插件。

install soname 'type_mysql_json';

更改所有具有 JSON 类型列的表。

 ALTER TABLE `database_name`.`table_name` FORCE;  

停止 MySQL 服务器实例并启动 MySQL 服务,一切都应该没问题。

ps: 如果您有很多包含 JSON 类型列的表(如我的情况),您可以使用此命令获取列表在所有命令中,您必须 运行 才能修复所有表

SELECT CONCAT("ALTER TABLE `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` FORCE;") AS MySQLCMD FROM TABLES WHERE TABLE_SCHEMA = "<YOUR_DATABASE_NAME>";