@@ -1732,11 +1732,12 @@ def test_restore_backup_from_future(self):
1732
1732
self .backup_node (backup_dir ,'node' ,node )
1733
1733
1734
1734
node .pgbench_init (scale = 3 )
1735
- #pgbench = node.pgbench(options=['-T', '20', '-c', '2'])
1736
- #pgbench.wait()
1735
+ # pgbench = node.pgbench(options=['-T', '20', '-c', '2'])
1736
+ # pgbench.wait()
1737
1737
1738
1738
# Take PAGE from future
1739
- backup_id = self .backup_node (backup_dir ,'node' ,node ,backup_type = 'page' )
1739
+ backup_id = self .backup_node (
1740
+ backup_dir ,'node' ,node ,backup_type = 'page' )
1740
1741
1741
1742
with open (
1742
1743
os .path .join (
@@ -1755,7 +1756,8 @@ def test_restore_backup_from_future(self):
1755
1756
pgbench = node .pgbench (options = ['-T' ,'3' ,'-c' ,'2' ,'--no-vacuum' ])
1756
1757
pgbench .wait ()
1757
1758
1758
- backup_id = self .backup_node (backup_dir ,'node' ,node ,backup_type = 'page' )
1759
+ backup_id = self .backup_node (
1760
+ backup_dir ,'node' ,node ,backup_type = 'page' )
1759
1761
pgdata = self .pgdata_content (node .data_dir )
1760
1762
1761
1763
node .cleanup ()
@@ -1964,7 +1966,8 @@ def test_restore_target_new_options(self):
1964
1966
1965
1967
target_time = datetime .now ().strftime ("%Y-%m-%d %H:%M:%S" )
1966
1968
with node .connect ("postgres" )as con :
1967
- res = con .execute ("INSERT INTO tbl0005 VALUES ('inserted') RETURNING (xmin)" )
1969
+ res = con .execute (
1970
+ "INSERT INTO tbl0005 VALUES ('inserted') RETURNING (xmin)" )
1968
1971
con .commit ()
1969
1972
target_xid = res [0 ][0 ]
1970
1973
@@ -2101,3 +2104,70 @@ def test_restore_target_new_options(self):
2101
2104
2102
2105
# Clean after yourself
2103
2106
self .del_test_dir (module_name ,fname )
2107
+
2108
+ # @unittest.skip("skip")
2109
+ def test_smart_restore (self ):
2110
+ """
2111
+ make node, create database, take full backup, drop database,
2112
+ take incremental backup and restore it,
2113
+ make sure that files from dropped database are not
2114
+ copied during restore
2115
+ https://github.com/postgrespro/pg_probackup/issues/63
2116
+ """
2117
+ fname = self .id ().split ('.' )[3 ]
2118
+ node = self .make_simple_node (
2119
+ base_dir = os .path .join (module_name ,fname ,'node' ),
2120
+ set_replication = True ,
2121
+ initdb_params = ['--data-checksums' ])
2122
+
2123
+ backup_dir = os .path .join (self .tmp_path ,module_name ,fname ,'backup' )
2124
+ self .init_pb (backup_dir )
2125
+ self .add_instance (backup_dir ,'node' ,node )
2126
+ self .set_archiving (backup_dir ,'node' ,node )
2127
+ node .slow_start ()
2128
+
2129
+ # create database
2130
+ node .safe_psql (
2131
+ "postgres" ,
2132
+ "CREATE DATABASE testdb" )
2133
+
2134
+ # take FULL backup
2135
+ full_id = self .backup_node (backup_dir ,'node' ,node )
2136
+
2137
+ # drop database
2138
+ node .safe_psql (
2139
+ "postgres" ,
2140
+ "DROP DATABASE testdb" )
2141
+
2142
+ # take PAGE backup
2143
+ page_id = self .backup_node (
2144
+ backup_dir ,'node' ,node ,backup_type = 'page' )
2145
+
2146
+ # restore PAGE backup
2147
+ node .cleanup ()
2148
+ self .restore_node (
2149
+ backup_dir ,'node' ,node ,backup_id = page_id ,
2150
+ options = ['--no-validate' ,'--log-level-file=VERBOSE' ])
2151
+
2152
+ logfile = os .path .join (backup_dir ,'log' ,'pg_probackup.log' )
2153
+ with open (logfile ,'r' )as f :
2154
+ logfile_content = f .read ()
2155
+
2156
+ # get delta between FULL and PAGE filelists
2157
+ filelist_full = self .get_backup_filelist (
2158
+ backup_dir ,'node' ,full_id )
2159
+
2160
+ filelist_page = self .get_backup_filelist (
2161
+ backup_dir ,'node' ,page_id )
2162
+
2163
+ filelist_diff = self .get_backup_filelist_diff (
2164
+ filelist_full ,filelist_page )
2165
+
2166
+ for file in filelist_diff :
2167
+ self .assertNotIn (file ,logfile_content )
2168
+
2169
+ # Clean after yourself
2170
+ self .del_test_dir (module_name ,fname )
2171
+
2172
+
2173
+ # smart restore of external dirs