mysqldump не сохраняет формат представления / структуру - PullRequest
2 голосов
/ 31 января 2020

При восстановлении резервной копии БД на 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 представлений являются довольно сложными (и используются в других выборках), и этот формат делает их невозможными для редактирования, не тратя время на их форматирование. Хранение их на отдельном месте - это не обходной путь, с которым я бы хотел go.

Подобная проблема уже была опубликована - Резервное копирование просмотров с помощью Mysql Дамп , но решение использует xargs, который работает только для Linux (и не уверен, что это решение моей проблемы). Я использую Windows (я знаю, что есть что-то вроде Gow , но хотел бы пропустить установки сторонних производителей)

Я пробовал mysqldump с / без флага --routines, также пробовал маловероятные флаги, такие как --opt, --compact и многие другие - все с одинаковым результатом. Использовали разных пользователей, чтобы убедиться, что это не проблема безопасности (root и sample_user ).

Как клиент SQL Я использую Heidi SQL и экспорт из него создает именно то, что мне нужно:

-- 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 ;

Не знаю, использует ли этот Heidi SQL mysqldump на фоне (а мне просто не хватает подходящего параметра), но это точно вывод Я хочу получить.

Обновление Моя цель - иметь ежедневное резервное копирование по расписанию (которое не испортит SQL просмотров). Heidi идеально подходит для одноразового резервного копирования вручную, однако его нельзя запланировать для повторяющихся задач (https://www.heidisql.com/forum.php?t=23870)

1 Ответ

1 голос
/ 31 января 2020

Исправленный ответ:

MySQL / MariaDB сохранил исходный источник для создания представления в файле ".frm" (в разделе "source"). Похоже, Хайди SQL сначала читает это, и если сервер не настроен на это, он будет использовать измененный один вкладыш из INFORMATION_SCHEMA.

Невозможно сделать mysqldump для использования .frm->source версия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...