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_item
和rollup_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
我有一个使用分组 和汇总 功能的简单视图。
使用 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_item
和rollup_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