1) Setup task to write millions of rows into a table.
2) While tasks runs, take full snapshot on host A running Oracle. (snapshot is called @third). This snapshot is done in one atomic operation, for all filesystems under /oracle/KANAUSTS.
3) Send the full snapshot to host B.
4) Start Oracle on host B. (No errors encountered or recovery needed).
5) Perform select count(*) from table;
6) Shutdown Oracle on host B.
7) On host A, perform select count(*) on table (2,140,000).
8) Immediately (a few seconds after #7) take another snapshot on host A. (snapshot is called @fourth).
9) Send the incremental differences between @third and @fourth snapshots to host B. Time elapsed between snapshots was 70 minutes, constituting 1.3GB of changed data. It took 73 seconds to send the incremental difference to host B (17MB/sec).
10) Start Oracle on host B. (No errors encountered or recovery needed).
11) Perform select count(*) from table: (2,150,000).
In our version of ZFS, after sending the snapshot, one must lock the filesystem into read only mode. If the destination changes, an incremental snapshot cannot be received. The filesystem can change just by doing an ls in the filesystem (metadata change). If this occurs, which it did in step 4 since we started the database, it is very easy to rollback to the previous snapshot. In this case I rolled back to @third. This can be done in one atomic operation, in a recursive manner, eg: (# zfs rollback –r /oracle/KANAUSTS@third).
These issues are solved in subsequent versions of zfs. zfs receive –F will forcibly rollback any changes, on the fly.