mysql - MariaDB:未知数据类型 "MYSQL_JSON"

标签 mysql mariadb innodb ubuntu-18.04

根据MariaDB的网站,您可以简单地将MySQL替换为MariaDB。 太好了,我想,但是安装 MariaDB (10.5.7) 后,我的一些 InnoDB 表已损坏。错误是未知数据类型“MYSQL_JSON”。 其中一个损坏的表在 phpmyadmin 中也显示“正在使用”,但我根本无法访问它。

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

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


这是从我的本地测试数据库创建的损坏表的创建表语句。我能够成功地 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

该表由 Doctrine ORM 自动生成。

如果我能以某种方式从该表中获取几行数据,那我就度过了愉快的一周。我只需要最后一天的内容栏。 我通过备份让系统恢复运行。只是那些新闻丢失了。


更新

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

最佳答案

修复从 MySQL 迁移到 MariaDB 时一般情况下的未知数据类型“MYSQL_JSON”

您有 2 个选择。

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

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

如果 MySQL 服务正在运行,请停止它

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 命令行客户端并安装 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>";

关于mysql - MariaDB:未知数据类型 "MYSQL_JSON",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64796154/

相关文章:

mysql - 复制 MySQL/MariaDB BLOB 列时会复制哪些数据?

mysql - InnoDB插件版本命令?

php - MySQL 表锁定(读)

mysql - 如何解决 ROR-4 中的加载错误

MySQL getpolygon函数错误

mysql 检查日期约束(触发器)

mysql - 如何在重复 key 更新后添加 AND ?

php - Apache (PHP) 和 Mysql - 理想的 2 服务器设置

mysql - SQL - 最大长度255唯一索引 - 哈希解决方案

MySQL非主外键