pg_probackup
447 строк · 14.9 Кб
1"""
2restore
3Syntax:
4
5pg_probackup restore -B backupdir --instance instance_name
6[-D datadir]
7[ -i backup_id | [{--time=time | --xid=xid | --lsn=lsn } [--inclusive=boolean]]][--timeline=timeline] [-T OLDDIR=NEWDIR]
8[-j num_threads] [--progress] [-q] [-v]
9
10"""
11import os
12import unittest
13import shutil
14
15from .helpers.cfs_helpers import find_by_name
16from .helpers.ptrack_helpers import ProbackupTest, ProbackupException
17
18tblspace_name = 'cfs_tblspace'
19tblspace_name_new = 'cfs_tblspace_new'
20
21
22class CfsRestoreBase(ProbackupTest, unittest.TestCase):
23@unittest.skipUnless(ProbackupTest.enterprise, 'skip')
24def setUp(self):
25self.backup_dir = os.path.join(self.tmp_path, self.module_name, self.fname, 'backup')
26
27self.node = self.make_simple_node(
28base_dir="{0}/{1}/node".format(self.module_name, self.fname),
29set_replication=True,
30initdb_params=['--data-checksums'],
31pg_options={
32# 'ptrack_enable': 'on',
33'cfs_encryption': 'off',
34}
35)
36
37self.init_pb(self.backup_dir)
38self.add_instance(self.backup_dir, 'node', self.node)
39self.set_archiving(self.backup_dir, 'node', self.node)
40
41self.node.slow_start()
42self.create_tblspace_in_node(self.node, tblspace_name, cfs=True)
43
44self.add_data_in_cluster()
45
46self.backup_id = None
47try:
48self.backup_id = self.backup_node(self.backup_dir, 'node', self.node, backup_type='full')
49except ProbackupException as e:
50self.fail(
51"ERROR: Full backup failed \n {0} \n {1}".format(
52repr(self.cmd),
53repr(e.message)
54)
55)
56
57def add_data_in_cluster(self):
58pass
59
60
61class CfsRestoreNoencEmptyTablespaceTest(CfsRestoreBase):
62# @unittest.expectedFailure
63# @unittest.skip("skip")
64@unittest.skipUnless(ProbackupTest.enterprise, 'skip')
65def test_restore_empty_tablespace_from_fullbackup(self):
66"""
67Case: Restore empty tablespace from valid full backup.
68"""
69self.node.stop(["-m", "immediate"])
70self.node.cleanup()
71shutil.rmtree(self.get_tblspace_path(self.node, tblspace_name))
72
73try:
74self.restore_node(self.backup_dir, 'node', self.node, backup_id=self.backup_id)
75except ProbackupException as e:
76self.fail(
77"ERROR: Restore failed. \n {0} \n {1}".format(
78repr(self.cmd),
79repr(e.message)
80)
81)
82self.assertTrue(
83find_by_name([self.get_tblspace_path(self.node, tblspace_name)], ["pg_compression"]),
84"ERROR: Restored data is not valid. pg_compression not found in tablespace dir."
85)
86
87try:
88self.node.slow_start()
89except ProbackupException as e:
90self.fail(
91"ERROR: Instance not started after restore. \n {0} \n {1}".format(
92repr(self.cmd),
93repr(e.message)
94)
95)
96tblspace = self.node.safe_psql(
97"postgres",
98"SELECT * FROM pg_tablespace WHERE spcname='{0}'".format(tblspace_name)
99).decode("UTF-8")
100self.assertTrue(
101tblspace_name in tblspace and "compression=true" in tblspace,
102"ERROR: The tablespace not restored or it restored without compressions"
103)
104
105
106class CfsRestoreNoencTest(CfsRestoreBase):
107def add_data_in_cluster(self):
108self.node.safe_psql(
109"postgres",
110'CREATE TABLE {0} TABLESPACE {1} \
111AS SELECT i AS id, MD5(i::text) AS text, \
112MD5(repeat(i::text,10))::tsvector AS tsvector \
113FROM generate_series(0,1e5) i'.format('t1', tblspace_name)
114)
115self.table_t1 = self.node.table_checksum("t1")
116
117# --- Restore from full backup ---#
118# @unittest.expectedFailure
119# @unittest.skip("skip")
120@unittest.skipUnless(ProbackupTest.enterprise, 'skip')
121def test_restore_from_fullbackup_to_old_location(self):
122"""
123Case: Restore instance from valid full backup to old location.
124"""
125self.node.stop()
126self.node.cleanup()
127shutil.rmtree(self.get_tblspace_path(self.node, tblspace_name))
128
129try:
130self.restore_node(self.backup_dir, 'node', self.node, backup_id=self.backup_id)
131except ProbackupException as e:
132self.fail(
133"ERROR: Restore from full backup failed. \n {0} \n {1}".format(
134repr(self.cmd),
135repr(e.message)
136)
137)
138
139self.assertTrue(
140find_by_name([self.get_tblspace_path(self.node, tblspace_name)], ['pg_compression']),
141"ERROR: File pg_compression not found in tablespace dir"
142)
143try:
144self.node.slow_start()
145except ProbackupException as e:
146self.fail(
147"ERROR: Instance not started after restore. \n {0} \n {1}".format(
148repr(self.cmd),
149repr(e.message)
150)
151)
152
153self.assertEqual(
154self.node.table_checksum("t1"),
155self.table_t1
156)
157
158# @unittest.expectedFailure
159# @unittest.skip("skip")
160@unittest.skipUnless(ProbackupTest.enterprise, 'skip')
161def test_restore_from_fullbackup_to_old_location_3_jobs(self):
162"""
163Case: Restore instance from valid full backup to old location.
164"""
165self.node.stop()
166self.node.cleanup()
167shutil.rmtree(self.get_tblspace_path(self.node, tblspace_name))
168
169try:
170self.restore_node(self.backup_dir, 'node', self.node, backup_id=self.backup_id, options=['-j', '3'])
171except ProbackupException as e:
172self.fail(
173"ERROR: Restore from full backup failed. \n {0} \n {1}".format(
174repr(self.cmd),
175repr(e.message)
176)
177)
178self.assertTrue(
179find_by_name([self.get_tblspace_path(self.node, tblspace_name)], ['pg_compression']),
180"ERROR: File pg_compression not found in backup dir"
181)
182try:
183self.node.slow_start()
184except ProbackupException as e:
185self.fail(
186"ERROR: Instance not started after restore. \n {0} \n {1}".format(
187repr(self.cmd),
188repr(e.message)
189)
190)
191
192self.assertEqual(
193self.node.table_checksum("t1"),
194self.table_t1
195)
196
197# @unittest.expectedFailure
198# @unittest.skip("skip")
199@unittest.skipUnless(ProbackupTest.enterprise, 'skip')
200def test_restore_from_fullbackup_to_new_location(self):
201"""
202Case: Restore instance from valid full backup to new location.
203"""
204self.node.stop()
205self.node.cleanup()
206shutil.rmtree(self.get_tblspace_path(self.node, tblspace_name))
207
208node_new = self.make_simple_node(base_dir="{0}/{1}/node_new_location".format(self.module_name, self.fname))
209node_new.cleanup()
210
211try:
212self.restore_node(self.backup_dir, 'node', node_new, backup_id=self.backup_id)
213self.set_auto_conf(node_new, {'port': node_new.port})
214except ProbackupException as e:
215self.fail(
216"ERROR: Restore from full backup failed. \n {0} \n {1}".format(
217repr(self.cmd),
218repr(e.message)
219)
220)
221self.assertTrue(
222find_by_name([self.get_tblspace_path(self.node, tblspace_name)], ['pg_compression']),
223"ERROR: File pg_compression not found in backup dir"
224)
225try:
226node_new.slow_start()
227except ProbackupException as e:
228self.fail(
229"ERROR: Instance not started after restore. \n {0} \n {1}".format(
230repr(self.cmd),
231repr(e.message)
232)
233)
234
235self.assertEqual(
236node_new.table_checksum("t1"),
237self.table_t1
238)
239node_new.cleanup()
240
241# @unittest.expectedFailure
242# @unittest.skip("skip")
243@unittest.skipUnless(ProbackupTest.enterprise, 'skip')
244def test_restore_from_fullbackup_to_new_location_5_jobs(self):
245"""
246Case: Restore instance from valid full backup to new location.
247"""
248self.node.stop()
249self.node.cleanup()
250shutil.rmtree(self.get_tblspace_path(self.node, tblspace_name))
251
252node_new = self.make_simple_node(base_dir="{0}/{1}/node_new_location".format(self.module_name, self.fname))
253node_new.cleanup()
254
255try:
256self.restore_node(self.backup_dir, 'node', node_new, backup_id=self.backup_id, options=['-j', '5'])
257self.set_auto_conf(node_new, {'port': node_new.port})
258except ProbackupException as e:
259self.fail(
260"ERROR: Restore from full backup failed. \n {0} \n {1}".format(
261repr(self.cmd),
262repr(e.message)
263)
264)
265self.assertTrue(
266find_by_name([self.get_tblspace_path(self.node, tblspace_name)], ['pg_compression']),
267"ERROR: File pg_compression not found in backup dir"
268)
269try:
270node_new.slow_start()
271except ProbackupException as e:
272self.fail(
273"ERROR: Instance not started after restore. \n {0} \n {1}".format(
274repr(self.cmd),
275repr(e.message)
276)
277)
278
279self.assertEqual(
280node_new.table_checksum("t1"),
281self.table_t1
282)
283node_new.cleanup()
284
285# @unittest.expectedFailure
286# @unittest.skip("skip")
287@unittest.skipUnless(ProbackupTest.enterprise, 'skip')
288def test_restore_from_fullbackup_to_old_location_tablespace_new_location(self):
289self.node.stop()
290self.node.cleanup()
291shutil.rmtree(self.get_tblspace_path(self.node, tblspace_name))
292
293os.mkdir(self.get_tblspace_path(self.node, tblspace_name_new))
294
295try:
296self.restore_node(
297self.backup_dir,
298'node', self.node,
299backup_id=self.backup_id,
300options=["-T", "{0}={1}".format(
301self.get_tblspace_path(self.node, tblspace_name),
302self.get_tblspace_path(self.node, tblspace_name_new)
303)
304]
305)
306except ProbackupException as e:
307self.fail(
308"ERROR: Restore from full backup failed. \n {0} \n {1}".format(
309repr(self.cmd),
310repr(e.message)
311)
312)
313self.assertTrue(
314find_by_name([self.get_tblspace_path(self.node, tblspace_name_new)], ['pg_compression']),
315"ERROR: File pg_compression not found in new tablespace location"
316)
317try:
318self.node.slow_start()
319except ProbackupException as e:
320self.fail(
321"ERROR: Instance not started after restore. \n {0} \n {1}".format(
322repr(self.cmd),
323repr(e.message)
324)
325)
326
327self.assertEqual(
328self.node.table_checksum("t1"),
329self.table_t1
330)
331
332# @unittest.expectedFailure
333# @unittest.skip("skip")
334@unittest.skipUnless(ProbackupTest.enterprise, 'skip')
335def test_restore_from_fullbackup_to_old_location_tablespace_new_location_3_jobs(self):
336self.node.stop()
337self.node.cleanup()
338shutil.rmtree(self.get_tblspace_path(self.node, tblspace_name))
339
340os.mkdir(self.get_tblspace_path(self.node, tblspace_name_new))
341
342try:
343self.restore_node(
344self.backup_dir,
345'node', self.node,
346backup_id=self.backup_id,
347options=["-j", "3", "-T", "{0}={1}".format(
348self.get_tblspace_path(self.node, tblspace_name),
349self.get_tblspace_path(self.node, tblspace_name_new)
350)
351]
352)
353except ProbackupException as e:
354self.fail(
355"ERROR: Restore from full backup failed. \n {0} \n {1}".format(
356repr(self.cmd),
357repr(e.message)
358)
359)
360self.assertTrue(
361find_by_name([self.get_tblspace_path(self.node, tblspace_name_new)], ['pg_compression']),
362"ERROR: File pg_compression not found in new tablespace location"
363)
364try:
365self.node.slow_start()
366except ProbackupException as e:
367self.fail(
368"ERROR: Instance not started after restore. \n {0} \n {1}".format(
369repr(self.cmd),
370repr(e.message)
371)
372)
373
374self.assertEqual(
375self.node.table_checksum("t1"),
376self.table_t1
377)
378
379# @unittest.expectedFailure
380@unittest.skip("skip")
381def test_restore_from_fullbackup_to_new_location_tablespace_new_location(self):
382pass
383
384# @unittest.expectedFailure
385@unittest.skip("skip")
386def test_restore_from_fullbackup_to_new_location_tablespace_new_location_5_jobs(self):
387pass
388
389# @unittest.expectedFailure
390@unittest.skip("skip")
391def test_restore_from_ptrack(self):
392"""
393Case: Restore from backup to old location
394"""
395pass
396
397# @unittest.expectedFailure
398@unittest.skip("skip")
399def test_restore_from_ptrack_jobs(self):
400"""
401Case: Restore from backup to old location, four jobs
402"""
403pass
404
405# @unittest.expectedFailure
406@unittest.skip("skip")
407def test_restore_from_ptrack_new_jobs(self):
408pass
409
410# --------------------------------------------------------- #
411# @unittest.expectedFailure
412@unittest.skip("skip")
413def test_restore_from_page(self):
414"""
415Case: Restore from backup to old location
416"""
417pass
418
419# @unittest.expectedFailure
420@unittest.skip("skip")
421def test_restore_from_page_jobs(self):
422"""
423Case: Restore from backup to old location, four jobs
424"""
425pass
426
427# @unittest.expectedFailure
428@unittest.skip("skip")
429def test_restore_from_page_new_jobs(self):
430"""
431Case: Restore from backup to new location, four jobs
432"""
433pass
434
435
436#class CfsRestoreEncEmptyTablespaceTest(CfsRestoreNoencEmptyTablespaceTest):
437# # --- Begin --- #
438# def setUp(self):
439# os.environ["PG_CIPHER_KEY"] = "super_secret_cipher_key"
440# super(CfsRestoreNoencEmptyTablespaceTest, self).setUp()
441#
442#
443#class CfsRestoreEncTest(CfsRestoreNoencTest):
444# # --- Begin --- #
445# def setUp(self):
446# os.environ["PG_CIPHER_KEY"] = "super_secret_cipher_key"
447# super(CfsRestoreNoencTest, self).setUp()
448