La base de datos "History" de Chrome está malformada

Chrome guarda tu historial de navegación en una base de datos SQLite normal — un archivo llamado literalmente History, sin extensión, en la carpeta de tu perfil. Cuando una página de su interior se rompe, SQLite rechaza todo el archivo y Chrome arranca en silencio uno nuevo y vacío. Las filas casi siempre siguen en el disco; la recuperación las lee y reconstruye una base de datos limpia.

Tu archivo nunca sale de tu dispositivo — la reparación ocurre en tu navegador. 0 bytes subidos.

Your data is the big block — usually intact. What breaks is the small index. Repair rebuilds it.

Suelta un archivo aquí o exploraToca para elegir un archivo

ZIP · Office · PDF · vídeo · JPG · PNG · RAR/7z · SQLite — reparados aquí mismo, en tu navegador. No se sube nada

0 bytes subidosGratis: 3 reparaciones/día — hasta 500 MB de vídeo, 100 MB de documentos y archivos, 50 MB de fotos. Descarga gratuita. Una reparación 5,90 €. Sin cuenta.

Repáralo ahora

  1. Suelta el archivo
  2. La reparación ocurre en local
  3. Descarga el resultado

El archivo History es una base de datos SQLite estándar (magic de 16 bytes SQLite format 3\0), así que cuando una herramienta informa de database disk image is malformed sobre él, o Chrome pierde tu historial tras un cierre inesperado, es la misma clase de fallo que puede sufrir cualquier archivo SQLite: una página o un puntero dañado, no una pérdida masiva de datos. Suelta el archivo History arriba y el escáner lo abre en tu navegador, recorre las páginas directamente, reconstruye el esquema y vuelve a insertar en una base de datos nueva y abrible cada fila que aún pueda descodificar — el archivo no sale nunca de tu equipo.

El historial de Chrome es una base de datos SQLite sin extensión

Tu historial no se guarda en un formato propietario — es una base de datos SQLite que reside en el directorio de perfil de Chrome: en Windows %LOCALAPPDATA%\Google\Chrome\User Data\Default\History, en macOS ~/Library/Application Support/Google/Chrome/Default/History y en Linux ~/.config/google-chrome/Default/History (Chromium usa ~/.config/chromium/…, Edge …/Microsoft/Edge/…, Brave …/BraveSoftware/Brave-Browser/…). El archivo se llama History sin extensión, y por eso mucha gente no cae en que puede abrirlo en cualquier herramienta SQLite — cambia el nombre de una copia a History.db y DB Browser for SQLite lo leerá al instante.

Dentro están las tablas que componen tu registro de navegación. urls guarda una fila por cada página que has visitado — sus columnas son id, url, title, visit_count, typed_count, last_visit_time y hidden. visits es la línea de tiempo: cada fila tiene una clave foránea url que apunta de vuelta a urls.id, un visit_time, un from_visit que señala la visita anterior (así se reconstruyen las cadenas de atrás/adelante) y una máscara de bits transition cuyo byte bajo es el tipo principal (LINK = 0, TYPED = 1, AUTO_BOOKMARK = 2, RELOAD = 8). Junto a ellas están keyword_search_terms, downloads y downloads_url_chains, segments/segment_usage (que alimentan los accesos directos de la Nueva pestaña) y una pequeña tabla meta con las filas version y last_compatible_version que le indican a Chrome qué esquema está mirando.

Un detalle hace tropezar a todo el que exporta el historial: las marcas de tiempo no son tiempo Unix. last_visit_time y visit_time se guardan como microsegundos desde el 1601-01-01 00:00:00 UTC (la época de Chrome/WebKit). Para leer una como fecha normal, divides entre 1.000.000 y restas 11.644.473.600 segundos. La recuperación conserva los enteros tal cual están en el disco, así que las fechas sobreviven a la reconstrucción — solo las conviertes después.

Cómo se malforma el archivo History: páginas y punteros

Una base de datos SQLite es una matriz plana de páginas de tamaño fijo — Chrome usa el valor por defecto de 4096 bytes. La página 1 lleva la cabecera y el esquema; cada tabla, incluidas urls y visits, es un árbol-b cuyas páginas interiores apuntan hacia páginas hoja que contienen tus filas reales. Chrome ejecuta la base de datos History en modo WAL (write-ahead logging), así que junto a ella verás normalmente archivos hermanos llamados History-wal y History-shm; las versiones más antiguas y algunos perfiles dejan en su lugar un diario de reversión llamado History-journal.

Esa maquinaria de archivos hermanos es justo por donde se cuela el daño. Si la máquina pierde corriente, el disco se llena o Chrome se cierra a mitad de un checkpoint, un frame del WAL puede escribirse solo a medias de vuelta en el archivo principal — una única página interior queda con un puntero de celda inconsistente o con un recuento de páginas que no cuadra con el tamaño del archivo. SQLite sigue ese puntero, encuentra algo que no es una página de árbol-b válida y se detiene con Error: database disk image is malformed (11) — código de resultado SQLITE_CORRUPT. Ejecuta PRAGMA integrity_check y verás los detalles: líneas como *** in database main ***, Page 214: btreeInitPage() returns error code 11, row 1803 missing from index urls_url_index o wrong # of entries in index visits_url_index.

Lo importante: el motor se detiene en la primera inconsistencia, pero las páginas que nunca llegó a alcanzar suelen estar perfectas, y tus filas siguen intactas en sus páginas hoja. Es la misma historia que el índice moov ausente de un vídeo o el directorio central roto de un ZIP — se rompió el mapa, no los datos. Por eso una reconstrucción a nivel de página recupera tanto donde abrir el archivo con normalidad no recupera nada.

Qué recupera realmente la reparación

Un archivo History malformado no se arregla en el sitio — se lee todo lo que aún se puede descodificar y se escribe en una base de datos nueva, exactamente como funciona el propio comando .recover de SQLite. El escáner lee cada página localmente, reconstruye el esquema a partir de las definiciones que sobreviven y luego recorre el árbol-b de cada tabla y descodifica los registros autodescriptivos de sus páginas hoja. Las filas que la cadena de punteros ya no puede alcanzar se encuentran con un barrido bruto de páginas, y todo lo que se descodifica pero no coincide con ninguna tabla conocida se escribe en una tabla lost_and_found en lugar de desecharse.

En la práctica, eso devuelve lo esencial de tu historial: la tabla urls (direcciones, títulos de página, visit_count, last_visit_time), la línea de tiempo visits con sus tipos de transition y sus cadenas from_visit, y — donde sus páginas estén intactas — keyword_search_terms, downloads y los datos de segments. Si todavía tienes el archivo hermano History-wal, añádelo en la ranura opcional después de soltar el archivo principal: sus frames confirmados se superponen antes del escaneo, de modo que la reconstrucción refleja la última transacción confirmada en vez del último checkpoint — a menudo las últimas horas de navegación. La salida es un archivo SQLite nuevo y abrible que descargas; cámbiale el nombre de vuelta a History, déjalo en la carpeta del perfil con Chrome cerrado y tu historial reaparece, o simplemente consúltalo en cualquier visor SQLite.

Dónde se detiene de verdad

La recuperación devuelve lo que está físicamente presente; no puede inventar lo que se sobrescribió. Las filas que quedaron truncadas al final del archivo, o cuyas páginas se reutilizaron tras un borrado, han desaparecido — ninguna herramienta puede traerlas de vuelta. La mayor pérdida con Chrome en concreto es el tiempo: cuando Chrome abre un archivo History que considera malformado, con frecuencia lo borra y crea uno nuevo y vacío en el acto, así que el original dañado se sobrescribe en el sitio. Si eso ya ocurrió, cierra Chrome de inmediato y recupera desde una copia de seguridad o una copia antigua de History/History-wal — el archivo vacío que lo reemplazó no tiene nada dentro que encontrar.

Dos advertencias menores, dichas con claridad. Los valores recuperados vuelven como su clase de almacenamiento en disco, así que puede que no se reaplique la afinidad declarada de una columna — las marcas de tiempo siguen siendo los enteros de microsegundos correctos, solo las conviertes tú. Y los datos recuperados de una base de datos dañada siempre son sospechosos: lo dice la propia documentación de SQLite, y como un barrido bruto también lee páginas de la lista libre, una URL borrada antes puede reaparecer de vez en cuando. El informe de recuperación indica tabla por tabla qué salió y qué se extrajo con el barrido bruto. Nada de esto necesita un servidor: el archivo History — que es un mapa de todos los sitios en los que has estado — se lee desde tu disco y se reconstruye en tu pestaña, y puedes observar la pestaña Red para confirmar que salen 0 bytes.

Qué puede y qué no puede reparar

Puede reparar

  • "database disk image is malformed (11)" en el archivo History de Chrome/Chromium por una página o un puntero de árbol-b dañado
  • La tabla urls — direcciones, títulos de página, visit_count, typed_count y last_visit_time — desde las páginas hoja que sobreviven
  • La línea de tiempo visits: visit_time, tipos de transition y cadenas from_visit de atrás/adelante
  • keyword_search_terms, downloads y los datos de segments donde sus páginas estén intactas
  • Navegación sin confirmar en un archivo hermano History-wal aportado (superpuesto antes del escaneo)
  • Campos de cabecera dañados (tamaño o recuento de páginas erróneo) con las páginas intactas por detrás

No puede reparar

  • Un historial que Chrome ya borró y reemplazó por un archivo nuevo y vacío — las filas antiguas se sobrescribieron en el sitio
  • Filas truncadas físicamente al final del archivo, o en páginas reutilizadas tras un borrado — esos bytes ya no existen
  • Una garantía de exactitud — los datos recuperados siempre son sospechosos; las URLs borradas pueden reaparecer desde páginas de la lista libre, así que verifícalos
  • Las afinidades exactas de columna: los valores vuelven como su clase de almacenamiento en disco (las marcas de tiempo siguen bien, solo las reconviertes)
  • Un archivo History de 0 bytes — eso es antes un problema de recuperación de datos del dispositivo de almacenamiento que una reconstrucción SQLite

Si una reparación falla, te decimos por qué (datos que faltan frente a estructura dañada), y nunca se te cobra por una reparación fallida.

Preguntas frecuentes

¿Dónde está el archivo History de Chrome y de verdad no tiene extensión?

Sí — es un archivo llamado literalmente History, sin extensión, dentro de tu perfil: %LOCALAPPDATA%\Google\Chrome\User Data\Default\History en Windows, ~/Library/Application Support/Google/Chrome/Default/History en macOS, ~/.config/google-chrome/Default/History en Linux. Es una base de datos SQLite normal; cópiala fuera (cierra Chrome primero) y suelta esa copia aquí, o cámbiale el nombre a History.db para abrirla en cualquier visor SQLite.

¿Qué significa "database disk image is malformed" para mi historial?

Es el error SQLITE_CORRUPT de SQLite, código de resultado 11: el motor siguió un puntero dentro del archivo y topó con algo que no es una página de árbol-b válida. No quiere decir que todas las visitas se hayan perdido — normalmente una sola página dañada tumba el archivo entero mientras las filas de urls y visits siguen intactas en sus páginas hoja. La recuperación recorre las páginas directamente y reconstruye una base de datos limpia a partir de lo que sobrevivió.

¿Necesito los archivos History-wal y History-shm?

Vale la pena traer el archivo -wal; el -shm no. Chrome ejecuta History en modo WAL, así que tus visitas confirmadas más recientes pueden vivir solo en History-wal hasta que se hace su checkpoint en el archivo principal. Suelta History primero, luego añade History-wal en la ranura opcional de archivo hermano y sus frames confirmados se superponen antes del escaneo. El archivo de memoria compartida -shm no contiene datos duraderos y no hace falta.

¿Por qué desapareció mi historial después de que Chrome dijera que el perfil estaba dañado?

Porque la respuesta de Chrome ante un archivo History que no puede abrir suele ser borrarlo y crear uno nuevo y vacío de inmediato — así que el original dañado se sobrescribe en el sitio. Si eso ocurrió, cierra Chrome enseguida y recupera desde una copia de seguridad o una copia anterior de History; el nuevo archivo vacío no tiene nada que recuperar. Cuanto antes impidas que Chrome escriba, más sobrevive de la base de datos antigua.

¿Puedo volver a poner el archivo recuperado en Chrome?

Sí. La salida es una base de datos SQLite normal con el mismo esquema de urls/visits. Cierra Chrome, cambia el nombre del archivo recuperado a History y déjalo en la carpeta del perfil (elimina antes cualquier History-wal/History-shm obsoleto). O sáltate Chrome por completo y consúltalo en un visor SQLite — recuerda que last_visit_time son microsegundos desde el 1601-01-01, así que divide entre 1.000.000 y resta 11.644.473.600 para obtener tiempo Unix.

Relacionado: Reparar una base de datos SQLite dañada · Word: contenido no legible · Acrobat: "the file is damaged" · Verificar la promesa de cero subidas