diff --git a/storage/innobase/btr/btr0cur.cc b/storage/innobase/btr/btr0cur.cc
index fd0ed4cb232..a91a160bf5e 100644
--- a/storage/innobase/btr/btr0cur.cc
+++ b/storage/innobase/btr/btr0cur.cc
@@ -3310,6 +3310,7 @@ btr_cur_prefetch_siblings(
 	}
 }
 
+extern "C" LEX_STRING* thd_query_string(MYSQL_THD thd);
 /*************************************************************//**
 Tries to perform an insert to a page in an index tree, next to cursor.
 It is assumed that mtr holds an x-latch on the page. The operation does
@@ -3575,6 +3576,13 @@ btr_cur_optimistic_insert(
 	}
 #endif /* BTR_CUR_HASH_ADAPT */
 
+	if (thr && thr->graph->trx->mysql_thd) {
+		ib::info() << "insert "
+			   << rec_printer(entry).str() << " by "
+			   << ib::hex(thr->graph->trx->id) << ","
+			   << thd_query_string(thr->graph->trx->mysql_thd)->str;
+	}
+
 	if (!(flags & BTR_NO_LOCKING_FLAG) && inherit) {
 
 		lock_update_insert(block, *rec);
@@ -4217,6 +4225,8 @@ btr_cur_update_in_place(
 		goto func_exit;
 	}
 
+{	const rec_printer pre(rec, offsets);
+
 	if (!(flags & BTR_KEEP_SYS_FLAG)) {
 		row_upd_rec_sys_fields(rec, NULL, index, offsets,
 				       thr_get_trx(thr), roll_ptr);
@@ -4267,6 +4277,13 @@ btr_cur_update_in_place(
 	}
 #endif /* BTR_CUR_HASH_ADAPT */
 
+	if (thr->graph->trx->mysql_thd) {
+		ib::info() << "uip " << pre.str()
+			   << " to " << rec_printer(rec, offsets).str()
+			   << " by " << ib::hex(thr->graph->trx->id) << ","
+			   << thd_query_string(thr->graph->trx->mysql_thd)->str;
+	}
+
 	btr_cur_update_in_place_log(flags, rec, index, update,
 				    trx_id, roll_ptr, mtr);
 
@@ -4281,7 +4298,7 @@ btr_cur_update_in_place(
 	}
 
 	ut_ad(err == DB_SUCCESS);
-
+}
 func_exit:
 	if (page_zip
 	    && !(flags & BTR_KEEP_IBUF_BITMAP)
@@ -4671,6 +4688,14 @@ btr_cur_optimistic_update(
 		btr_search_update_hash_on_delete(cursor);
 	}
 
+	if (thr->graph->trx->mysql_thd) {
+		ib::info() << "update "
+			   << rec_printer(page_cursor->rec, *offsets).str()
+			   << " to " << rec_printer(new_entry).str() << " by "
+			   << ib::hex(thr->graph->trx->id) << ","
+			   << thd_query_string(thr->graph->trx->mysql_thd)->str;
+	}
+
 	page_cur_delete_rec(page_cursor, index, *offsets, mtr);
 
 	page_cur_move_to_prev(page_cursor);
@@ -5569,6 +5594,13 @@ btr_cur_del_mark_set_sec_rec(
 			      cursor->index->name(), cursor->index->id,
 			      trx_get_id_for_print(thr_get_trx(thr))));
 
+	if (thr->graph->trx->mysql_thd
+	    && !!val != !!rec_get_deleted_flag(rec, page_rec_is_comp(rec))) {
+		ib::info() << (val ? "del-mark " : "del-unmark ")
+			   << rec_index_print(rec, cursor->index)
+			   << " by " << ib::hex(thr->graph->trx->id) << ","
+			   << thd_query_string(thr->graph->trx->mysql_thd)->str;
+	}
 	/* We do not need to reserve search latch, as the
 	delete-mark flag is being updated in place and the adaptive
 	hash index does not depend on it. */
@@ -5736,6 +5768,7 @@ btr_cur_optimistic_delete_func(
 
 	offsets = rec_get_offsets(rec, cursor->index, offsets, true,
 				  ULINT_UNDEFINED, &heap);
+	ib::info() << "delete " << rec_printer(rec, offsets).str();
 
 	no_compress_needed = !rec_offs_any_extern(offsets)
 		&& btr_cur_can_delete_without_compress(
diff --git a/storage/innobase/row/row0purge.cc b/storage/innobase/row/row0purge.cc
index 04dfcbad0d3..a05a0c39d12 100644
--- a/storage/innobase/row/row0purge.cc
+++ b/storage/innobase/row/row0purge.cc
@@ -163,6 +163,9 @@ row_purge_remove_clust_if_poss_low(
 	/* Prove that dict_index_t::clear_instant_alter() was
 	not called with index->table->instant != NULL. */
 	ut_ad(!was_instant || index->table->instant);
+	if (success) {
+		ib::info() << "purged " << rec_printer(rec, offsets).str();
+	}
 
 func_exit:
 	if (heap) {
@@ -586,7 +589,7 @@ row_purge_remove_sec_if_poss_leaf(
 			if (!rec_get_deleted_flag(
 				btr_cur_get_rec(btr_cur),
 				dict_table_is_comp(index->table))) {
-
+				abort();
 				ib::error()
 					<< "tried to purge non-delete-marked"
 					" record" " in index " << index->name
@@ -639,11 +642,16 @@ row_purge_remove_sec_if_poss_leaf(
 				}
 			}
 
+			ib::info info;
+			info << "purging " << rec_index_print(
+				btr_cur_get_rec(btr_cur), index);
+
 			if (!btr_cur_optimistic_delete(btr_cur, 0, &mtr)) {
 
 				/* The index entry could not be deleted. */
 				success = false;
 			}
+			info << ":" << success;
 		}
 
 		if (node->vcol_op_failed()) {
diff --git a/storage/innobase/row/row0upd.cc b/storage/innobase/row/row0upd.cc
index 5266b467091..fee037b3922 100644
--- a/storage/innobase/row/row0upd.cc
+++ b/storage/innobase/row/row0upd.cc
@@ -2418,7 +2418,7 @@ row_upd_sec_index_entry(
 			break;
 		}
 
-		ib::error()
+		ib::fatal()
 			<< "Record in index " << index->name
 			<< " of table " << index->table->name
 			<< " was not found on update: " << *entry
diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc
index 63c78a31cca..4fd9ba3d2a2 100644
--- a/storage/innobase/trx/trx0trx.cc
+++ b/storage/innobase/trx/trx0trx.cc
@@ -1099,6 +1099,7 @@ trx_write_serialisation_history(
 	}
 
 	mutex_exit(&rseg->mutex);
+	ib::info() << "commit " << ib::hex(trx->id) << "," << trx->undo_no;
 
 	MONITOR_INC(MONITOR_TRX_COMMIT_UNDO);
 
