1 // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
2 // This source code is licensed under both the GPLv2 (found in the
3 // COPYING file in the root directory) and Apache 2.0 License
4 // (found in the LICENSE.Apache file in the root directory).
10 * BackupEngine allows you to backup
11 * and restore the database
13 * Be aware, that `new BackupEngine` takes time proportional to the amount
14 * of backups. So if you have a slow filesystem to backup (like HDFS)
15 * and you have a lot of backups then restoring can take some time.
16 * That's why we recommend to limit the number of backups.
17 * Also we recommend to keep BackupEngine alive and not to recreate it every
18 * time you need to do a backup.
20 public class BackupEngine
extends RocksObject
implements AutoCloseable
{
22 protected BackupEngine(final long nativeHandle
) {
27 * Opens a new Backup Engine
29 * @param env The environment that the backup engine should operate within
30 * @param options Any options for the backup engine
32 * @return A new BackupEngine instance
33 * @throws RocksDBException thrown if the backup engine could not be opened
35 public static BackupEngine
open(final Env env
,
36 final BackupableDBOptions options
) throws RocksDBException
{
37 return new BackupEngine(open(env
.nativeHandle_
, options
.nativeHandle_
));
41 * Captures the state of the database in the latest backup
43 * Just a convenience for {@link #createNewBackup(RocksDB, boolean)} with
44 * the flushBeforeBackup parameter set to false
46 * @param db The database to backup
48 * Note - This method is not thread safe
50 * @throws RocksDBException thrown if a new backup could not be created
52 public void createNewBackup(final RocksDB db
) throws RocksDBException
{
53 createNewBackup(db
, false);
57 * Captures the state of the database in the latest backup
59 * @param db The database to backup
60 * @param flushBeforeBackup When true, the Backup Engine will first issue a
61 * memtable flush and only then copy the DB files to
62 * the backup directory. Doing so will prevent log
63 * files from being copied to the backup directory
64 * (since flush will delete them).
65 * When false, the Backup Engine will not issue a
66 * flush before starting the backup. In that case,
67 * the backup will also include log files
68 * corresponding to live memtables. The backup will
69 * always be consistent with the current state of the
70 * database regardless of the flushBeforeBackup
73 * Note - This method is not thread safe
75 * @throws RocksDBException thrown if a new backup could not be created
77 public void createNewBackup(
78 final RocksDB db
, final boolean flushBeforeBackup
)
79 throws RocksDBException
{
80 assert (isOwningHandle());
81 createNewBackup(nativeHandle_
, db
.nativeHandle_
, flushBeforeBackup
);
85 * Captures the state of the database in the latest backup along with
86 * application specific metadata.
88 * @param db The database to backup
89 * @param metadata Application metadata
90 * @param flushBeforeBackup When true, the Backup Engine will first issue a
91 * memtable flush and only then copy the DB files to
92 * the backup directory. Doing so will prevent log
93 * files from being copied to the backup directory
94 * (since flush will delete them).
95 * When false, the Backup Engine will not issue a
96 * flush before starting the backup. In that case,
97 * the backup will also include log files
98 * corresponding to live memtables. The backup will
99 * always be consistent with the current state of the
100 * database regardless of the flushBeforeBackup
103 * Note - This method is not thread safe
105 * @throws RocksDBException thrown if a new backup could not be created
107 public void createNewBackupWithMetadata(final RocksDB db
, final String metadata
,
108 final boolean flushBeforeBackup
) throws RocksDBException
{
109 assert (isOwningHandle());
110 createNewBackupWithMetadata(nativeHandle_
, db
.nativeHandle_
, metadata
, flushBeforeBackup
);
114 * Gets information about the available
117 * @return A list of information about each available backup
119 public List
<BackupInfo
> getBackupInfo() {
120 assert (isOwningHandle());
121 return getBackupInfo(nativeHandle_
);
125 * <p>Returns a list of corrupted backup ids. If there
126 * is no corrupted backup the method will return an
129 * @return array of backup ids as int ids.
131 public int[] getCorruptedBackups() {
132 assert(isOwningHandle());
133 return getCorruptedBackups(nativeHandle_
);
137 * <p>Will delete all the files we don't need anymore. It will
138 * do the full scan of the files/ directory and delete all the
139 * files that are not referenced.</p>
141 * @throws RocksDBException thrown if error happens in underlying
144 public void garbageCollect() throws RocksDBException
{
145 assert(isOwningHandle());
146 garbageCollect(nativeHandle_
);
150 * Deletes old backups, keeping just the latest numBackupsToKeep
152 * @param numBackupsToKeep The latest n backups to keep
154 * @throws RocksDBException thrown if the old backups could not be deleted
156 public void purgeOldBackups(
157 final int numBackupsToKeep
) throws RocksDBException
{
158 assert (isOwningHandle());
159 purgeOldBackups(nativeHandle_
, numBackupsToKeep
);
165 * @param backupId The id of the backup to delete
167 * @throws RocksDBException thrown if the backup could not be deleted
169 public void deleteBackup(final int backupId
) throws RocksDBException
{
170 assert (isOwningHandle());
171 deleteBackup(nativeHandle_
, backupId
);
175 * Restore the database from a backup
177 * IMPORTANT: if options.share_table_files == true and you restore the DB
178 * from some backup that is not the latest, and you start creating new
179 * backups from the new DB, they will probably fail!
181 * Example: Let's say you have backups 1, 2, 3, 4, 5 and you restore 3.
182 * If you add new data to the DB and try creating a new backup now, the
183 * database will diverge from backups 4 and 5 and the new backup will fail.
184 * If you want to create new backup, you will first have to delete backups 4
187 * @param backupId The id of the backup to restore
188 * @param dbDir The directory to restore the backup to, i.e. where your
190 * @param walDir The location of the log files for your database,
191 * often the same as dbDir
192 * @param restoreOptions Options for controlling the restore
194 * @throws RocksDBException thrown if the database could not be restored
196 public void restoreDbFromBackup(
197 final int backupId
, final String dbDir
, final String walDir
,
198 final RestoreOptions restoreOptions
) throws RocksDBException
{
199 assert (isOwningHandle());
200 restoreDbFromBackup(nativeHandle_
, backupId
, dbDir
, walDir
,
201 restoreOptions
.nativeHandle_
);
205 * Restore the database from the latest backup
207 * @param dbDir The directory to restore the backup to, i.e. where your
209 * @param walDir The location of the log files for your database, often the
211 * @param restoreOptions Options for controlling the restore
213 * @throws RocksDBException thrown if the database could not be restored
215 public void restoreDbFromLatestBackup(
216 final String dbDir
, final String walDir
,
217 final RestoreOptions restoreOptions
) throws RocksDBException
{
218 assert (isOwningHandle());
219 restoreDbFromLatestBackup(nativeHandle_
, dbDir
, walDir
,
220 restoreOptions
.nativeHandle_
);
223 private native static long open(final long env
,
224 final long backupableDbOptions
) throws RocksDBException
;
226 private native void createNewBackup(final long handle
, final long dbHandle
,
227 final boolean flushBeforeBackup
) throws RocksDBException
;
229 private native void createNewBackupWithMetadata(final long handle
, final long dbHandle
,
230 final String metadata
, final boolean flushBeforeBackup
) throws RocksDBException
;
232 private native List
<BackupInfo
> getBackupInfo(final long handle
);
234 private native int[] getCorruptedBackups(final long handle
);
236 private native void garbageCollect(final long handle
) throws RocksDBException
;
238 private native void purgeOldBackups(final long handle
,
239 final int numBackupsToKeep
) throws RocksDBException
;
241 private native void deleteBackup(final long handle
, final int backupId
)
242 throws RocksDBException
;
244 private native void restoreDbFromBackup(final long handle
, final int backupId
,
245 final String dbDir
, final String walDir
, final long restoreOptionsHandle
)
246 throws RocksDBException
;
248 private native void restoreDbFromLatestBackup(final long handle
,
249 final String dbDir
, final String walDir
, final long restoreOptionsHandle
)
250 throws RocksDBException
;
252 @Override protected final native void disposeInternal(final long handle
);