SQLinfo.ru - Все о MySQL Highload++ 2017

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 09.07.2017 12:03:32

klow
Активист
Зарегистрирован: 06.12.2014
Сообщений: 236

Backup сохраняет View как Table

Добрый день всем!
Помогите разобраться. При бекапирование некоторые View сохраняются как таблицы.
Это происходит в MariaDB 10.2.6 и в HeidiSQL.

Неактивен

 

#2 09.07.2017 22:23:53

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3766

Re: Backup сохраняет View как Table

Какой инструмент используете для бэкапа?

Неактивен

 

#3 10.07.2017 08:34:38

klow
Активист
Зарегистрирован: 06.12.2014
Сообщений: 236

Re: Backup сохраняет View как Table

Стандартный
"c:\Program Files\MariaDB 10.2\bin\mysqldump.exe" -u backup --single-transaction --flush-logs --events --triggers --password=psw --opt --log-error=ErrLog.log --routines BDName > BDName.sql
например для View

CREATE
DEFINER = 'root'@'%'
VIEW mr AS SELECT
  `d`.`Id` AS `Id`,
  `d`.`Sort` AS `Sort`,
  `d`.`Name` AS `Name`,
  `d`.`NameShort` AS `NameShort`,
  `d`.`Adres` AS `Adres`,
  `d`.`Place_Id` AS `Place_Id`,
  `d`.`AST` AS `AST`,
  `d`.`Commentary` AS `Commentary`
FROM `department` `d`
WHERE `d`.`Parent_id` IS NULL;

Сохраняется как
--
-- Temporary table structure for view `mr`
--

DROP TABLE IF EXISTS `mr`;
/*!50001 DROP VIEW IF EXISTS `mr`*/;
SET @saved_cs_client     = @@character_set_client;
SET character_set_client = utf8;
/*!50001 CREATE TABLE `mr` (
  `Id` tinyint NOT NULL,
  `Sort` tinyint NOT NULL,
  `Name` tinyint NOT NULL,
  `NameShort` tinyint NOT NULL,
  `Adres` tinyint NOT NULL,
  `Place_Id` tinyint NOT NULL,
  `AST` tinyint NOT NULL,
  `Commentary` tinyint NOT NULL
) ENGINE=MyISAM */
;
SET character_set_client = @saved_cs_client;

Отредактированно klow (10.07.2017 08:35:37)

Неактивен

 

#4 10.07.2017 08:36:59

klow
Активист
Зарегистрирован: 06.12.2014
Сообщений: 236

Re: Backup сохраняет View как Table

Обращаю внимание, что не все View так сохраняются. Но найти закономерность у меня не получилось.
Я в шоке от такого поведения MariaDB. sad

Отредактированно klow (10.07.2017 08:37:51)

Неактивен

 

#5 10.07.2017 13:47:18

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3766

Re: Backup сохраняет View как Table

Есть ли привилегия SHOW VIEW у пользователя, который делает дамп?

Неактивен

 

#6 10.07.2017 20:25:17

klow
Активист
Зарегистрирован: 06.12.2014
Сообщений: 236

Re: Backup сохраняет View как Table

Конечно имеет,   глобальные.
Тем более, если бы доступа к View не было, то и прочитать нельзя было бы. А так ведь читает (поля совпадают), но сохраняет как таблицу.

Отредактированно klow (10.07.2017 20:39:06)

Неактивен

 

#7 10.07.2017 21:39:44

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3766

Re: Backup сохраняет View как Table

А после в дампе нет замены таблицы на view? mysqldump  может создать сначала таблицу на случай, если она будет использоваться в других view

Неактивен

 

#8 10.07.2017 21:43:39

klow
Активист
Зарегистрирован: 06.12.2014
Сообщений: 236

Re: Backup сохраняет View как Table

Нет, замены нет.

mysqldump  может создать сначала таблицу на случай, если она будет использоваться в других view

Вот это не понял, можно подробнее.
В других view не используется.

Неактивен

 

#9 11.07.2017 00:48:20

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3766

Re: Backup сохраняет View как Table

CREATE VIEW не срабатывает, если еще не созданы таблицы или представления, из которых делается SELECT. Для mysqldump важно, чтобы дамп восстанавливался без ошибок. Можно было бы дампить в порядке зависимостей, но mysqldump дампит по алфавиту. Для VIEW сначала создается некоторый предварительный вариант. В 5.6.24-72.2 Percona Server это выглядит так.

create database dumptest;
use dumptest;
create table c (id int(11));
insert into c values (1),(2),(3);
create view b as select * from c;
create view a as select * from b;


Вот таким будет дамп:

--
-- Temporary view structure for view `a`
--

DROP TABLE IF EXISTS `a`;
/*!50001 DROP VIEW IF EXISTS `a`*/;
SET @saved_cs_client     = @@character_set_client;
SET character_set_client = utf8;
/*!50001 CREATE VIEW `a` AS SELECT
 1 AS `id`*/
;
SET character_set_client = @saved_cs_client;

--
-- Temporary view structure for view `b`
--

DROP TABLE IF EXISTS `b`;
/*!50001 DROP VIEW IF EXISTS `b`*/;
SET @saved_cs_client     = @@character_set_client;
SET character_set_client = utf8;
/*!50001 CREATE VIEW `b` AS SELECT
 1 AS `id`*/
;
SET character_set_client = @saved_cs_client;

--
-- Table structure for table `c`
--

DROP TABLE IF EXISTS `c`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `c` (
  `id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `c`
--

LOCK TABLES `c` WRITE;
/*!40000 ALTER TABLE `c` DISABLE KEYS */;
INSERT INTO `c` VALUES (1),(2),(3);
/*!40000 ALTER TABLE `c` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Final view structure for view `a`
--

/*!50001 DROP VIEW IF EXISTS `a`*/;
/*!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      = utf8 */;
/*!50001 SET character_set_results     = utf8 */;
/*!50001 SET collation_connection      = utf8_general_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `a` AS select `b`.`id` AS `id` from `b` */;
/*!50001 SET character_set_client      = @saved_cs_client */;
/*!50001 SET character_set_results     = @saved_cs_results */;
/*!50001 SET collation_connection      = @saved_col_connection */;

--
-- Final view structure for view `b`
--

/*!50001 DROP VIEW IF EXISTS `b`*/;
/*!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      = utf8 */;
/*!50001 SET character_set_results     = utf8 */;
/*!50001 SET collation_connection      = utf8_general_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `b` AS select `c`.`id` AS `id` from `c` */;
/*!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 */;
 

Неактивен

 

#10 11.07.2017 00:52:45

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3766

Re: Backup сохраняет View как Table

Если у Вас есть воспроизводимый пример некорректного дампа, то это в багтрекер. Ранее подобные баги уже были:

https://bugs.mysql.com/bug.php?id=57215
https://stackoverflow.com/questions/420 … -of-a-view
https://stackoverflow.com/questions/949 … -mysqldump

Неактивен

 

#11 11.07.2017 18:19:50

klow
Активист
Зарегистрирован: 06.12.2014
Сообщений: 236

Re: Backup сохраняет View как Table

Спасибо за помощь!
Не знал, что view так бекапируется. Причина оказалась в ошибке, при бекпирование, которую я пропустил и, соответственно, не весь бекап сохранялся.

Отредактированно klow (11.07.2017 18:20:45)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson