mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 00:08:23 -05:00 
			
		
		
		
	Fix pause_at_recovery_target + recovery_target_inclusive combination.
If pause_at_recovery_target is set, recovery pauses *before* applying the target record, even if recovery_target_inclusive is set. If you then continue with pg_xlog_replay_resume(), it will apply the target record before ending recovery. In other words, if you log in while it's paused and verify that the database looks OK, ending recovery changes its state again, possibly destroying data that you were tring to salvage with PITR. Backpatch to 9.1, this has been broken since pause_at_recovery_target was added.
This commit is contained in:
		
							parent
							
								
									815d71deed
								
							
						
					
					
						commit
						3739e5ab93
					
				@ -6794,11 +6794,6 @@ StartupXLOG(void)
 | 
			
		||||
				 */
 | 
			
		||||
				if (recoveryStopsHere(record, &recoveryApply, &recoveryDelay))
 | 
			
		||||
				{
 | 
			
		||||
					if (recoveryPauseAtTarget)
 | 
			
		||||
					{
 | 
			
		||||
						SetRecoveryPause(true);
 | 
			
		||||
						recoveryPausesHere();
 | 
			
		||||
					}
 | 
			
		||||
					reachedStopPoint = true;	/* see below */
 | 
			
		||||
					recoveryContinue = false;
 | 
			
		||||
 | 
			
		||||
@ -6948,6 +6943,12 @@ StartupXLOG(void)
 | 
			
		||||
			 * end of main redo apply loop
 | 
			
		||||
			 */
 | 
			
		||||
 | 
			
		||||
			if (recoveryPauseAtTarget && reachedStopPoint)
 | 
			
		||||
			{
 | 
			
		||||
				SetRecoveryPause(true);
 | 
			
		||||
				recoveryPausesHere();
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			ereport(LOG,
 | 
			
		||||
					(errmsg("redo done at %X/%X",
 | 
			
		||||
						 (uint32) (ReadRecPtr >> 32), (uint32) ReadRecPtr)));
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user