Почему mysqldump УСТАНОВИЛ пользовательские переменные без знаков at?

#sql #mariadb #syntax-error #prepared-statement

Вопрос:

Я столкнулся с этой ошибкой при попытке восстановить дамп базы данных в базу данных MariaDB:

 ERROR 1064 (42000) at line 1234: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'v_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SET v_sql = CONCAT('DROP TABLE IF' at line 7
 

Ознакомившись с синтаксисом SQL, я пришел к выводу , что сбой произошел из-за инструкции SET, в которой определяемому пользователем имени переменной не предшествует an @ , как это должно быть. Но зачем mysqldump вообще генерировать такое заявление?

Оператор, используемый для создания дампа, является

 mysqldump -u... -p... --single-transaction --routines --triggers --all-databases > dump.sql
 

с

 mysqldump  Ver 10.19 Distrib 10.5.11-MariaDB, for debian-linux-gnu (x86_64)
 

а затем восстановил на

 mariadb  Ver 15.1 Distrib 10.1.48-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
 

Полное определение из дампа-это:

 DELIMITER ;;
CREATE DEFINER=`mydefiner`@`%` PROCEDURE `p_my_procedure`(
IN `myid` VARCHAR(36)
)
BEGIN
DECLARE v_sql TEXT;
SET v_sql = CONCAT('DROP TABLE IF EXISTS ', '`prefix_',myid,'_one`;');
PREPARE stmt FROM v_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SET v_sql = CONCAT('DROP TABLE IF EXISTS ','`prefix_',myid,'_two`;');
PREPARE stmt FROM v_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SET v_sql = CONCAT('DROP TABLE IF EXISTS ','`other_prefix_',myid,'`;');
PREPARE stmt FROM v_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

END ;;
 

Комментарии:

1. Предоставьте тексты SP из ПРОЦЕДУРЫ СОЗДАНИЯ и из дампа.

2. И где те же определения, полученные из заявлений SHOW? Инструкции из дампа явно ошибочны и противоречат документации , в которой утверждается, что » preparable_stmt является либо строковым литералом, либо пользовательской переменной ( не локальной переменной , выражением SQL или подзапросом), содержащей текст инструкции».

3. Целевой сервер @danblack 10.1.48-MariaDB, и он не поддерживает execute immediate .

4. Я не думаю, что это был mysqldump, который опустил знак @ в имени переменной! Операторы Declare используются для локальных переменных, а не для пользовательских переменных.

5. Похоже, что дамп был создан на сервере > 10.1.48 (вы используете mysqldump из пакета 10.5 server). Также подумайте об обновлении, 10.1 является eoled.