MySql > 8.0.18:Dump/Restore 包含 WITH ROLLUP 分组的 VIEWS 问题

MySql > 8.0.18: Dump/Restore problems with VIEWS containing Group By WITH ROLLUP

我有一个使用分组 和汇总 功能的简单视图。

使用 mysqldump 转储数据库会产生一个无法再恢复的文件。

以下 SQL 创建了一个数据库,其中有 1 个 table 和 1 个访问此 table 的视图:

DROP DATABASE IF EXISTS rollup_test;
CREATE DATABASE rollup_test;
USE rollup_test;

DROP TABLE IF EXISTS tmp_table_rollup;
CREATE TABLE tmp_table_rollup (
 id bigint(20) NOT NULL AUTO_INCREMENT,
 groupKey varchar(250)  DEFAULT NULL,
 groupValue varchar(250) DEFAULT NULL,
 PRIMARY KEY (id)
);

DROP VIEW IF EXISTS tmp_view_rollup;
CREATE VIEW tmp_view_rollup
  AS
    SELECT groupKey,
    COUNT(id) AS groupCount
    FROM tmp_table_rollup
    GROUP BY groupKey
    WITH ROLLUP;

使用 mysqldump rollup_test > /tmp/rollup_test.mysql 从终端转储生成包含以下片段的文件:


/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=root@localhost SQL SECURITY DEFINER */
/*!50001 VIEW tmp_view_rollup AS select rollup_group_item(tmp_table_rollup.groupKey,0) AS groupKey,rollup_sum_switcher(count(tmp_table_rollup.id)) AS groupCount from tmp_table_rollup group by tmp_table_rollup.groupKey with rollup */;

尝试使用 mysql rollup_test < /tmp/rollup_test.mysql(新数据库或旧数据库)restore/import 此文件会导致以下错误:

ERROR 1305 (42000) at line 70: FUNCTION rollup_test.rollup_group_item does not exist

为什么有内部c函数 rollup_group_itemrollup_sum_switcher

非常感谢任何帮助!

我在 macOS Catalina 上 MySql 8.0.22

(直到 MySql 版本 8.0.18 我在那个问题上没有遇到任何问题。)

更新:看来删除这些内部 c 函数可以修复视图。因此,作为一种解决方法,您可以像这样通过正则表达式替换来传递备份:

mysqldump ... | sed -E 's/(rollup_group_item\()([^,]*)(,[ ]*[0-9]*\))//g' | sed -E 's/rollup_sum_switcher//g'

这似乎适用于 Ubuntu 20.04,但您可能需要调整替换以匹配您的特定视图和 sed.[=13= 的操作系统实现]


这似乎不是 mysqldump 的问题,而是 MySQL 服务器本身的问题,因为如果您 运行 SHOW CREATE VIEW 语句或者即使您 SELECT 来自 INFORMATION_SCHEMA.VIEW .

已提交错误 here

更新:该错误将在 8.0.24 中修复。

8.0.24 确实解决了上述问题……但是……我注意到另一个关于 ROLLUP 嵌套视图的问题……请检查一下……

MySql 8.0.24: Dump/Restore fails with nested VIEWS having ROLLUP over DISTINCT groups