Перейти к публикации

Ошибка в работе бекапа DLE 12.1


Рекомендованные сообщения

Сделал тут давеча бекап средствами DLE и через некоторое время решил восстановить БД. После импорта слетела авторизация. Каково же было мое удивление, когда оказалось, что таблица dle_users не была сохранена, но при импорте была пересоздана и оказалась пустой. Т.е. полностью слетели данные таблицы dle_users и dle_admin_sections (возможно и другие некоторые).

Выполняю запрос на dle 12.1

SHOW TABLE STATUS WHERE name like 'dle_users'

В результате вижу Rows = 0, хотя записи однозначно есть.

http://prntscr.com/j7d450

Выполняю этот же запрос на DLE 12, все норм.

Кодировка utf-8, версия PHP: 5.6, 7.0, 7.1

 

PS. Кто не знает, в файле engine/inc/dumper.php именно по результатам этого запроса выполняется проверка, экспортировать данные из таблицы или нет (т.к. их нету типа).

Ссылка на сообщение
Поделиться на других сайтах
54 минуты назад, Sander1 сказал:

Выполняю этот же запрос на DLE 12, все норм.

Версия DLE тут никакой роли не играет, смотрите файл бекапа БД чтобы все записи присутсвовали. Если они там есть, то делайте повторно восстановление бекапа, т.к. во время восстановления произошел какой либо сбой в БД. Если данных нет в бекапе, значит их не отдал MySQL сервер во время создания бекапа БД

54 минуты назад, Sander1 сказал:

PS. Кто не знает, в файле engine/inc/dumper.php именно по результатам этого запроса выполняется проверка

Никаких проверок в этом файле нет, он выполняет команды описанные в файле бекапа. И в файле бекапа стоят MySQL запросы и на создание таблиц и на вставку данных. Это во время импорта, а во время экспорта тоже проверок нет, он экспортирует все, что выдает БД.

Ссылка на сообщение
Поделиться на других сайтах

Да, действительно не зависит от версии DLE.

Записал видео для наглядности:

https://sandev.pro/uploads/show_db.wmv

 

1 час назад, celsoft сказал:

Никаких проверок в этом файле нет, он выполняет команды описанные в файле бекапа. И в файле бекапа стоят MySQL запросы и на создание таблиц и на вставку данных. Это во время импорта, а во время экспорта тоже проверок нет, он экспортирует все, что выдает БД.

 

Запрос на получение данных.

211: $result = mysqli_query($dblink, "SHOW TABLE STATUS");

 

Получение количества записей в таблице

222: $tabinfo[$item['Name']] = $item['Rows'];

 

Проверка (которой нет?), на количество записей в таблице.

303: if ($tabinfo[$table] > 0) {

 

И получается, что строки 303 - 333 просто игнорируются, т.к. скрипт ошибочно считает что записей в БД нет.

 

Это судя по всему известная проблема.

https://www.google.com.ua/search?q=show+table+status+rows+wrong

Ссылка на сообщение
Поделиться на других сайтах
13 часов назад, Sander1 сказал:

Проверка (которой нет?), на количество записей в таблице.

Я имел ввиду другие проверки, когда вы спросили про проверки экспортировать или нет. Я подумал что вы спрашиваете про ограничения из каких таблиц брать информацию, а из каких нет, таких проверок и ограничений в скрипте нет.

 

13 часов назад, Sander1 сказал:

И получается, что строки 303 - 333 просто игнорируются, т.к. скрипт ошибочно считает что записей в БД нет.

Нет, в данном случае скрипт все считает верно, это ему ваша БД вернула, что записей в таблице нет, что то повреждено у вас в таблице. Как правило помогает ремонт и восстановление БД в таких случаях. Либо обновите MySQL сервер, если он очень старой версии.

Ссылка на сообщение
Поделиться на других сайтах

5.6.38-log MySQLi

 

https://dev.mysql.com/doc/refman/8.0/en/innodb-restrictions.html

Цитата

SHOW TABLE STATUS does not give accurate statistics on InnoDB tables except for the physical size reserved by the table. The row count is only a rough estimate used in SQL optimization.

Сама документация говорит, что данный запрос не может давать точно значение количества записей в таблицах InnoDB.

Ссылка на сообщение
Поделиться на других сайтах
11 часов назад, Sander1 сказал:

Сама документация говорит, что данный запрос не может давать точно значение количества записей в таблицах InnoDB.

А DLE и не нужно точное значение, ему достаточно того что эти поля есть, а они в данном случае есть. DLE главное не нулевое значение. Ему достаточно вообще информации, что там что то есть. Реальная же выборка данных, потом идет совсем другими запросами, и вот информации о наличии данных у вас отсутствует, чего быть не должно. И именно на отсутствующие данные, мы за много лет жалоб ранее еще не получали, я не могу сказать, почему у вас там отсутствует информация о наличии записей. Попробуйте как я написал выше обновить MySQL а также произвести ремонт и восстановление БД.

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...