This gem provides rake tasks to create and import MySQL snapshots using S3. This is pretty specialized for how CoverHound uses snapshots.
- S3
- MySQL
- bzip2
- openssl
This file, looked for at config/snapshot.yml
, allows for the following
configuration:
store.tmp
Working directory for snapshotsstore.local
Local storage of snapshotss3.*
S3 access keys, bucket, region and paths for storing regular and named snapshotsssl_key
Path to the key that will be used to encrypt the snapshottables
The tables that should be exported as part of the snapshot
# config/snapshot.yml
store:
tmp: <%= Rails.root.join("tmp/snapshots").to_s %>
local: <%= Rails.root.join("db/snapshots").to_s %>
s3:
access_key_id: 'foo'
secret_access_key: 'bar'
bucket: 'metal-bucket'
region: 'us-west-1'
paths:
snapshots: 'snapshots'
named_snapshots: 'named_snapshots'
ssl_key: "/dir/to/snapshots-secret.key"
tables:
- "example_table"
Database configuration happens in your normal config/database.yml
. If you want
a database configuration that is NOT tied to your Rails environment, you can run
these tasks with SNAPSHOT_ENV
set, and that will override where in the
config/database.yml
it looks. For example:
With this config file:
# config/database.yml
production:
username: root
password: secret
snapshot:
username: readonly
password: secret
Running the below:
SNAPSHOT_ENV=snapshot bundle exec rake db:snapshot:create
It will use readonly
instead of the root
user.
Creates a snapshot with the following naming convention:
snapshot_YY-MM-DD_HH-MM.sql.bz2.enc
This snapshot is then stored at s3.paths.snapshots
. It is assigned a version
(incrementing off of a snapshot_version
file, which is saved locally and on
S3) which is stored alongside its filename in the file snapshot_list
.
This task only runs in production.
Creates a named snapshot: [name].sql.bz2.enc
which is stored at
s3.paths.named_snapshots
. These are not stored in snapshot_list
or
snapshot_version
.
When used without arguments, it imports the latest regular snapshot from S3, then drops and replaces the local database.
Can be given arguments for the version:
db:snapshot:import[12]
gets you the 12th regular snapshot
db:snapshot:import['foo']
gets you your snapshot named foo
Imports only the tables given as arguments (foo
and bar
in this example)
from the latest regular snapshot
Reloads the current snapshot
Shows a list of snapshots
Can be given arguments for amount of entries to show:
db:snapshot:list[5]
will show the last 5 snapshots
Add this line to your application's Gemfile:
gem 'activerecord-snapshot'
And then execute:
$ bundle
Or install it yourself as:
$ gem install activerecord-snapshot
Be nice!
The gem is available as open source under the terms of the MIT License.