Skip to main content

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


After upgrading Chromium from 34 to 35, the usability of Chromium went downhill. So I decided to downgrade Chromium. Fortunately, the previous version of Chromium was still somewhere on my disk, so downgrading (in ArchLinux) was as simple as:


sudo pacman -U /var/cache/pacman/pkg/chromium-34.0.1847.137-1-x86_64.pkg.tar.xz

After running the previous command, Chromium did start, but unfortunately, I kept getting bugged by the following message on start-up:



Your profile can not be used because it is from a newer version of Google Chrome. Some features may be unavailable. Please specify a different profile directory or use a newer version of Chrome.



One way to get rid of this message is to delete ~/.config/chromium/Default/Web Data, but this also caused my search engine keywords to disappear.


How can I downgrade Chromium without losing any data?


Note: I'm using Linux, but this problem is platform-independent. Feel free to answer from the perspective of a non-Linux operating system such as Windows.



Answer



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!


Comments