fractaledmind / litestream-ruby

MIT License
129 stars 15 forks source link

Question: How to restore SQLite to a different server with already existing SQLite #50

Open khaled-badenjki opened 1 week ago

khaled-badenjki commented 1 week ago

If I'm on a server A with a rails app (running with Kamal 2) and using Litestream. Then i decided to move my app to a new server B

The data is already synced to my S3, when I moved to server B i tried to restore the database, but i got this error error="cannot restore, output path already exists: /rails/storage/production.sqlite3"

I deleted the existing sqlite files and then I restored. It didn't throw errors, but I wasn't able to access the data. I felt that manually deleting the sqlite files is not a good action since there are already shm and wal files.

What should be the better way to handle my scenario?

fractaledmind commented 1 week ago

How are you running restore? And can you provide the full logs that lead up to that error?

khaled-badenjki commented 1 week ago

I'm running restore like this: bin/rails litestream:restore -- --database=storage/production.sqlite3

The logs are only the command above, and this error message: level=ERROR msg="failed to run" error="cannot restore, output path already exists: /rails/storage/production.sqlite3"

oandalib commented 1 week ago

I also ran into something similar. I got it to work like so:

  1. Delete production.sqlite3/production.sqlite3-shm/production.sqlite3-wal.
  2. IMPORTANT: do not try to access any of the resource pages (e.g. posts) or anything else that relies on ActiveRecord/SQLite. If you do this Rails could regenerate the production.sqlite3, and thus you end up getting the output path already exists error.
  3. Run the restore command.
  4. Restart the Docker container.
  5. Data should be restored.
fractaledmind commented 1 week ago

Indeed. And rails db:drop can be used to delete the 3 SQLite files

fractaledmind commented 1 week ago

@oandalib would you want to open a PR to add a section to the README detailing when one might want to restore to a new server, why the restore command can't be run until after db:drop, and the importance of restarting the Docker container

oandalib commented 1 week ago

I think we need to better define the entire restoration process, not strictly just for a new server. See #52.