The database has version 8 but the largest supported version is 7

I am using the new beta in Ubuntu Linux. Previously I was on, and before on beta

After the last update I already successfully run a few backups, but now I have problems with other commands.

I tried to use restore from the browser GUI, and yellow warnings appear, telling “Got 1 warning(s)”. A Show button is not present, only Dismiss is clickable.

Then I tried to launch a “compare” command from the command line, and I got the following message:

The database has version 8 but the largest supported version is 7.

This is likely caused by upgrading to a newer version and then downgrading.

which is very strange, because I have not downgraded Duplicati. The About tab says: “You are currently running Duplicati -”.

I also noticed that /usr/bin/duplicati-cli launches /usr/lib/duplicati/Duplicati.CommandLine.exe, which has timestamp from April 2018. There is another Duplicati.CommandLine.exe in /usr/share/Duplicati/updates/ , but if I try to use it directly with

mono /usr/share/Duplicati/updates/ compare ...

it throws a series of errors like “Attempt to write a read-only database”.

Has anybody had the same problem on Linux?

I was able to restore from my Docker (Linux-ee) container…

What is your base version?
main menu -> About -> System info

* ServerVersion :
* ServerVersionName : -
* ServerVersionType : Beta
* StartedBy : Server
* BaseVersionName :
* DefaultUpdateChannel : Beta

There was definitely a database upgrade (or two) between those versions so despite what’s showing in your System info, my guess is somehow the update isn’t loading correctly so it’s falling back to the base version.

Per this post the easiest “fix” for that to do a full install on top of your existing install. This will effectively update your BASE version to whatever you install (I would assume

Mmm, OK. This is worrying, because in my case nothing indicated that the upgrade was not working. I know suspect that even the failed. If the updates failed, I would rather know why they failed, than betting overwriting the base version will suddenly work.

Integration between command line and web interface #2693 explains how

The commandline interface is intentionally separate from the server. The use case is for people who prefer headless commandline tools.

but this might open up the possibility that your server picked up the new version, while commandline did not.

C:\Program Files\Duplicati 2>Duplicati.CommandLine.exe system-info
Duplicati: Duplicati.CommandLine, Version=, Culture=neutral, PublicKeyToken=null (Duplicati.Library.Main, Version=, Culture=neutral, PublicKeyToken=null)
Autoupdate urls:;
Update folder: C:\ProgramData\Duplicati\updates
Base install folder: C:\Program Files\Duplicati 2
Version name: "" (
Current Version folder C:\ProgramData\Duplicati\updates\ beta

shows how my base version got to run when the base version found and loaded an update.
Update locations vary, sometimes even being related to the home directory, which gets awkward if Duplicati happens to normally start as service/daemon as different user than the user running at a command prompt.

Downgrading / reverting to a lower version shows some of the places that the updates folder may be found. Did commandline find the spot? I think Linux also has a ~/.config/Duplicati/dbconfig.json file. Not certain if it might have some effect on this. I think @JonMikelV knows it better, so I give this back after interrupting. :wink:

Thank you. I executed duplicati-cli system-info and realized that in my system there is a .config/Duplicati/updates/ folder in my home directory (with no updates), beyond the /usr/share/Duplicati/updates/ folder (with the new beta update).

So indeed it seems that the GUI takes the update from /usr/share/Duplicati/updates/, while the cli takes ~/.config/Duplicati/updates/.

I tried to copy the beta update from /usr/share/Duplicati/updates/ to ~/.config/Duplicati/updates/ and relaunched the cli command. Now I get the error:

Mono.Data.Sqlite.SqliteException (0x80004005): Attempt to write a read-only database
attempt to write a readonly database
  at Mono.Data.Sqlite.SQLite3.Reset (Mono.Data.Sqlite.SqliteStatement stmt) [0x00084] in <5874f0c55a674ffc901a91a755e391d7>:0 
  at Mono.Data.Sqlite.SQLite3.Step (Mono.Data.Sqlite.SqliteStatement stmt) [0x0003d] in <5874f0c55a674ffc901a91a755e391d7>:0 
  at Mono.Data.Sqlite.SqliteDataReader.NextResult () [0x00104] in <5874f0c55a674ffc901a91a755e391d7>:0 
  at Mono.Data.Sqlite.SqliteDataReader..ctor (Mono.Data.Sqlite.SqliteCommand cmd, System.Data.CommandBehavior behave) [0x0004e] in <5874f0c55a674ffc901a91a755e391d7>:0 
  at (wrapper remoting-invoke-with-check) Mono.Data.Sqlite.SqliteDataReader..ctor(Mono.Data.Sqlite.SqliteCommand,System.Data.CommandBehavior)
  at Mono.Data.Sqlite.SqliteCommand.ExecuteReader (System.Data.CommandBehavior behavior) [0x00006] in <5874f0c55a674ffc901a91a755e391d7>:0 
  at Mono.Data.Sqlite.SqliteCommand.ExecuteDbDataReader (System.Data.CommandBehavior behavior) [0x00000] in <5874f0c55a674ffc901a91a755e391d7>:0 
  at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader () [0x00000] in <22e3c01ef2924ed2a1e251e05ed2871e>:0 
  at Duplicati.Library.Main.Database.ExtensionMethods.ExecuteScalarInt64 (System.Data.IDbCommand self, System.Boolean writeLog, System.String cmd, System.Int64 defaultvalue, System.Object[] values) [0x00061] in <c6c6871f516b48f59d88f9d731c3ea4d>:0 
  at Duplicati.Library.Main.Database.ExtensionMethods.ExecuteScalarInt64 (System.Data.IDbCommand self, System.String cmd, System.Int64 defaultvalue, System.Object[] values) [0x00000] in <c6c6871f516b48f59d88f9d731c3ea4d>:0 
  at Duplicati.Library.Main.Database.LocalDatabase..ctor (System.Data.IDbConnection connection, System.String operation) [0x0005e] in <c6c6871f516b48f59d88f9d731c3ea4d>:0 
  at Duplicati.Library.Main.Database.LocalDatabase..ctor (System.String path, System.String operation, System.Boolean shouldclose) [0x00007] in <c6c6871f516b48f59d88f9d731c3ea4d>:0 
  at Duplicati.Library.Main.Database.LocalListChangesDatabase..ctor (System.String path) [0x00000] in <c6c6871f516b48f59d88f9d731c3ea4d>:0 
  at Duplicati.Library.Main.Operation.ListChangesHandler.Run (System.String baseVersion, System.String compareVersion, System.Collections.Generic.IEnumerable`1[T] filterstrings, Duplicati.Library.Utility.IFilter compositefilter, System.Action`2[T1,T2] callback) [0x00078] in <c6c6871f516b48f59d88f9d731c3ea4d>:0 
  at Duplicati.Library.Main.Controller+<>c__DisplayClass28_0.<ListChanges>b__0 (Duplicati.Library.Main.ListChangesResults result) [0x0001c] in <c6c6871f516b48f59d88f9d731c3ea4d>:0 
  at Duplicati.Library.Main.Controller.RunAction[T] (T result, System.String[]& paths, Duplicati.Library.Utility.IFilter& filter, System.Action`1[T] method) [0x00271] in <c6c6871f516b48f59d88f9d731c3ea4d>:0 
  at Duplicati.Library.Main.Controller.ListChanges (System.String baseVersion, System.String targetVersion, System.Collections.Generic.IEnumerable`1[T] filterstrings, Duplicati.Library.Utility.IFilter filter, System.Action`2[T1,T2] callback) [0x0003e] in <c6c6871f516b48f59d88f9d731c3ea4d>:0 
  at Duplicati.CommandLine.Commands.ListChanges (System.IO.TextWriter outwriter, System.Action`1[T] setup, System.Collections.Generic.List`1[T] args, System.Collections.Generic.Dictionary`2[TKey,TValue] options, Duplicati.Library.Utility.IFilter filter) [0x0013a] in <04206d56f2084515b87543fcb90a7e00>:0 
  at (wrapper delegate-invoke) System.Func`6[System.IO.TextWriter,System.Action`1[Duplicati.Library.Main.Controller],System.Collections.Generic.List`1[System.String],System.Collections.Generic.Dictionary`2[System.String,System.String],Duplicati.Library.Utility.IFilter,System.Int32].invoke_TResult_T1_T2_T3_T4_T5(System.IO.TextWriter,System.Action`1<Duplicati.Library.Main.Controller>,System.Collections.Generic.List`1<string>,System.Collections.Generic.Dictionary`2<string, string>,Duplicati.Library.Utility.IFilter)
  at Duplicati.CommandLine.Program.ParseCommandLine (System.IO.TextWriter outwriter, System.Action`1[T] setup, System.Boolean& verboseErrors, System.String[] args) [0x00313] in <04206d56f2084515b87543fcb90a7e00>:0 
  at Duplicati.CommandLine.Program.RunCommandLine (System.IO.TextWriter outwriter, System.IO.TextWriter errwriter, System.Action`1[T] setup, System.String[] args) [0x00002] in <04206d56f2084515b87543fcb90a7e00>:0

How did you build the cli compare command? Typically doing true cli for a GUI job is awkward due to the need to specify all the settings to match what the GUI used. While one can export for true cli use, It’s often easier to use the GUI Commandline option instead, because the settings are automatically populated. Either way, one gets to convert the syntax from what backup needs to whatever the new command needs. Another possible issue if the GUI runs as a more powerful user (such as root on Linux or SYSTEM on Windows) is accessability to databases owned by the more powerful user. This might be what you’re seeing. Are you supplying any options like –dbpath pointing to the proper SQLite file for this backup? If so, what are its permissions, e.g. if you check it with ls -l?

That was it! My bad, I installed the duplicati service, therefore the database has root owner.

Using sudo allowed me to lauch the desired compare. So, copying the update folder from /usr/share/Duplicati/updates to ~/.config/Duplicati/updates works.

So, the remaining issues are:

Looking at the Downgrading document linked above, it seems clear to me that where updates go is confusing, and I’ve seen no formal documentation of the method. I think the forum has some comments about searching until some place that can be written is found (good idea) but root and SYSTEM can write just about anywhere. Instead of looking for all the commentary on that, I’ll just point to one I found that’s actually a part of the larger question of updates. Duplicati is nice when it works. See Updating via web interface vs installing .deb package

The updates used will be based on the account under which the service or CLI is executed.

If you ran the GUI under your account instead of root then it would use ~/.config.

Unfortunately, we can’t tell the CLI running under your ID to use the updates folder that root uses as we don’t know if your user has access to the folder.