diff --git a/test/vinyl/recover.result b/test/vinyl/recover.result
index 4c3325bf22331086da54532a9a81425c4532c9f3..db5445f01bbb8c8c46b255af92ba9775ac6bf020 100644
--- a/test/vinyl/recover.result
+++ b/test/vinyl/recover.result
@@ -12,92 +12,6 @@ _ = tmp:create_index('primary', {parts = {1, 'string'}})
 ---
 ...
 --
--- Check that range splits, compactions, and dumps don't break recovery.
---
-s = box.schema.space.create('test', {engine='vinyl'})
----
-...
-_ = s:create_index('primary', {page_size=256, range_size=2048, run_count_per_level=1, run_size_ratio=10})
----
-...
-function vyinfo() return box.space.test.index.primary:info() end
----
-...
-range_count = 4
----
-...
-tuple_size = math.ceil(s.index.primary.options.page_size / 4)
----
-...
-pad_size = tuple_size - 30
----
-...
-assert(pad_size >= 16)
----
-- true
-...
-keys_per_range = math.floor(s.index.primary.options.range_size / tuple_size)
----
-...
-key_count = range_count * keys_per_range
----
-...
--- Add a number of tuples to the test space to trigger range splitting.
--- Rewrite them several times with different values so that different
--- generations of ranges on disk have different contents.
-test_run:cmd("setopt delimiter ';'")
----
-- true
-...
-iter = 0
-function gen_tuple(k)
-    local pad = {}
-    for i = 1,pad_size do
-        pad[i] = string.char(math.random(65, 90))
-    end
-    return {k, k + iter, table.concat(pad)}
-end
-while vyinfo().range_count < range_count do
-    iter = iter + 1
-    for k = key_count,1,-1 do s:replace(gen_tuple(k)) end
-    box.snapshot()
-    fiber.sleep(0.01)
-end;
----
-...
-test_run:cmd("setopt delimiter ''");
----
-- true
-...
--- Remember the number of iterations and the number of keys
--- so that we can check data validity after restart.
-_ = tmp:insert{'iter', iter}
----
-...
-_ = tmp:insert{'key_count', key_count}
----
-...
-test_run:cmd('restart server default')
-s = box.space.test
----
-...
-tmp = box.space.tmp
----
-...
--- Check that the test space content was not corrupted.
-iter = tmp:get('iter')[2]
----
-...
-key_count = tmp:get('key_count')[2]
----
-...
-for k = 1,key_count do v = s:get(k) assert(v == nil or v[2] == k + iter) end
----
-...
-s:drop()
----
-...
---
 -- Check that vinyl stats are restored correctly.
 --
 s = box.schema.space.create('test', {engine='vinyl'})
diff --git a/test/vinyl/recover.test.lua b/test/vinyl/recover.test.lua
index e88563535e837295337925bd99134843e8e73d06..451a2749c2cc175a23f81fac598bb22a4ebcdbc4 100644
--- a/test/vinyl/recover.test.lua
+++ b/test/vinyl/recover.test.lua
@@ -1,62 +1,9 @@
 test_run = require('test_run').new()
-fiber = require('fiber')
 
 -- Temporary table to restore variables after restart.
 tmp = box.schema.space.create('tmp')
 _ = tmp:create_index('primary', {parts = {1, 'string'}})
 
---
--- Check that range splits, compactions, and dumps don't break recovery.
---
-s = box.schema.space.create('test', {engine='vinyl'})
-_ = s:create_index('primary', {page_size=256, range_size=2048, run_count_per_level=1, run_size_ratio=10})
-
-function vyinfo() return box.space.test.index.primary:info() end
-
-range_count = 4
-tuple_size = math.ceil(s.index.primary.options.page_size / 4)
-pad_size = tuple_size - 30
-assert(pad_size >= 16)
-keys_per_range = math.floor(s.index.primary.options.range_size / tuple_size)
-key_count = range_count * keys_per_range
-
--- Add a number of tuples to the test space to trigger range splitting.
--- Rewrite them several times with different values so that different
--- generations of ranges on disk have different contents.
-test_run:cmd("setopt delimiter ';'")
-iter = 0
-function gen_tuple(k)
-    local pad = {}
-    for i = 1,pad_size do
-        pad[i] = string.char(math.random(65, 90))
-    end
-    return {k, k + iter, table.concat(pad)}
-end
-while vyinfo().range_count < range_count do
-    iter = iter + 1
-    for k = key_count,1,-1 do s:replace(gen_tuple(k)) end
-    box.snapshot()
-    fiber.sleep(0.01)
-end;
-test_run:cmd("setopt delimiter ''");
-
--- Remember the number of iterations and the number of keys
--- so that we can check data validity after restart.
-_ = tmp:insert{'iter', iter}
-_ = tmp:insert{'key_count', key_count}
-
-test_run:cmd('restart server default')
-
-s = box.space.test
-tmp = box.space.tmp
-
--- Check that the test space content was not corrupted.
-iter = tmp:get('iter')[2]
-key_count = tmp:get('key_count')[2]
-for k = 1,key_count do v = s:get(k) assert(v == nil or v[2] == k + iter) end
-
-s:drop()
-
 --
 -- Check that vinyl stats are restored correctly.
 --
diff --git a/test/vinyl/split_coalesce.result b/test/vinyl/split_coalesce.result
index b6478d302baca1c0b83a9753848da595764e24b9..7205af8181b06f89297c58a54fc7d2d2d24c7f24 100644
--- a/test/vinyl/split_coalesce.result
+++ b/test/vinyl/split_coalesce.result
@@ -4,6 +4,13 @@ test_run = require('test_run').new()
 fiber = require('fiber')
 ---
 ...
+-- Temporary table to restore variables after restart.
+var = box.schema.space.create('var')
+---
+...
+_ = var:create_index('primary', {parts = {1, 'string'}})
+---
+...
 s = box.schema.space.create('test', {engine='vinyl'})
 ---
 ...
@@ -61,6 +68,48 @@ vyinfo().range_count
 ---
 - 4
 ...
+-- Remember the number of iterations and the number of keys
+-- so that we can check data validity after restart.
+_ = var:insert{'iter', iter}
+---
+...
+_ = var:insert{'key_count', key_count}
+---
+...
+_ = var:insert{'keys_per_range', keys_per_range}
+---
+...
+-- Check that the space can be recovered after splitting ranges.
+test_run:cmd('restart server default')
+fiber = require 'fiber'
+---
+...
+s = box.space.test
+---
+...
+var = box.space.var
+---
+...
+iter = var:get('iter')[2]
+---
+...
+key_count = var:get('key_count')[2]
+---
+...
+keys_per_range = var:get('keys_per_range')[2]
+---
+...
+function vyinfo() return box.space.test.index.primary:info() end
+---
+...
+-- Check the space content.
+s:count() == key_count
+---
+- true
+...
+for k = 1,key_count do v = s:get(k) assert(v[2] == k + iter) end
+---
+...
 -- Delete 90% keys, remove padding for the rest.
 test_run:cmd("setopt delimiter ';'")
 ---
@@ -99,10 +148,45 @@ vyinfo().range_count
 ---
 - 1
 ...
--- Check the remaining keys.
-for k = 1,key_count do v = s:get(k) assert(v == nil or v[2] == k + iter) end
+-- Check that the space can be recovered after coalescing ranges.
+test_run:cmd('restart server default')
+s = box.space.test
+---
+...
+var = box.space.var
+---
+...
+iter = var:get('iter')[2]
+---
+...
+key_count = var:get('key_count')[2]
+---
+...
+-- Check the space content.
+test_run:cmd("setopt delimiter ';'")
+---
+- true
+...
+key_count_left = 0
+for k = 1,key_count do
+    v = s:get(k)
+    if k % 10 == 0 then
+        assert(v[2] == k + iter)
+        key_count_left = key_count_left + 1
+    else
+        assert(v == nil)
+    end
+end
+test_run:cmd("setopt delimiter ''");
+---
+...
+s:count() == key_count_left
 ---
+- true
 ...
 s:drop()
 ---
 ...
+var:drop()
+---
+...
diff --git a/test/vinyl/split_coalesce.test.lua b/test/vinyl/split_coalesce.test.lua
index c41e22702ea321d6fc079012504fe1aef348d6d7..adbf90b2cac220f15612e964492d2c883ac1e031 100644
--- a/test/vinyl/split_coalesce.test.lua
+++ b/test/vinyl/split_coalesce.test.lua
@@ -2,6 +2,10 @@ test_run = require('test_run').new()
 
 fiber = require('fiber')
 
+-- Temporary table to restore variables after restart.
+var = box.schema.space.create('var')
+_ = var:create_index('primary', {parts = {1, 'string'}})
+
 s = box.schema.space.create('test', {engine='vinyl'})
 _ = s:create_index('primary', {unique=true, parts={1, 'unsigned'}, page_size=256, range_size=2048, run_count_per_level=1, run_size_ratio=1000})
 
@@ -34,6 +38,30 @@ test_run:cmd("setopt delimiter ''");
 
 vyinfo().range_count
 
+-- Remember the number of iterations and the number of keys
+-- so that we can check data validity after restart.
+_ = var:insert{'iter', iter}
+_ = var:insert{'key_count', key_count}
+_ = var:insert{'keys_per_range', keys_per_range}
+
+-- Check that the space can be recovered after splitting ranges.
+test_run:cmd('restart server default')
+
+fiber = require 'fiber'
+
+s = box.space.test
+var = box.space.var
+
+iter = var:get('iter')[2]
+key_count = var:get('key_count')[2]
+keys_per_range = var:get('keys_per_range')[2]
+
+function vyinfo() return box.space.test.index.primary:info() end
+
+-- Check the space content.
+s:count() == key_count
+for k = 1,key_count do v = s:get(k) assert(v[2] == k + iter) end
+
 -- Delete 90% keys, remove padding for the rest.
 test_run:cmd("setopt delimiter ';'")
 for k = 1,key_count do
@@ -59,7 +87,29 @@ test_run:cmd("setopt delimiter ''");
 
 vyinfo().range_count
 
--- Check the remaining keys.
-for k = 1,key_count do v = s:get(k) assert(v == nil or v[2] == k + iter) end
+-- Check that the space can be recovered after coalescing ranges.
+test_run:cmd('restart server default')
+
+s = box.space.test
+var = box.space.var
+
+iter = var:get('iter')[2]
+key_count = var:get('key_count')[2]
+
+-- Check the space content.
+test_run:cmd("setopt delimiter ';'")
+key_count_left = 0
+for k = 1,key_count do
+    v = s:get(k)
+    if k % 10 == 0 then
+        assert(v[2] == k + iter)
+        key_count_left = key_count_left + 1
+    else
+        assert(v == nil)
+    end
+end
+test_run:cmd("setopt delimiter ''");
+s:count() == key_count_left
 
 s:drop()
+var:drop()