Récupérer l’historique de Safari effacée par iCloud (peut-être)

Depuis quelques années, j’ai régulièrement un petit souci : de temps en temps, une MAJ de macOS me casse mon historique de navigation dans Safari. Et pour récupérer les données, c’est horrible. J’avais déjà parlé de ça il y a un peu plus de deux ans, et je n’ai toujours pas de méthode miracle.

Quelques explications d’abord. Dans les vieilles versions de Safari (jusqu’à Mavericks inclus), l’historique se trouvait dans un gros fichier plist. Depuis Yosemite, il s’agit d’une base de données SQLite (history.db). La base de données a d’ailleurs une particularité énervante, sa taille est limitée à 80 Mo au maximum. Visiblement, la limite a été pensée pour la synchronisation iCloud mais elle a un effet pervers : elle limite le nombre d’entrées. Typiquement, mon Safari est configuré pour garder 1 an d’historique, mais j’en ai nettement moins (7 à 8 mois, je remonte jusqu’à mi-mars) parce que la base est remplie.

La récupération

A chaque fois qu’une MAJ me casse l’historique, c’est horrible. Le principal problème, c’est que si vous remettez un backup, iCloud a tendance à remettre la version stockée chez Apple, même si elle est moins complète. En fait, je n’ai pas trouvé de solution pour forcer l’ancienne version de l’historique directement : après quelques minutes (parfois quelques heures) l’historique en ligne remplace le fichier.

J’ai une technique, mais je ne suis pas certain à 100 % qu’elle fonctionne, parce que j’ai tenté pas mal de choses. Elle nécessite une copie du fichier, un programme pour manipuler du SQLite (comme ce programme) et un peu de chance.

En gros, il faut exporter les tables history_items et history_visits de la base de données à récupérer (en SQL). Ensuite, attendre qu’iCloud mette bien en place sa propre copie de la base history.db, fermer Safari et importer les deux tables dans la base de Safari. Normalement, à l’ouverture, Safari va mouliner le temps de traiter les données et il va récupérer les données.

Exportation

L’étape suivante consiste à forcer iCloud à utiliser la nouvelle base. Il faut d’abord activer le menu de Debug de Safari avec la commande suivante dans le Terminal (après avoir fermé Safari).

defaults write com.apple.Safari IncludeInternalDebugMenu 1

Ensuite, une fois Safari relancé et après avoir vérifié qu’iCloud n’a pas modifié la base (ça peut prendre quelques dizaines de minutes, et je vous conseille un redémarrage pour être certain), il faut forcer l’historique dans les menus : Debug -> Sync iCloud History. Normalement, ça va envoyer les données sur iCloud en remplacement de celles stockées. Le problème, c’est qu’iCloud est une boîte noire, donc vous ne pouvez pas savoir si les données ont été modifiées ni après combien de temps. Vu la taille de ma base, j’ai dû attendre pas mal de temps pour être certain que la nouvelle était bien en place, merci l’upload en ADSL.

En fait, ça semble avoir fonctionné chez moi (ça va faire quelques jours et mon historique est encore là), mais je ne sais pas du tout si c’est bien cette manipulation là qui a fonctionné. Le côté fermé, obscure et « pour mon bien » d’iCloud me bloque complètement sur ce problème idiot et récurrent.

Au passage, je vous conseille d’ailleurs de rentrer ces deux commandes dans l’invite de commandes SQL pour vérifier la base et gagner quelques Mo.

Vacuum;
pragma integrity_check;

En pratique, si quelqu’un connait une méthode plus efficace (ou surtout plus propre) pour récupérer l’historique depuis un backup, ça m’intéresse.