How to downgrade from Chrome 35 to 34 without losing data?

Solution 1:

Note: Close Chrome and back up your profile before messing with it!

Web Data is a SQLite database, so I used the sqlite3 program to open the database.

  1. What is the current version of the "Web Data" database? (run SELECT * from meta;)

    sqlite> SELECT * FROM meta;
    Default Search Provider ID|34
    last_compatible_version|55
    version|55
    Builtin Keyword Version|70
  2. The emphasized rows in the previous output refer to internal database version numbers in Chromium. For every version, you can find the relevant migration codes in Chromium's source code (autofill_table.cc). Specifically, take a look at the AutofillTable::MigrateToVersion method. Since my database version is 55, I looked at "case 55"

    case 55:
          *update_compatible_version = true;
          return MigrateToVersion55MergeAutofillDatesTable();

    After finding out this method, I was almost ready to write a SQLite query to reverse the migration.

  3. Using the knowledge from the previous step (and the original schema from a different table on another computer), I constructed the following query (copy-paste the query to sqlite3):
    Note: This query is specific to downgrading Chrome 35 to 34!

    CREATE TABLE autofill_v54 (
        name VARCHAR,
        value VARCHAR,
        value_lower VARCHAR,
        pair_id INTEGER PRIMARY KEY,
        count INTEGER DEFAULT 1);
    CREATE TABLE autofill_dates (
        pair_id INTEGER DEFAULT 0,
        date_created INTEGER DEFAULT 0);        
    
    INSERT INTO autofill_v54 (
        name,
        value,
        value_lower,
        count
    ) SELECT name, value, value_lower, count FROM autofill;
    
    INSERT INTO autofill_dates (
        pair_id,
        date_created
    ) SELECT pair_id, date_created
      FROM autofill_v54 a54 JOIN autofill a USING (name, value);
    
    DROP TABLE autofill;
    ALTER TABLE autofill_v54 RENAME TO autofill;
    
    CREATE INDEX autofill_name ON autofill (name);
    CREATE INDEX autofill_name_value_lower ON autofill (name, value_lower);
    
  4. After reverting the migration, you can safely lower the database version:

    UPDATE meta SET value='54' WHERE key='version' OR
                                     key = 'last_compatible_version';
    
  5. Close the database using .quit

After completing all of these steps, I started Chromium, there were no annoying popups and all profile data was still intact!