diff --git a/innobase/include/lock0lock.h b/innobase/include/lock0lock.h
index 710c945375cfb0a1f72c3b252344b5d40eb8cff6..45a81a4ac77bcaa4335ba21afbf78f278b795e9d 100644
--- a/innobase/include/lock0lock.h
+++ b/innobase/include/lock0lock.h
@@ -565,8 +565,15 @@ lock_rec_print(
 Prints info of locks for all transactions. */
 
 void
-lock_print_info(
-/*============*/
+lock_print_info_summary(
+/*====================*/
+	FILE*	file);	/* in: file where to print */
+/*************************************************************************
+Prints info of locks for each transaction. */
+
+void
+lock_print_info_all_transactions(
+/*=============================*/
 	FILE*	file);	/* in: file where to print */
 /*************************************************************************
 Validates the lock queue on a table. */
diff --git a/innobase/include/srv0srv.h b/innobase/include/srv0srv.h
index 4a1833a1a2126b0876a3fb7bc724a8f4264c6a5a..6e4241965c19f01d695afeac7cf731840d2e04ca 100644
--- a/innobase/include/srv0srv.h
+++ b/innobase/include/srv0srv.h
@@ -466,8 +466,13 @@ Outputs to a file the output of the InnoDB Monitor. */
 void
 srv_printf_innodb_monitor(
 /*======================*/
-	FILE*	file);	/* in: output stream */
-/************************************************************************
+	FILE*	file,		/* in: output stream */
+	ulint*	trx_start,	/* out: file position of the start of
+				the list of active transactions */
+	ulint*	trx_end);	/* out: file position of the end of
+				the list of active transactions */
+
+/**********************************************************************
 Function to pass InnoDB status variables to MySQL */
 
 void
diff --git a/innobase/lock/lock0lock.c b/innobase/lock/lock0lock.c
index 512f487b3f54438b8573aa7202236700f42ddba0..73ecc717e0e0f99a700b674408c3e74a08459c71 100644
--- a/innobase/lock/lock0lock.c
+++ b/innobase/lock/lock0lock.c
@@ -4226,21 +4226,10 @@ lock_get_n_rec_locks(void)
 Prints info of locks for all transactions. */
 
 void
-lock_print_info(
-/*============*/
+lock_print_info_summary(
+/*====================*/
 	FILE*	file)	/* in: file where to print */
 {
-	lock_t*	lock;
-	trx_t*	trx;
-	ulint	space;
-	ulint	page_no;
-	page_t*	page;
-	ibool	load_page_first = TRUE;
-	ulint	nth_trx		= 0;
-	ulint	nth_lock	= 0;
-	ulint	i;
-	mtr_t	mtr;
-
 	/* We must protect the MySQL thd->query field with a MySQL mutex, and
 	because the MySQL mutex must be reserved before the kernel_mutex of
 	InnoDB, we call innobase_mysql_prepare_print_arbitrary_thd() here. */
@@ -4279,6 +4268,26 @@ lock_print_info(
 	fprintf(file,
 		"Total number of lock structs in row lock hash table %lu\n",
 					 (ulong) lock_get_n_rec_locks());
+}
+
+/*************************************************************************
+Prints info of locks for each transaction. */
+
+void
+lock_print_info_all_transactions(
+/*=============================*/
+	FILE*	file)	/* in: file where to print */
+{
+	lock_t*	lock;
+	ulint	space;
+	ulint	page_no;
+	page_t*	page;
+	ibool	load_page_first = TRUE;
+	ulint	nth_trx		= 0;
+	ulint	nth_lock	= 0;
+	ulint	i;
+	mtr_t	mtr;
+	trx_t*	trx;
 
 	fprintf(file, "LIST OF TRANSACTIONS FOR EACH SESSION:\n");
 
diff --git a/innobase/srv/srv0srv.c b/innobase/srv/srv0srv.c
index a4bfdb6162d1451ad2e59fcd9e57a35e1d6505aa..f901425a5f9ef3257322c0a375c95a413e80a524 100644
--- a/innobase/srv/srv0srv.c
+++ b/innobase/srv/srv0srv.c
@@ -1602,7 +1602,11 @@ Outputs to a file the output of the InnoDB Monitor. */
 void
 srv_printf_innodb_monitor(
 /*======================*/
-	FILE*	file)	/* in: output stream */
+	FILE*	file,		/* in: output stream */
+	ulint*	trx_start,	/* out: file position of the start of
+				the list of active transactions */
+	ulint*	trx_end)	/* out: file position of the end of
+				the list of active transactions */
 {
 	double	time_elapsed;
 	time_t	current_time;
@@ -1651,7 +1655,24 @@ srv_printf_innodb_monitor(
 
 	mutex_exit(&dict_foreign_err_mutex);
 
-	lock_print_info(file);
+	lock_print_info_summary(file);
+	if (trx_start) {
+		long	t = ftell(file);
+		if (t < 0) {
+			*trx_start = ULINT_UNDEFINED;
+		} else {
+			*trx_start = (ulint) t;
+		}
+	}
+	lock_print_info_all_transactions(file);
+	if (trx_end) {
+		long	t = ftell(file);
+		if (t < 0) {
+			*trx_end = ULINT_UNDEFINED;
+		} else {
+			*trx_end = (ulint) t;
+		}
+	}
 	fputs("--------\n"
 		"FILE I/O\n"
 		"--------\n", file);
@@ -1865,13 +1886,13 @@ loop:
 	    last_monitor_time = time(NULL);
 
 	    if (srv_print_innodb_monitor) {
-		srv_printf_innodb_monitor(stderr);
+		srv_printf_innodb_monitor(stderr, NULL, NULL);
 	    }
 
 	    if (srv_innodb_status) {
 		mutex_enter(&srv_monitor_file_mutex);
 		rewind(srv_monitor_file);
-		srv_printf_innodb_monitor(srv_monitor_file);
+		srv_printf_innodb_monitor(srv_monitor_file, NULL, NULL);
 		os_file_set_eof(srv_monitor_file);
 		mutex_exit(&srv_monitor_file_mutex);
 	    }
diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc
index 0c70713f0d35112b3750ca9ac7a50353a3e2e166..ad1805eb26406105263c50a1882d87e2931c09f0 100644
--- a/sql/ha_innodb.cc
+++ b/sql/ha_innodb.cc
@@ -6146,10 +6146,12 @@ innodb_show_status(
 /*===============*/
 	THD*	thd)	/* in: the MySQL query thread of the caller */
 {
-        Protocol        *protocol= thd->protocol;
-	trx_t*		trx;
-	long		flen;
-	char*		str;
+	Protocol*		protocol = thd->protocol;
+	trx_t*			trx;
+	static const char	truncated_msg[] = "... truncated...\n";
+	const long		MAX_STATUS_SIZE = 64000;
+	ulint			trx_list_start = ULINT_UNDEFINED;
+	ulint			trx_list_end = ULINT_UNDEFINED;
 
         DBUG_ENTER("innodb_show_status");
 
@@ -6164,32 +6166,58 @@ innodb_show_status(
 
 	innobase_release_stat_resources(trx);
 
-	/* We let the InnoDB Monitor to output at most 64000 bytes of text. */
+	/* We let the InnoDB Monitor to output at most MAX_STATUS_SIZE
+	bytes of text. */
+
+	long	flen, usable_len;
+	char*	str;
 
 	mutex_enter_noninline(&srv_monitor_file_mutex);
 	rewind(srv_monitor_file);
-
-	srv_printf_innodb_monitor(srv_monitor_file);
+	srv_printf_innodb_monitor(srv_monitor_file,
+				&trx_list_start, &trx_list_end);
 	flen = ftell(srv_monitor_file);
 	os_file_set_eof(srv_monitor_file);
 
 	if (flen < 0) {
 		flen = 0;
-	} else if (flen > 64000 - 1) {
-		flen = 64000 - 1;
+	}
+
+	if (flen > MAX_STATUS_SIZE) {
+		usable_len = MAX_STATUS_SIZE;
+	} else {
+		usable_len = flen;
 	}
 
 	/* allocate buffer for the string, and
 	read the contents of the temporary file */
 
-	if (!(str = my_malloc(flen + 1, MYF(0)))) {
-        	mutex_exit_noninline(&srv_monitor_file_mutex);
-
-        	DBUG_RETURN(TRUE);
+	if (!(str = my_malloc(usable_len + 1, MYF(0))))
+        {
+          mutex_exit_noninline(&srv_monitor_file_mutex);
+          DBUG_RETURN(TRUE);
         }
 
 	rewind(srv_monitor_file);
-	flen = fread(str, 1, flen, srv_monitor_file);
+	if (flen < MAX_STATUS_SIZE) {
+		/* Display the entire output. */
+		flen = fread(str, 1, flen, srv_monitor_file);
+	} else if (trx_list_end < (ulint) flen
+			&& trx_list_start < trx_list_end
+			&& trx_list_start + (flen - trx_list_end)
+			< MAX_STATUS_SIZE - sizeof truncated_msg - 1) {
+		/* Omit the beginning of the list of active transactions. */
+		long	len = fread(str, 1, trx_list_start, srv_monitor_file);
+		memcpy(str + len, truncated_msg, sizeof truncated_msg - 1);
+		len += sizeof truncated_msg - 1;
+		usable_len = (MAX_STATUS_SIZE - 1) - len;
+		fseek(srv_monitor_file, flen - usable_len, SEEK_SET);
+		len += fread(str + len, 1, usable_len, srv_monitor_file);
+		flen = len;
+	} else {
+		/* Omit the end of the output. */
+		flen = fread(str, 1, MAX_STATUS_SIZE - 1, srv_monitor_file);
+	}
 
 	mutex_exit_noninline(&srv_monitor_file_mutex);