LINEの仕組み from did2memo.net

LINEの仕組みや使い方などについて詳しく解説します

【LINE】アップデートで消えた友だちとトーク履歴を元に戻す方法と不具合の原因考察(LINE 4.5.0, 4.5.1不具合対策)【検証情報募集中】

LINE (1601) LINE-アップデート (172) iPhone (1654)

LINE 4.5.0にて、アップデート後に友達・グループ・トーク履歴がすべて消えてしまう不具合が発生中です。この記事では、「こうやったら直りました」という情報提供をもとに、復活方法やバグの原因について考察します。ただ、【重要】手元のiPhone/iPodでは、データが消える不具合が発生しなかったので、検証できていません 【/重要】(原因の考察では、紹介する対策が成功することを仮定しています)。ヒントの段階であっても、共有しておくことが大切だと考えています。また、一部の人しか解決できない対策だったとしても、それをシェアして試してもらえる状態にしておくことは大切だと思っています(自己責任注意)。そこで、遭遇した人の検証情報を募集中です。情報お待ちしております。思いついたことや調べたことで参考になりそうなことや、感じた疑問点は、まとまりがなくても消してしまわず、とりあえず書くだけ書いておきました(寝る前に書き始めたらもう5時半なので寝ます)

未検証ではあるものの、仕組みについてはいろいろ調べたので、ある程度のリスクはあるものの、どうせ何もしなければ消えてしまうトーク履歴だったりするので、挑戦する価値はあると思います。

※ここで紹介する復旧方法は、すこし敷居が高い作業です。なので、自信がない人は試さずに前回紹介した対策(再インストール)で友だちを復旧し、トーク履歴を諦めることをおすすめします。トーク履歴が消えて死にそうな人なんかは、詳しい人に頼み込んでみるとよいかとおもいます。ただ、自作の着せかえを設定しているユーザーも多いことですし、実行そのものの難易度が絶望的に高いわけではありません。また、今回紹介する復旧方法を用いて、トーク履歴のデータを復元可能なLINEアップデートが公開されるかもしれないので(なさそう)、試して損するかも知れません。ちなみに、既に再インストールしてしまった場合は、復元元のデータが消えていると思われるため、復旧は困難です(iTunesやiCloudのバックアップデータから、後述する復旧に必要なファイルを持ってくる方法はあります)。

※記事全文は長いですが、「対策」は

不具合の内容

不具合の内容については、リンク先をご覧ください。

アップデートに伴って、本当にいろいろな不具合が発生しているのですが、注目されているのは「友だち一覧から誰もいなくなる」不具合と、「トーク履歴が全部消える」不具合です。

情報提供

情報提供は、次の2つのツイートで行われました。

この2ツイートをヒントにこの記事を書いています。

破損データ

データが消える不具合の原因になっている破損データは、LINEアプリ以下の「Documents/talk.sqlite」です。

このtalk.sqliteは、トーク履歴だけでなく、友だち情報などがごっそり保存されているデータベースファイルです。そのため、これを正常な状態にできればデータが復活します。

対策(データ復旧方法)

壊れている「talk.sqlite」を削除(移動・名前変更でバックアップ)し、代わりに同じフォルダにある「.talk.sqlite.migrationdestination_XXXX」というファイルを「talk.sqlite」という名前にして、置き換えます。以上、これが対策です

※「.talk.sqlite.migrationdestination_XXXX-shm」「.talk.sqlite.migrationdestination_XXXX-wal」がある場合は、それぞれ「talk.sqlite-shm」「talk.sqlite-wal」に置き換えてみてください。

※とりあえず不具合が発生していない手元の端末では、.migrationdestinationファイルは存在しませんでした。

これがタレコミに基づく復旧方法です

使うツール

Windows環境にて、iPhone内のファイルの閲覧・操作などは「i-Funbox」を利用すればOKです。

LINEで友達が消えるバグの原因分析

以下、この復旧方法が成功することを仮定して、不具合の原因について考察します(手元に不具合に遭遇した端末がないことが本当に悔やまれる)。

マイグレーション

さて、復旧に利用するファイル名からして「マイグレーション」が不具合と関係していそうです

データベース周りでマイグレーションといえば、既存のデータベースに保存されているデータを保持したまま、テーブルを追加したり、カラムに変更を加えたりすることを指します(参考)。

マイグレーション失敗?

LINEアプリでは、このSQLiteのDBファイル操作に、Apple純正の「Core Data」が使われていると思われます。

このCore Data での データマイグレーションについては、充実した公式資料があります:Core Data Model Versioning and Data Migration Programming Guide: Core Data Model Versioning and Data Migration

さて、その資料には残念ながら、実装の詳細だからか利用者向けマニュアルだからか、.migrationdestinationファイルについての記述はなさそうなのですが、StackOverflowに次の投稿がありました。

These are files that exist during a migration. If you are seeing these files then your migration failed. Check your crash logs on that device and confirm. 引用元

ここから、.migrationdestination_XXXX ファイルはマイグレーション実行時の中間ファイルで、マイグレーションが正常終了していれば、削除されているはずで、それが残っているからにはマイグレーションが失敗したに違いない、ということが読み取れます。

つまり、今回のLINEの不具合の原因は、Core Data の マイグレーション実行の失敗であると考えられます。

というわけで、LINE 4.5.0 では、データベースのテーブルの追加削除やカラムの追加削除が伴うアップデートだったと考えられます。

別の復旧方法

ですから、今回の復旧方法では、アプリケーションが前提とするスキーマと、実際の復旧後のtalk.sqliteが不一致を起こす可能性があります。

というわけで、とりあえず.talk.migrationdestinationを救出しておいて、再インストール&LINEログインを行ってLINE 4.5.0にとって正しいスキーマを作成した後に、talk.sqliteの内容をそこにマージするのが、よりよいかもしれません。

ただ、「マージ」と言っても、再ログインで「友だち情報」や「参加グループ情報」などはLINEのサーバーから再取得されて復旧されるため、マージしたいのは端末のみに保存される「トーク履歴」くらいで、比較的簡単なはずです。

トーク履歴が格納されているテーブルZMESSAGEをとりあえず上書きすれば、だいたい復活するのではないでしょうか。ただ、ZMESSAGEMETADATAなんていうテーブル(空だったから使ってないかも)をはじめ、その他のなんとかMETADATAテーブルなど、整合性チェックが必要なその他のテーブルもあるかもしれません

いやいや、マイグレーションは仕上げ以外成功済みかも

次の投稿に書いてあるように、実はマイグレーションには成功していて、マイグレーション結果が.talk.sqlite.migrationdestination_XXXXに保存されているのにもかかわらず、talk.sqliteへの置き換えにだけ失敗していたとも考えられます。

I guessed why this error happens.
Maybe user has succeeded migration.
So there are two sql files. appname.sqlite and .appname.sqlite.migrationdestination_xxxx.
Then iOS is going to exchange these files, but if app is killed by some reason, appname.sqlite remains in the middle of deleting. 引用元

destinationという名前からも、そこにデータがごっそりちゃんと詰まっているのであれば、そこにあったデータは新しいスキーマにマイグレーション済みと考えるほうが自然です。

そもそもどうしてマイグレーションに失敗したのか

「マイグレーション失敗」が原因と言えば原因ですが、それはもっと根源的な原因の結果であって、そちらのほうが重要です。

すぐ思いつくのは、トーク履歴のデータが巨大すぎて、マイグレーションに失敗してしまったというパターンです。

例えば、トーク履歴が巨大すぎると、マイグレーションのどこかの段階でにメモリを大量に消費してし、それが原因でプロセスが落ちてしまい(iOSに落とされてしまい)、マイグレーションが中途半端なままアップデート作業が終わってしまう、というケースです。

ヘビーユーザーが抱え込んでいるトーク履歴の量は尋常じゃないので、そんな巨大ファイルを扱いきれずにクラッシュしてしまったなんてことが容易に想像尽きます(絶対どこかに操作可能な上限があるはず。とりあえずトーク履歴でiPhoneのストレージが足りなくなっちゃったーみたいなユーザーはさすがに無理ではないか)

対策と症状からしてtalk.sqliteは破損というより空っぽ?

今回の対策で成功するとすれば、.migrationdestinationには、トーク履歴がどっさりつまっていることになります。ここでもし、talk.sqliteがほんの一部破損しているだけで、データがこちらにもどっさり詰まっていたならば、ストレージがマイグレーション時に約2倍必要と考えられます。たしかにそんなこともあるかもしれませんが、ストレージを無駄遣いしないように、そして2倍利用が原因でマイグレーションに失敗しないように、変換したデータを.migrationdestinationに書き込みつつ、変換が済んだデータは.sqliteから削除して、利用ストレージの増加を抑えているかもしれません。

そう考えると、友だちデータがさっぱり消えていしまっている=.sqliteが空っぽ状態と解釈できます。ただ、それはそれでマイグレーションまで完了して、最後の置き換え時に限って失敗するのが不思議な気もします。2倍必要な実装だったとしても、途中で失敗しないのもなんだか不思議な気がしますが。

このあたりは、実際に不具合に遭遇した端末が沢山あれば、すぐ検証できそうなのですが。。。とりあえずtalk.sqliteと.talk.migrationdestination_XXXXの中身およびスキーマを比較してみたいです。

失敗する人と成功する人の違い、の予想

ここまで考察してみると、マイグレーションの失敗と成功の違いが、不具合に遭遇するかしないかの違いになっていそうです。

となると、失敗する人の傾向として、トーク履歴が大きいことや、iPhoneのストレージ容量やメインメモリなどリソースに余裕が無いこと、古いバージョンから一気に4.5.0へアップデートしたことなどがあるかもしれません

iTunes・iCloudバックアップからの復元も

ここまで書いておいてなんですが、機種変時のようにiTunesバックアップやiCloudバックアップから復元する方法もありそうです。ただ、アプリケーションイメージを復元するわけではなく、アプリは最新版をダウンロードして、そこにデータを復元する感じだったはずなので、対策を取らない限り、何度やってもアップデートに失敗するかもしれません。また、当然バックアップ時点以降のデータは復元できません。とりあえずバックアップからの復元を試すにしても、.migrationdestinationファイルは救出しておいたほうがお得感があります。

成功例

関連

☆☆☆ LINEの不具合・バグ情報配信アカウントをフォロー ☆☆☆

コメント(8)

  1. とも
    2014年7月25日(金) 06:37

    初めまして
    今回のアップデートで大切な人とのトーク履歴だけがすべて消えてしまいました…
    どうにかして復活させたいと思いこちらにたどり着きました。
    i-Funboxはよく使っているので簡単に復活させれるかと思いきや「.talk.sqlite.migrationdestination_XXXX」がありませんでした
    どうしても諦められないので何か他の解決方法があれば教えて頂きたいです…よろしくお願いします

  2. did2
    2014年7月25日(金) 11:08

    >ともさん
    わからない点があるので、いくつか質問させてください。
    ・どんな症状がありましたか?(トーク履歴が消えた以外。友達も消えていたかなど。)
    ・どんな対策をしましたか?(再インストール等。対策によってデータファイルが消えた可能性もあるので)
    ・i-Funboxで、talk.sqliteは見つかりましたか?そのフォルダには、他のどんなファイルがありましたか?
    ・talk.sqliteが存在していた場合、その中身はどんな様子でしたか(FirefoxをインストールしてSQLite Managerアドオンをインストールして、それでtalk.sqliteを開くのが簡単です)?空っぽになっていないか、TablesにあるZMESSAGEを開いてトーク履歴が残っているかをチェックしてみてください。残っていれば何かできるかもしれません。
    ・iTunesやiCloudのバックアップからの復元は検討しましたか?
    ・トーク履歴はどれくらいありましたか?(talk.sqliteがあれば、そのサイズなど)
    ・古いバージョンからのバージョンアップですか?それとも、一つ前のバージョンからのアップデートですか?
    ・iPhoneは4s、5、5sなど、どの機種ですか?
    ・iOSのバージョンはいくつになっていますか?

    難しい質問もあるかと思いますが、できるだけ詳しくお願いします。

  3. とも
    2014年7月27日(日) 21:07

    お返事が遅くなり申し訳ありません

    ・どんな症状があったか
    友達1人とのトーク履歴が全て消えました。
    友達も1人消えていますがバグの影響か友達自身が削除したのかはわかりません。
    ・どんな対策をしたか
    バックアップを取っていなかったためLINE入れ直しもできず何もしていません。
    ・i-Funboxでtalk.sqliteはありました。
    他にはAd-X.DeviceKeyFoundという空っぽのファイルとSkinsフォルダがあります。
    ・TablesにあるZMESSAGEを開いたところZ~というのがいくつかありましたが何がどの履歴なのかがわからないです・・・すいません。
    ・iTunesやiCloudのバックアップは長い間取っていませんでした・・・。
    ・talk.sqliteは13.7MBバイトです。
    ・1つ前のバージョンからのアップデートです。
    ・iPhoneは5でiOSのバージョンは6.1.2です。

    やはりバックアップを取ってないと難しいですかね・・・

  4. Chiisha
    2014年8月9日(土) 02:10

    あの。iFunBoxの中にLINEをエクスポートしたのですが保存されてないのですがどうしたらいいですか?

  5. hiyori4115
    2014年10月17日(金) 07:23

    初めまして。突然の問い合わせ失礼致します。
    HPを拝見して、お知恵をお借りできないかと思い、投稿させていただきます。

    先程LINEが強制終了され、再起動したら、友達やトークが全て消え、「追加しよう」の画面になっていました。
    最初トークの未読数やタイムラインは表示されていたのですが、未読数は先程消えていました。
    未読があったので、トークだけでも表示されるように、何とかしたいのですが何か方法はないでしょうか?
    このような場合もこちらの方法試せますでしょうか?

    LINEは10月9日にアップデートしてます。
    iphone5で容量はいっぱいになりかけでした。
    ストレージ不足かと反省しています…。
    バックアップはとれていません。

    恐れ入りますが、ご意見いただけますと幸いです。
    よろしくお願い致します。

  6. 絢香
    2015年4月18日(土) 17:55

    中学生です。
    先ほど、このブログを拝見した者です。
    私は自動アップグレードをされたみたいで、
    友達は復活しましたが、トーク履歴は全部消えてしまいました。
    これは、前みたいに時間が経てば回復が可能になるのでしょうか?
    もし、回復しないのであれば、中学生や子供向けの対処法を伝授して頂ければ幸いです。
    よろしくお願いします。

  7. さや
    2015年10月23日(金) 07:21

    初めまして。
    いきなり「データが壊れているため、友だち一覧の復旧を行います。(トーク履歴は復旧できません)」と出てきたので、焦って検索したらこのサイトが出てきたので、お力をお借りしたいと思います。
    i-Funboxで.talk.sqlite.migrationdestination_XXXXというファイルを探してみたところ、見つかりませんでした。どうも.talk.sqliteというファイルがちょっと壊れていたみたいで…
    どうしても復旧させたいので他に方法があれば教えていただきたいです。
    よろしくお願いします。

  8. のり
    2016年5月19日(木) 08:51

    突然のメールで失礼いたします。
    iPhone4を所有しており、LINEやWhatsAppがiOSが古いため機能しなくなり、お恥ずかしい話、先日ようやくiTune経由でバックアップ(セキュリティー付)で行い、iOSをiOS4.3からiOS7.1.2へバージョンアップを行いました。その際、WhatsAppやViber、SMSは問題なくトーク履歴は引き継ぐことができたのですが、LINEだけトーク履歴がうまく引き継げませんでした。
    色々、ネット検索し、iBackupBot、iFunBoxをインストールし、iFunBoxのLINEのDocumentフォルダにtalk.sqlite(18,716KB)を格納しました。
    しかしながら、iPhoneの読み込み段階でtalk.sqliteが壊れているようで”データが不完全”と言ったようなメッセージが現れLINEを開いてもトーク履歴が復元されませんでした。talk.sqliteの容量が18,716KBありるので何かしらデータはあると思いiBackupBotでtalk.sqliteの中のZMESSAGEを見ると10000line以上表示できないと言うポップアップメッセージが出て、LINEでやり取りしたメッセージの一部が表示されます。
    メッセージのデータがそこに残っているので、なんとかtalk.sqliteを復旧させメッセージ履歴を復活させたいので何か良い方法をご教授ください。
    LINEの以前使っていたバージョンは4.3、現在iOSのバージョンアップに伴いLINEのバージョンが6.2になっています。
    よろしくお願いいたします。

新しいコメントを投稿