diff --git a/mysql-test/suite/innodb/r/instant_alter.result b/mysql-test/suite/innodb/r/instant_alter.result
index 2f56d0eca4f..24cb78c0570 100644
--- a/mysql-test/suite/innodb/r/instant_alter.result
+++ b/mysql-test/suite/innodb/r/instant_alter.result
@@ -464,8 +464,7 @@ ALGORITHM=INSTANT;
 SET foreign_key_checks=1;
 ALTER TABLE t2 COMMENT 'domestic keys only', DROP FOREIGN KEY fk;
 ALTER TABLE t1 DROP FOREIGN KEY t1_ibfk_1;
-ALTER TABLE t1 ADD COLUMN big BLOB NOT NULL
-DEFAULT REPEAT('a', @@GLOBAL.innodb_page_size * .75);
+ALTER TABLE t1 ADD COLUMN big BLOB NOT NULL DEFAULT REPEAT('a', 65536);
 CHECK TABLE t2, t1;
 Table	Op	Msg_type	Msg_text
 test.t2	check	status	OK
@@ -881,8 +880,7 @@ ALGORITHM=INSTANT;
 SET foreign_key_checks=1;
 ALTER TABLE t2 COMMENT 'domestic keys only', DROP FOREIGN KEY fk;
 ALTER TABLE t1 DROP FOREIGN KEY t1_ibfk_1;
-ALTER TABLE t1 ADD COLUMN big BLOB NOT NULL
-DEFAULT REPEAT('a', @@GLOBAL.innodb_page_size * .75);
+ALTER TABLE t1 ADD COLUMN big BLOB NOT NULL DEFAULT REPEAT('a', 65536);
 CHECK TABLE t2, t1;
 Table	Op	Msg_type	Msg_text
 test.t2	check	status	OK
@@ -1298,8 +1296,7 @@ ALGORITHM=INSTANT;
 SET foreign_key_checks=1;
 ALTER TABLE t2 COMMENT 'domestic keys only', DROP FOREIGN KEY fk;
 ALTER TABLE t1 DROP FOREIGN KEY t1_ibfk_1;
-ALTER TABLE t1 ADD COLUMN big BLOB NOT NULL
-DEFAULT REPEAT('a', @@GLOBAL.innodb_page_size * .75);
+ALTER TABLE t1 ADD COLUMN big BLOB NOT NULL DEFAULT REPEAT('a', 65536);
 CHECK TABLE t2, t1;
 Table	Op	Msg_type	Msg_text
 test.t2	check	status	OK
diff --git a/mysql-test/suite/innodb/t/instant_alter.test b/mysql-test/suite/innodb/t/instant_alter.test
index 720e495e3a7..2eb7c4e91d1 100644
--- a/mysql-test/suite/innodb/t/instant_alter.test
+++ b/mysql-test/suite/innodb/t/instant_alter.test
@@ -338,8 +338,7 @@ ALGORITHM=INSTANT;
 SET foreign_key_checks=1;
 ALTER TABLE t2 COMMENT 'domestic keys only', DROP FOREIGN KEY fk;
 ALTER TABLE t1 DROP FOREIGN KEY t1_ibfk_1;
-ALTER TABLE t1 ADD COLUMN big BLOB NOT NULL
-DEFAULT REPEAT('a', @@GLOBAL.innodb_page_size * .75);
+ALTER TABLE t1 ADD COLUMN big BLOB NOT NULL DEFAULT REPEAT('a', 65536);
 CHECK TABLE t2, t1;
 DROP TABLE t2, t1;
 
diff --git a/storage/innobase/trx/trx0rec.cc b/storage/innobase/trx/trx0rec.cc
index 67b5617809f..128768800f8 100644
--- a/storage/innobase/trx/trx0rec.cc
+++ b/storage/innobase/trx/trx0rec.cc
@@ -912,7 +912,7 @@ trx_undo_page_report_modify(
 	byte*		type_cmpl_ptr;
 	ulint		i;
 	trx_id_t	trx_id;
-	ibool		ignore_prefix = FALSE;
+	bool		ignore_prefix = false;
 	byte		ext_buf[REC_VERSION_56_MAX_INDEX_COL_LEN
 				+ BTR_EXTERN_FIELD_REF_SIZE];
 	bool		first_v_col = true;
@@ -932,7 +932,7 @@ trx_undo_page_report_modify(
 		We don't typically need the prefix in this case unless
 		the delete marking is done by the same transaction
 		(which we check below). */
-		ignore_prefix = TRUE;
+		ignore_prefix = true;
 	} else {
 		type_cmpl = TRX_UNDO_UPD_EXIST_REC;
 	}
@@ -1013,7 +1013,8 @@ trx_undo_page_report_modify(
 			return(0);
 		}
 
-		ulint	n_updated = upd_get_n_fields(update);
+		ulint	n = upd_get_n_fields(update);
+		ulint	n_updated = n;
 
 		/* If this is an online update while an inplace alter table
 		is in progress and the table has virtual column, we will
@@ -1021,7 +1022,7 @@ trx_undo_page_report_modify(
 		being registered in update vector in case they will be indexed
 		in new table */
 		if (dict_index_is_online_ddl(index) && table->n_v_cols > 0) {
-			for (i = 0; i < upd_get_n_fields(update); i++) {
+			for (i = 0; i < n; i++) {
 				upd_field_t*	fld = upd_get_nth_field(
 					update, i);
 				ulint		pos = fld->field_no;
@@ -1034,11 +1035,23 @@ trx_undo_page_report_modify(
 					n_updated--;
 				}
 			}
+		} else if (UNIV_UNLIKELY(update->info_bits
+					 == REC_INFO_METADATA)) {
+			/* Do not save dummy default "old" values
+			when extending a metadata record. */
+			for (; n && rec_offs_nth_default(
+				     offsets, update->fields[n - 1].field_no);
+			     n--);
+			n_updated = n;
 		}
 
 		ptr += mach_write_compressed(ptr, n_updated);
 
-		for (i = 0; i < upd_get_n_fields(update); i++) {
+		for (i = 0; i < n; i++) {
+			/* Check the availability of space for field number */
+			if (trx_undo_left(undo_block, ptr) < 5) {
+				return 0;
+			}
 			upd_field_t*	fld = upd_get_nth_field(update, i);
 
 			bool	is_virtual = upd_fld_is_virtual_col(fld);
@@ -1046,11 +1059,6 @@ trx_undo_page_report_modify(
 
 			ulint	pos = fld->field_no;
 
-			/* Write field number to undo log */
-			if (trx_undo_left(undo_block, ptr) < 5) {
-				return(0);
-			}
-
 			if (is_virtual) {
 				/* Skip the non-indexed column, during
 				an online alter table */
@@ -1063,12 +1071,9 @@ trx_undo_page_report_modify(
 				/* add REC_MAX_N_FIELDS to mark this
 				is a virtual col */
 				pos += REC_MAX_N_FIELDS;
-			}
 
-			ptr += mach_write_compressed(ptr, pos);
+				ptr += mach_write_compressed(ptr, pos);
 
-			/* Save the old value of field */
-			if (is_virtual) {
 				ut_ad(fld->field_no < table->n_v_def);
 
 				ptr = trx_undo_log_v_idx(undo_block, table,
@@ -1094,6 +1099,7 @@ trx_undo_page_report_modify(
 						flen, max_v_log_len);
 				}
 			} else {
+				ptr += mach_write_compressed(ptr, pos);
 				field = rec_get_nth_cfield(
 					rec, index, offsets, pos, &flen);
 			}
