Mysqldump不保留视图格式/结构



10.3.13-MariaDB上恢复数据库备份时,除视图外,一切正常。好吧,这些也被导出并且在恢复后工作正常,但是格式已损坏 - 整个sql视图都在一行上。 检查转储文件时,它显示:

/*!50001 DROP TABLE IF EXISTS `vw_sample_view`*/; 
/*!50001 DROP VIEW IF EXISTS `vw_sample_view`*/;
/*!50001 SET @saved_cs_client          = @@character_set_client */;
/*!50001 SET @saved_cs_results         = @@character_set_results */;
/*!50001 SET @saved_col_connection     = @@collation_connection */;
/*!50001 SET character_set_client      = utf8mb4 */;
/*!50001 SET character_set_results     = utf8mb4 */;
/*!50001 SET collation_connection      = utf8mb4_general_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`sample_user`@`%` SQL SECURITY DEFINER */
/*!50001 VIEW `vw_sample_view` AS select `cm`.`name` AS `market`,`u`.`name` AS `user`,`u`.`logged_at` AS `logged_at` from (`users` `u` join `core_market` `cm` on(`cm`.`id` = `u`.`id_market`)) where `u`.`id_market` is not null order by `u`.`logged_at` desc */;
/*!50001 SET character_set_client      = @saved_cs_client */;
/*!50001 SET character_set_results     = @saved_cs_results */;
/*!50001 SET collation_connection      = @saved_col_connection */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

我的一些sql视图相当复杂(并在其他选择中使用(,这种格式使得如果不花时间先格式化它们,就无法编辑它们。将它们放在单独的地方不是我想采用的解决方法。

已经发布了类似的问题 - 使用 Mysql 转储备份视图,但该解决方案使用仅适用于 Linux 的xargs(不确定这是我的问题的解决方案(。我正在使用Windows(我知道有类似Gow的东西,但想跳过第三方安装(

我尝试过带/不带--routines标志的mysqldump,也尝试了不太可能的标志,例如--opt--compact和许多其他标志 - 结果都相同。使用不同的用户来确保它不是安全问题(sample_user(。

作为一个SQL客户端,我使用HeidiSQL,从中导出可以创建我所需要的:

-- Dumping structure for view my_db.vw_sample_view
-- Removing temporary table and create final VIEW structure
DROP TABLE IF EXISTS `vw_sample_view`;
CREATE ALGORITHM=UNDEFINED SQL SECURITY DEFINER VIEW `vw_sample_view` AS SELECT
cm.name AS market,
u.name AS `user`,
logged_at
FROM users u
INNER JOIN core_market cm ON cm.id = u.id_market
WHERE id_market IS NOT NULL
ORDER BY logged_at DESC ;

不知道这个HeidiSQL是否在后台使用mysqldump(我只是缺少正确的参数(,但这正是我想要获得的输出。

更新我的目标是每天进行计划备份(这不会破坏SQL视图(。Heidi非常适合一次性手动备份,但是无法安排当前任务(https://www.heidisql.com/forum.php?t=23870(

更正的答案:

MySQL/MariaDB将视图创建的原始源代码存储到".frm"文件(在"source"下(。看起来HeidiSQL首先读取此内容,如果服务器未配置为允许此操作,它将使用INFORMATION_SCHEMA中修改后的一个行。

没有选项可以mysqldump使用.frm->source版本。

最新更新