I tried to restore a gateway backup on an Ignition 8.0.2 server running on Linux but got the error
com.inductiveautomation.ignition.gateway.localdb.DBStartupException: Error restoring internal database from backup.
jvm 2 | at com.inductiveautomation.ignition.gateway.localdb.LocalDBManagerImpl.setup(LocalDBManagerImpl.java:162)
jvm 2 | at com.inductiveautomation.ignition.gateway.IgnitionGateway.startupInternal(IgnitionGateway.java:820)
jvm 2 | at com.inductiveautomation.ignition.gateway.redundancy.RedundancyManagerImpl.startup(RedundancyManagerImpl.java:272)
jvm 2 | at com.inductiveautomation.ignition.gateway.IgnitionGateway.initRedundancy(IgnitionGateway.java:664)
jvm 2 | at com.inductiveautomation.ignition.gateway.IgnitionGateway.lambda$initInternal$0(IgnitionGateway.java:602)
jvm 2 | at com.inductiveautomation.ignition.common.execution.impl.BasicExecutionEngine$ThrowableCatchingRunnable.run(BasicExecutionEngine.java:518)
After restarting Ignition I got another error:
jvm 2 | com.inductiveautomation.ignition.gateway.localdb.DBStartupException: Error restoring internal database from backup.
jvm 2 | at com.inductiveautomation.ignition.gateway.localdb.LocalDBManagerImpl.setup(LocalDBManagerImpl.java:162)
jvm 2 | at com.inductiveautomation.ignition.gateway.IgnitionGateway.startupInternal(IgnitionGateway.java:820)
jvm 2 | at com.inductiveautomation.ignition.gateway.redundancy.RedundancyManagerImpl.startup(RedundancyManagerImpl.java:272)
jvm 2 | at com.inductiveautomation.ignition.gateway.IgnitionGateway.initRedundancy(IgnitionGateway.java:664)
jvm 2 | at com.inductiveautomation.ignition.gateway.IgnitionGateway.lambda$initInternal$0(IgnitionGateway.java:602)
jvm 2 | at com.inductiveautomation.ignition.common.execution.impl.BasicExecutionEngine$ThrowableCatchingRunnable.run(BasicExecutionEngine.java:518)
jvm 2 | at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
jvm 2 | at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
jvm 2 | at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
jvm 2 | at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
jvm 2 | at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
jvm 2 | at java.base/java.lang.Thread.run(Unknown Source)
jvm 2 | Caused by: java.io.IOException: Unable to move file '/usr/local/share/ignition/temp/temp_3605037950089348593db.idb' to '/var/lib/ignition/data/db/config.idb'
jvm 2 | at com.inductiveautomation.ignition.gateway.localdb.sqlite.SQLiteDBManager.restoreFromDBBackup(SQLiteDBManager.java:436)
jvm 2 | at com.inductiveautomation.ignition.gateway.localdb.LocalDBManagerImpl.restoreFromGatewayBackup(LocalDBManagerImpl.java:685)
jvm 2 | at com.inductiveautomation.ignition.gateway.localdb.LocalDBManagerImpl.setup(LocalDBManagerImpl.java:160)
jvm 2 | ... 11 common frames omitted
This second error made it a little more clear what was going on. I looked at the file permissions to see if it was a permissions issue, but both directories had correct file/group ownership and permissions.
It occurred to me that it could be because I had my data
and temp
directories on different file systems (i.e. different physical or logical disks or storage mechanisms).
After some more experimentation, I found that if I created a symbolic link so that the temp and data directories were on the same file system then the restore would succeed.
I’m not exactly sure what Ignition is doing behind the scenes to transfer the .idb file from the temp
directory to the data
directory, but ideally it would allow transferring across file system boundaries.
I understand this is probably a narrow use-case, but I thought I’d report this issue in case other users hit it.