pg_probackup
495 строк · 18.6 Кб
1import os2import unittest3from .helpers.ptrack_helpers import ProbackupTest, ProbackupException, idx_ptrack4from datetime import datetime, timedelta5import subprocess6
7
8class CompressionTest(ProbackupTest, unittest.TestCase):9
10# @unittest.skip("skip")11# @unittest.expectedFailure12def test_basic_compression_stream_zlib(self):13"""14make archive node, make full and page stream backups,
15check data correctness in restored instance
16"""
17self.maxDiff = None18backup_dir = os.path.join(self.tmp_path, self.module_name, self.fname, 'backup')19node = self.make_simple_node(20base_dir=os.path.join(self.module_name, self.fname, 'node'),21set_replication=True,22initdb_params=['--data-checksums'])23
24self.init_pb(backup_dir)25self.add_instance(backup_dir, 'node', node)26self.set_archiving(backup_dir, 'node', node)27node.slow_start()28
29# FULL BACKUP30node.safe_psql(31"postgres",32"create table t_heap as select i as id, md5(i::text) as text, "33"md5(repeat(i::text,10))::tsvector as tsvector "34"from generate_series(0,256) i")35full_result = node.table_checksum("t_heap")36full_backup_id = self.backup_node(37backup_dir, 'node', node, backup_type='full',38options=[39'--stream',40'--compress-algorithm=zlib'])41
42# PAGE BACKUP43node.safe_psql(44"postgres",45"insert into t_heap select i as id, md5(i::text) as text, "46"md5(repeat(i::text,10))::tsvector as tsvector "47"from generate_series(256,512) i")48page_result = node.table_checksum("t_heap")49page_backup_id = self.backup_node(50backup_dir, 'node', node, backup_type='page',51options=[52'--stream', '--compress-algorithm=zlib'])53
54# DELTA BACKUP55node.safe_psql(56"postgres",57"insert into t_heap select i as id, md5(i::text) as text, "58"md5(repeat(i::text,10))::tsvector as tsvector "59"from generate_series(512,768) i")60delta_result = node.table_checksum("t_heap")61delta_backup_id = self.backup_node(62backup_dir, 'node', node, backup_type='delta',63options=['--stream', '--compress-algorithm=zlib'])64
65# Drop Node66node.cleanup()67
68# Check full backup69self.assertIn(70"INFO: Restore of backup {0} completed.".format(full_backup_id),71self.restore_node(72backup_dir, 'node', node, backup_id=full_backup_id,73options=[74"-j", "4", "--immediate",75"--recovery-target-action=promote"]),76'\n Unexpected Error Message: {0}\n CMD: {1}'.format(77repr(self.output), self.cmd))78node.slow_start()79
80full_result_new = node.table_checksum("t_heap")81self.assertEqual(full_result, full_result_new)82node.cleanup()83
84# Check page backup85self.assertIn(86"INFO: Restore of backup {0} completed.".format(page_backup_id),87self.restore_node(88backup_dir, 'node', node, backup_id=page_backup_id,89options=[90"-j", "4", "--immediate",91"--recovery-target-action=promote"]),92'\n Unexpected Error Message: {0}\n CMD: {1}'.format(93repr(self.output), self.cmd))94node.slow_start()95
96page_result_new = node.table_checksum("t_heap")97self.assertEqual(page_result, page_result_new)98node.cleanup()99
100# Check delta backup101self.assertIn(102"INFO: Restore of backup {0} completed.".format(delta_backup_id),103self.restore_node(104backup_dir, 'node', node, backup_id=delta_backup_id,105options=[106"-j", "4", "--immediate",107"--recovery-target-action=promote"]),108'\n Unexpected Error Message: {0}\n CMD: {1}'.format(109repr(self.output), self.cmd))110node.slow_start()111
112delta_result_new = node.table_checksum("t_heap")113self.assertEqual(delta_result, delta_result_new)114
115def test_compression_archive_zlib(self):116"""117make archive node, make full and page backups,
118check data correctness in restored instance
119"""
120self.maxDiff = None121backup_dir = os.path.join(self.tmp_path, self.module_name, self.fname, 'backup')122node = self.make_simple_node(123base_dir=os.path.join(self.module_name, self.fname, 'node'),124set_replication=True,125initdb_params=['--data-checksums'])126
127self.init_pb(backup_dir)128self.add_instance(backup_dir, 'node', node)129self.set_archiving(backup_dir, 'node', node)130node.slow_start()131
132# FULL BACKUP133node.safe_psql(134"postgres",135"create table t_heap as select i as id, md5(i::text) as text, "136"md5(i::text)::tsvector as tsvector from generate_series(0,1) i")137full_result = node.table_checksum("t_heap")138full_backup_id = self.backup_node(139backup_dir, 'node', node, backup_type='full',140options=["--compress-algorithm=zlib"])141
142# PAGE BACKUP143node.safe_psql(144"postgres",145"insert into t_heap select i as id, md5(i::text) as text, "146"md5(i::text)::tsvector as tsvector "147"from generate_series(0,2) i")148page_result = node.table_checksum("t_heap")149page_backup_id = self.backup_node(150backup_dir, 'node', node, backup_type='page',151options=["--compress-algorithm=zlib"])152
153# DELTA BACKUP154node.safe_psql(155"postgres",156"insert into t_heap select i as id, md5(i::text) as text, "157"md5(i::text)::tsvector as tsvector from generate_series(0,3) i")158delta_result = node.table_checksum("t_heap")159delta_backup_id = self.backup_node(160backup_dir, 'node', node, backup_type='delta',161options=['--compress-algorithm=zlib'])162
163# Drop Node164node.cleanup()165
166# Check full backup167self.assertIn(168"INFO: Restore of backup {0} completed.".format(full_backup_id),169self.restore_node(170backup_dir, 'node', node, backup_id=full_backup_id,171options=[172"-j", "4", "--immediate",173"--recovery-target-action=promote"]),174'\n Unexpected Error Message: {0}\n CMD: {1}'.format(175repr(self.output), self.cmd))176node.slow_start()177
178full_result_new = node.table_checksum("t_heap")179self.assertEqual(full_result, full_result_new)180node.cleanup()181
182# Check page backup183self.assertIn(184"INFO: Restore of backup {0} completed.".format(page_backup_id),185self.restore_node(186backup_dir, 'node', node, backup_id=page_backup_id,187options=[188"-j", "4", "--immediate",189"--recovery-target-action=promote"]),190'\n Unexpected Error Message: {0}\n CMD: {1}'.format(191repr(self.output), self.cmd))192node.slow_start()193
194page_result_new = node.table_checksum("t_heap")195self.assertEqual(page_result, page_result_new)196node.cleanup()197
198# Check delta backup199self.assertIn(200"INFO: Restore of backup {0} completed.".format(delta_backup_id),201self.restore_node(202backup_dir, 'node', node, backup_id=delta_backup_id,203options=[204"-j", "4", "--immediate",205"--recovery-target-action=promote"]),206'\n Unexpected Error Message: {0}\n CMD: {1}'.format(207repr(self.output), self.cmd))208node.slow_start()209
210delta_result_new = node.table_checksum("t_heap")211self.assertEqual(delta_result, delta_result_new)212node.cleanup()213
214def test_compression_stream_pglz(self):215"""216make archive node, make full and page stream backups,
217check data correctness in restored instance
218"""
219self.maxDiff = None220backup_dir = os.path.join(self.tmp_path, self.module_name, self.fname, 'backup')221node = self.make_simple_node(222base_dir=os.path.join(self.module_name, self.fname, 'node'),223set_replication=True,224initdb_params=['--data-checksums'])225
226self.init_pb(backup_dir)227self.add_instance(backup_dir, 'node', node)228self.set_archiving(backup_dir, 'node', node)229node.slow_start()230
231# FULL BACKUP232node.safe_psql(233"postgres",234"create table t_heap as select i as id, md5(i::text) as text, "235"md5(repeat(i::text,10))::tsvector as tsvector "236"from generate_series(0,256) i")237full_result = node.table_checksum("t_heap")238full_backup_id = self.backup_node(239backup_dir, 'node', node, backup_type='full',240options=['--stream', '--compress-algorithm=pglz'])241
242# PAGE BACKUP243node.safe_psql(244"postgres",245"insert into t_heap select i as id, md5(i::text) as text, "246"md5(repeat(i::text,10))::tsvector as tsvector "247"from generate_series(256,512) i")248page_result = node.table_checksum("t_heap")249page_backup_id = self.backup_node(250backup_dir, 'node', node, backup_type='page',251options=['--stream', '--compress-algorithm=pglz'])252
253# DELTA BACKUP254node.safe_psql(255"postgres",256"insert into t_heap select i as id, md5(i::text) as text, "257"md5(repeat(i::text,10))::tsvector as tsvector "258"from generate_series(512,768) i")259delta_result = node.table_checksum("t_heap")260delta_backup_id = self.backup_node(261backup_dir, 'node', node, backup_type='delta',262options=['--stream', '--compress-algorithm=pglz'])263
264# Drop Node265node.cleanup()266
267# Check full backup268self.assertIn(269"INFO: Restore of backup {0} completed.".format(full_backup_id),270self.restore_node(271backup_dir, 'node', node, backup_id=full_backup_id,272options=[273"-j", "4", "--immediate",274"--recovery-target-action=promote"]),275'\n Unexpected Error Message: {0}\n CMD: {1}'.format(276repr(self.output), self.cmd))277node.slow_start()278
279full_result_new = node.table_checksum("t_heap")280self.assertEqual(full_result, full_result_new)281node.cleanup()282
283# Check page backup284self.assertIn(285"INFO: Restore of backup {0} completed.".format(page_backup_id),286self.restore_node(287backup_dir, 'node', node, backup_id=page_backup_id,288options=[289"-j", "4", "--immediate",290"--recovery-target-action=promote"]),291'\n Unexpected Error Message: {0}\n CMD: {1}'.format(292repr(self.output), self.cmd))293node.slow_start()294
295page_result_new = node.table_checksum("t_heap")296self.assertEqual(page_result, page_result_new)297node.cleanup()298
299# Check delta backup300self.assertIn(301"INFO: Restore of backup {0} completed.".format(delta_backup_id),302self.restore_node(303backup_dir, 'node', node, backup_id=delta_backup_id,304options=[305"-j", "4", "--immediate",306"--recovery-target-action=promote"]),307'\n Unexpected Error Message: {0}\n CMD: {1}'.format(308repr(self.output), self.cmd))309node.slow_start()310
311delta_result_new = node.table_checksum("t_heap")312self.assertEqual(delta_result, delta_result_new)313node.cleanup()314
315def test_compression_archive_pglz(self):316"""317make archive node, make full and page backups,
318check data correctness in restored instance
319"""
320self.maxDiff = None321backup_dir = os.path.join(self.tmp_path, self.module_name, self.fname, 'backup')322node = self.make_simple_node(323base_dir=os.path.join(self.module_name, self.fname, 'node'),324set_replication=True,325initdb_params=['--data-checksums'])326
327self.init_pb(backup_dir)328self.add_instance(backup_dir, 'node', node)329self.set_archiving(backup_dir, 'node', node)330node.slow_start()331
332# FULL BACKUP333node.safe_psql(334"postgres",335"create table t_heap as select i as id, md5(i::text) as text, "336"md5(i::text)::tsvector as tsvector "337"from generate_series(0,100) i")338full_result = node.table_checksum("t_heap")339full_backup_id = self.backup_node(340backup_dir, 'node', node, backup_type='full',341options=['--compress-algorithm=pglz'])342
343# PAGE BACKUP344node.safe_psql(345"postgres",346"insert into t_heap select i as id, md5(i::text) as text, "347"md5(i::text)::tsvector as tsvector "348"from generate_series(100,200) i")349page_result = node.table_checksum("t_heap")350page_backup_id = self.backup_node(351backup_dir, 'node', node, backup_type='page',352options=['--compress-algorithm=pglz'])353
354# DELTA BACKUP355node.safe_psql(356"postgres",357"insert into t_heap select i as id, md5(i::text) as text, "358"md5(i::text)::tsvector as tsvector "359"from generate_series(200,300) i")360delta_result = node.table_checksum("t_heap")361delta_backup_id = self.backup_node(362backup_dir, 'node', node, backup_type='delta',363options=['--compress-algorithm=pglz'])364
365# Drop Node366node.cleanup()367
368# Check full backup369self.assertIn(370"INFO: Restore of backup {0} completed.".format(full_backup_id),371self.restore_node(372backup_dir, 'node', node, backup_id=full_backup_id,373options=[374"-j", "4", "--immediate",375"--recovery-target-action=promote"]),376'\n Unexpected Error Message: {0}\n CMD: {1}'.format(377repr(self.output), self.cmd))378node.slow_start()379
380full_result_new = node.table_checksum("t_heap")381self.assertEqual(full_result, full_result_new)382node.cleanup()383
384# Check page backup385self.assertIn(386"INFO: Restore of backup {0} completed.".format(page_backup_id),387self.restore_node(388backup_dir, 'node', node, backup_id=page_backup_id,389options=[390"-j", "4", "--immediate",391"--recovery-target-action=promote"]),392'\n Unexpected Error Message: {0}\n CMD: {1}'.format(393repr(self.output), self.cmd))394node.slow_start()395
396page_result_new = node.table_checksum("t_heap")397self.assertEqual(page_result, page_result_new)398node.cleanup()399
400# Check delta backup401self.assertIn(402"INFO: Restore of backup {0} completed.".format(delta_backup_id),403self.restore_node(404backup_dir, 'node', node, backup_id=delta_backup_id,405options=[406"-j", "4", "--immediate",407"--recovery-target-action=promote"]),408'\n Unexpected Error Message: {0}\n CMD: {1}'.format(409repr(self.output), self.cmd))410node.slow_start()411
412delta_result_new = node.table_checksum("t_heap")413self.assertEqual(delta_result, delta_result_new)414node.cleanup()415
416def test_compression_wrong_algorithm(self):417"""418make archive node, make full and page backups,
419check data correctness in restored instance
420"""
421self.maxDiff = None422backup_dir = os.path.join(self.tmp_path, self.module_name, self.fname, 'backup')423node = self.make_simple_node(424base_dir=os.path.join(self.module_name, self.fname, 'node'),425set_replication=True,426initdb_params=['--data-checksums'])427
428self.init_pb(backup_dir)429self.add_instance(backup_dir, 'node', node)430self.set_archiving(backup_dir, 'node', node)431node.slow_start()432
433try:434self.backup_node(435backup_dir, 'node', node,436backup_type='full', options=['--compress-algorithm=bla-blah'])437# we should die here because exception is what we expect to happen438self.assertEqual(4391, 0,440"Expecting Error because compress-algorithm is invalid.\n "441"Output: {0} \n CMD: {1}".format(442repr(self.output), self.cmd))443except ProbackupException as e:444self.assertEqual(445e.message,446'ERROR: Invalid compress algorithm value "bla-blah"\n',447'\n Unexpected Error Message: {0}\n CMD: {1}'.format(448repr(e.message), self.cmd))449
450# @unittest.skip("skip")451def test_incompressible_pages(self):452"""453make archive node, create table with incompressible toast pages,
454take backup with compression, make sure that page was not compressed,
455restore backup and check data correctness
456"""
457backup_dir = os.path.join(self.tmp_path, self.module_name, self.fname, 'backup')458node = self.make_simple_node(459base_dir=os.path.join(self.module_name, self.fname, 'node'),460set_replication=True,461initdb_params=['--data-checksums'])462
463self.init_pb(backup_dir)464self.add_instance(backup_dir, 'node', node)465self.set_archiving(backup_dir, 'node', node)466node.slow_start()467
468# Full469self.backup_node(470backup_dir, 'node', node,471options=[472'--compress-algorithm=zlib',473'--compress-level=0'])474
475node.pgbench_init(scale=3)476
477self.backup_node(478backup_dir, 'node', node,479backup_type='delta',480options=[481'--compress-algorithm=zlib',482'--compress-level=0'])483
484pgdata = self.pgdata_content(node.data_dir)485
486node.cleanup()487
488self.restore_node(backup_dir, 'node', node)489
490# Physical comparison491if self.paranoia:492pgdata_restored = self.pgdata_content(node.data_dir)493self.compare_pgdata(pgdata, pgdata_restored)494
495node.slow_start()496