Qqwy

Qqwy

TypeCheck Core Team

How to properly do backups with Mnesia?

Hey everyone!

As you might have heard previously, I’m working on a chat-application. We happen to use Mnesia as database of choice. For safety, we’d like to perform backups of all messages in the system every hour, so that in the case something goes unexpectedly extremely wrong, we can restore an old version.

However, when the system grows, backing up every hour will result in a large duplication of data. So my question:

  • Is there a way to perform incremental backups with Mnesia?
  • Or alternatively, is it smarter to back up the data in another, non-mnesia (e.g. some kind of serialized) format?
  • Are there other people doing backups with Mnesia, if so, what is your strategy?

Most Liked

cmkarlsson

cmkarlsson

I’ve heard of a way but it is not documented.

I found one mention of it here: Mnesia Release Notes (section 1.10.1)

According to this document you can use [{incremental, PrevName}] to the mnesia:backup/1,2 and mnesia:backup_checkpoint/2,3 to do incremental backups.

It is not quite clear how to get this started though. I know I did some experiments with this back in 2013/2014 but can’t find much code or nodes any longer just that I had it working but there was some caveat (with mnesia there always is :smiley: )

My guess is that it would be something like this:


% First backup
{ok, Name, _Nodes} = mnesia:activate_checkpoint([
{max, mnesia:system_info(tables)}
]),
ok = mnesia:backup_checkpoint(Name, "mybackup0.bak"),


% Second Backup
ok = mnesia:backup("mybackup1.bak", [{incremental, Name}]).

]),

It would likely be more consistent to always to the activate_checkpoint and backup_checkpoint and in case of PrevName being undefined you don’t it as an argument.

I think one problem here is if I remember correctly is that checkpoints are gone when a node restarts and if that happens you must start with a full backup again before doing incremental.

cmkarlsson

cmkarlsson

yes and no. The disc_only_copies for the default backend do have a 2GB limit for each table partition. disc_copies tables are limited by RAM on the machine.

Recently other mnesia backends have been released (by 3rd party) that does not have the 2GB limit or RAM limitation.

tty

tty

The table size limits can be circumvented using fragmented tables.

In terms of backups, using checkpoints is the way to go.

How long do you have to or want to store the chat data. Deleting old chats is a possibility, I’m looking at you kik.

Off loading old data to another database is a common technique. This is especially true if you want to run billing or reporting queries.

Another is to create tables by day. i.e. create a new chat table each day and although that means having 365 unique tables per year the data within each is bounded.

I recommend having 3 Mnesia nodes, 2 for your application and the 3rd for administration tasks like backups.

AstonJ

AstonJ

How big are the backups? If they are less then a few GB’s I would probably opt for a full back up - though maybe not every hour.

Can you get two drives in a raid array so that the drives are mirrored? That way you will have an exact copy of your DB/app on two drives at all times, and the backups will serve as a ‘back up’ in the event of both going down at the same time or due to some other failure. You’ll also get some performance benefits too.

Qqwy

Qqwy

TypeCheck Core Team

Currently the backups are not that big yet, but since it is a chat application, it means that the size of the database will rapidly explode once we get more users.
Furthermore, there is a lot more data being added to the database than ever removed. Doing full-system backups will contain a lot of duplicate information.

RAID is great for hardware failure, but of course less so for software failure. Nevertheless, definitely something to look into :+1:! :smiley:

@cmkarlsson Very interesting! I’ll test this out when I start working on it, and will share what I find.

Where Next?

Popular in Questions Top

shahryarjb
Hello, I get Persian date from my client and convert it to normal calendar like this: def jalali_string_to_miladi_english_number(persi...
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
sergio_101
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
LegitStack
I’m trying to make a websocket server in Phoenix or raw Elixir. I heard about gun, I think I could use cowboy, but since I’m not that sma...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New
sabri
Can someone explain the settings of pool_size of Ecto in config file? and what is the recommend size? Thanks
New
Mooodi
Given a string, how can I get access to its character by index? Enum.at("my_string", 2) doesn't work. Or rather, not char, but a substr...
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New
jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
New

Other popular topics Top

sergio
In Ruby, I can go: User.find_by(email: "foobar@email.com").update(email: "hello@email.com") How can I do something similar in Elixir? ...
New
jerry
Good day to you all. I have been struggling to get a query involving like and ilike to work. Can anyone assist me on this, please? pro...
New
itssasanka
Hi all, Trying to get some more clarity over utc_datetime and naive_datetime for Ecto: https://hexdocs.pm/ecto/Ecto.Schema.html#module-...
New
sergio
I couldn’t find any guides that worked well with Phoenix 1.6.0 and esbuild. I hope this helps people test the waters and eases you into t...
New
lk-geimfari
What is most correct way to open, read and parse JSON file with poison? For example if we have example.json file in root of some projec...
New
fireproofsocks
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? https://hexdocs.pm/ecto/Ecto.Repo.h...
New
electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
josevalim
Hi everyone, One of the features added to Elixir early on to help integration with Erlang code was the idea of overridable function defi...
New
TunkShif
This post is an instruction guide to help you setup your Neovim for Elixir development from scratch. It includes general information on h...
273 38985 115
New
magnetic
Hey :wave:t3: Elixir community, I’ve been learning Elixir, and working on some side projects. My editor of choice is VSCode, and althoug...
New

We're in Beta

About us Mission Statement