Как стать автором
Обновить

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

Да, похоже, «PRAGMA integrity_check» — это самая полная команда для восстановления данных, и если она не помогает — то единственный способ — это дампить базу и вытаскивать данные построчно.
Похоже, команда SQLite считает свой продукт очень надежным, и не стремится разрабатывать инструменты на случай физического повреждения базы.
Хорошо, что дамп получилось создать, хоть и с ошибками.
Можно еще поковырять полученный дамп на предмет тех строчек, на которые ругался импортер — если это какая-то конечная таблица, типа «CallMembers» или «Messages», то primary key можно заменить на любой незанятый, если табличка, на которую идет ссылка — типа «Conversations», то тут можно посмотреть нижележащую табличку на предмет ссылок, ведущих «в никуда», и попытаться угадать, какой primary key в табличке должен быть.
Можно еще глубже залезть и посмотреть содержимое поврежденных страниц (кстати, интересно, есть ли у sqlite инструменты для такого низкоуровневого доступа, типа DBCC PAGE в MS SQL), но это уже перфекционизм — времени уйдет много, скорее всего ради нескольких потерянных сообщений или вообще ненужных в данной ситуации индексов.
У меня нет цели восстановить всё до последнего сообщения. Мне прежде всего было важно вообще получить доступ к своей истории, т.к. некоторые диалоги мне важны чаще для восстановления хронологии событий, чем даже для их сути. Поэтому, конечно, настолько сильно закапываться в тонкости Sqlite смысла не был о. Я вообще рад, что получилось малой кровью (хотя это заняло несколько часов) всё вернуть. Но в целом, я согласен с тем фактом, что разработчик базы данных первым же делом должен заботиться об инструментах низкоуровневого восстановления. И уж, тем более, я удивлён — почему за много лет существования Skype там до сих пор нет инструмента автоматического резервного копирования (не говоря уж о таком простом способе быстрого восстановления БД).
Интересный заголовок. «Восстановление битой истории Skype» — «Восстановление истории skype с помощью биты» :)
Название главы в учебнике по терморектальному криптоанализу )
Да, я как-то задался целью сделать так, чтобы можно было видеть какое сообщение пользователь отредактировал или удалил. Оказалось достаточно просто — нужно всего-то добавить триггер на update и delite. База не шифрованная — простора для творчества хоть отбавляй.
А я просто брал id'ы всех чатов, потом по ним сообщения и записывал в .txt файлы. Сколько всего вспомнил, перечитывая…
Всё-таки хранить в текстовом формате не самый удобный способ, особенно когда база уже за 150Мб перевалила. Я сначала хотел конвертнуть всё в привычный мне MySQL, но потом обнаружил, что база битая и не всё так просто.
У меня база весила в тот момент 178 мб. Я тоже в MySQL хотел перевести, но увидел тучу ошибок, которые, кстати, удалось исправить и перенести бд на мускул. А дальше уже все легко и просто.
привычно скопировал всю папку профиля из старого
Копирование подразумевает наличие исходной рабочей копии, видимо имелось в виду перемещение. Но даже при перемещении файла с другого раздела исходный вариант можно восстановить. В общем, надеюсь теперь вы относитесь к той группе людей, которые уже делают бекапы.
Копировал. У меня бекап на другом винте, т.к. я переезжал на другой компьютер. Ну и есть несколько более старых архивов профиля, но полгода минимум потери данных — не лучший вариант.
Так зачем восстанавливать битую базу, когда можно взять её из неповреждённого бекапа?
Затем, что бекап от мая 2012 года. Это 6 месяцев назад — меня не устраивала такая потеря истории.
Читаем вашу предысторию:
Переустановил ОС Win7, установил skype (6-й), привычно скопировал всю папку профиля из старого: %AppData%\Roaming\Skype\мой_профиль\ в новое место. Запускаю скайп и вдруг он виснет на автовходе. После повторного запуска вижу приглашение войти. Вхожу — все контакты на месте, а сообщений — практически нигде нет.
Мои действия в таком случае:

1) Повторно копируем профиль вместо повреждённого, если на входе не подвисает и историю видно — готово.

2) Если происходит повторное зависание и повреждение профиля, ставим ту же версию скайпа, которая работала с профилем, и после логина средствами самого скайпа обновляем её до последней версии. Это на случай, если программа установки вносит изменения в базу, без которых программа виснет (подмена профиля от 5-й версии на 6-ю — нестандартная ситуация, разработчики предполагают обычное обновление).

Вы ясно написали, что переустановили систему и скопировали профиль обратно, значит он уже свежий. При чём здесь старый полугодовой архив — не понятно.
Не хочу вступать с Вами в длительную полемику. Объясню просто:
1. Есть рабочая база полугодовой давности.
2. Есть свежая копия профиля с предыдущей системы с побившейся базой.

Ваши пункты 1 и 2 совмещены вначале топика в фразе:
«Проделал N(^k) попыток копировать базу данных, удаляя файлы блокировок, is-corrupt и прочие. »
Теперь понятно. Мне было не очевидно, что у вас повреждена не копия, а исходная база со старого компьютера, и при этом там скайп работал.
Спасибо, автор. Из вашего сообщения я почерпнул ценную информацию о том, что базу Скайпа можно анализировать сторонним ПО. Главным образом это имеет ценность в виде экспорта сообщений в какой-нибудь формат, чтобы можно было оперировать ими более свободно, чем средствами Skype.
Это исследовали до меня, почитайте по хабу skype пару постов назад.
Ссылки в топике приведены:
habrahabr.ru/post/160315/
habrahabr.ru/post/158545/

База полностью открыта — действительно можно много добавить возможностей, включая одновременный доступ посторонним ПО, резервное копирование или конвертацию в MySQL, где уже даже в phpMyAdmin появляется масса возможностей по разнообразной фильтрации истории.
Ну и, конечно, вопрос безопасности тут в полный рост.
Вся история переписок хранится на серверах майкрософта и автоматически подгружается при входе в скайп. Не понял суть топика.

А нашёл статью потому, что искал, каким именно образом закодирована переписка в файле main.db.
yaptro, статья от 2012 года. И насколько мне известно, в скайп подгружается информация не с серверов майкрософта, а из клиентов контакт-листа, находящихся в сети. Если контакт не онлайн — переписка с ним не подгружается. Ну ещё с недавних пор — из пуш-нотификаций приходит на мобильные клиенты.

И переписка там не закодирована, там просто sqlite база данных. Полностью открытая. Если конечно ничего не поменялось за последний год.
Однако, удаляя базу данных, все разговоры загружаются заново. И иногда собеседники не в сети.

Да, sqlite база данных. Осталось только разобраться, как с ней работать (как извлечь информацию — получить её в текстовом виде). Может, кто поможет?
Возможно, собеседники просто не хотят, чтобы вы их видели :)

Первая ссылка в посте — habrahabr.ru/post/160315/ — на мой пост о том, как с ней работать.
Нет, не все разговоры загрузятся. Если у вас рабочая история переписки за 3-5 лет, то синхронизация подгрузит пару месяцев назад, но далеко не факт, что всю историю.
Спасибо. Я пользовался sqlitebrowser — оконным приложением. Всё скопировал.

Нет, не все разговоры загрузятся. Если у вас рабочая история переписки за 3-5 лет, то синхронизация подгрузит пару месяцев назад, но далеко не факт, что всю историю.


Подгрузилась вся база с того момента, когда я её последний раз чистил.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации