Sander1 62 Опубликовано: 19 апреля 2018 Рассказать Опубликовано: 19 апреля 2018 Сделал тут давеча бекап средствами 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 именно по результатам этого запроса выполняется проверка, экспортировать данные из таблицы или нет (т.к. их нету типа). Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 084 Опубликовано: 19 апреля 2018 Рассказать Опубликовано: 19 апреля 2018 54 минуты назад, Sander1 сказал: Выполняю этот же запрос на DLE 12, все норм. Версия DLE тут никакой роли не играет, смотрите файл бекапа БД чтобы все записи присутсвовали. Если они там есть, то делайте повторно восстановление бекапа, т.к. во время восстановления произошел какой либо сбой в БД. Если данных нет в бекапе, значит их не отдал MySQL сервер во время создания бекапа БД 54 минуты назад, Sander1 сказал: PS. Кто не знает, в файле engine/inc/dumper.php именно по результатам этого запроса выполняется проверка Никаких проверок в этом файле нет, он выполняет команды описанные в файле бекапа. И в файле бекапа стоят MySQL запросы и на создание таблиц и на вставку данных. Это во время импорта, а во время экспорта тоже проверок нет, он экспортирует все, что выдает БД. Цитата Ссылка на сообщение Поделиться на других сайтах
Sander1 62 Опубликовано: 19 апреля 2018 Рассказать Опубликовано: 19 апреля 2018 Автор Да, действительно не зависит от версии 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 Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 084 Опубликовано: 20 апреля 2018 Рассказать Опубликовано: 20 апреля 2018 13 часов назад, Sander1 сказал: Проверка (которой нет?), на количество записей в таблице. Я имел ввиду другие проверки, когда вы спросили про проверки экспортировать или нет. Я подумал что вы спрашиваете про ограничения из каких таблиц брать информацию, а из каких нет, таких проверок и ограничений в скрипте нет. 13 часов назад, Sander1 сказал: И получается, что строки 303 - 333 просто игнорируются, т.к. скрипт ошибочно считает что записей в БД нет. Нет, в данном случае скрипт все считает верно, это ему ваша БД вернула, что записей в таблице нет, что то повреждено у вас в таблице. Как правило помогает ремонт и восстановление БД в таких случаях. Либо обновите MySQL сервер, если он очень старой версии. Цитата Ссылка на сообщение Поделиться на других сайтах
Sander1 62 Опубликовано: 20 апреля 2018 Рассказать Опубликовано: 20 апреля 2018 Автор 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. Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 084 Опубликовано: 20 апреля 2018 Рассказать Опубликовано: 20 апреля 2018 11 часов назад, Sander1 сказал: Сама документация говорит, что данный запрос не может давать точно значение количества записей в таблицах InnoDB. А DLE и не нужно точное значение, ему достаточно того что эти поля есть, а они в данном случае есть. DLE главное не нулевое значение. Ему достаточно вообще информации, что там что то есть. Реальная же выборка данных, потом идет совсем другими запросами, и вот информации о наличии данных у вас отсутствует, чего быть не должно. И именно на отсутствующие данные, мы за много лет жалоб ранее еще не получали, я не могу сказать, почему у вас там отсутствует информация о наличии записей. Попробуйте как я написал выше обновить MySQL а также произвести ремонт и восстановление БД. Цитата Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Присоединяйтесь к обсуждению
Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.