diff --git a/mysql-test/suite/innodb_fts/r/create.result b/mysql-test/suite/innodb_fts/r/create.result
index c3a14fa0281..57c2d1ecaab 100644
--- a/mysql-test/suite/innodb_fts/r/create.result
+++ b/mysql-test/suite/innodb_fts/r/create.result
@@ -182,3 +182,19 @@ Table	Op	Msg_type	Msg_text
 test.t1	optimize	status	OK
 DROP TABLE t1;
 SET GLOBAL innodb_optimize_fulltext_only= @optimize_fulltext.save;
+#
+# MDEV-21550 Assertion `!table->fts->in_queue' failed in
+# fts_optimize_remove_table
+#
+CREATE TABLE t1 (pk INT, a VARCHAR(8), PRIMARY KEY(pk)) ENGINE=InnoDB;
+CREATE TABLE t2 (b INT, FOREIGN KEY(b) REFERENCES t1(pk)) ENGINE=InnoDB;
+INSERT INTO t1 SELECT seq, CONCAT('foo',seq) FROM seq_1_to_1000;
+ALTER TABLE t1 ADD FULLTEXT KEY fk1(a);
+Warnings:
+Warning	124	InnoDB rebuilding table to add column FTS_DOC_ID
+ALTER TABLE t1 ADD FULLTEXT KEY fk2(a);
+CREATE OR REPLACE TABLE t1 (f INT);
+ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails
+REPLACE INTO t1 SELECT seq, CONCAT('foo',seq) FROM seq_1_to_1000;
+ALTER TABLE t1 FORCE;
+DROP TABLE t2, t1;
diff --git a/mysql-test/suite/innodb_fts/t/create.test b/mysql-test/suite/innodb_fts/t/create.test
index 4e522994fcc..ea4a978e6f4 100644
--- a/mysql-test/suite/innodb_fts/t/create.test
+++ b/mysql-test/suite/innodb_fts/t/create.test
@@ -1,4 +1,5 @@
 --source include/have_innodb.inc
+--source include/have_sequence.inc
 SET NAMES utf8mb4;
 
 --echo #
@@ -106,3 +107,19 @@ SET GLOBAL innodb_optimize_fulltext_only= 1;
 OPTIMIZE TABLE t1;
 DROP TABLE t1;
 SET GLOBAL innodb_optimize_fulltext_only= @optimize_fulltext.save;
+
+--echo #
+--echo # MDEV-21550 Assertion `!table->fts->in_queue' failed in
+--echo # fts_optimize_remove_table
+--echo #
+CREATE TABLE t1 (pk INT, a VARCHAR(8), PRIMARY KEY(pk)) ENGINE=InnoDB;
+CREATE TABLE t2 (b INT, FOREIGN KEY(b) REFERENCES t1(pk)) ENGINE=InnoDB;
+INSERT INTO t1 SELECT seq, CONCAT('foo',seq) FROM seq_1_to_1000;
+ALTER TABLE t1 ADD FULLTEXT KEY fk1(a);
+ALTER TABLE t1 ADD FULLTEXT KEY fk2(a);
+--error ER_ROW_IS_REFERENCED_2
+CREATE OR REPLACE TABLE t1 (f INT);
+REPLACE INTO t1 SELECT seq, CONCAT('foo',seq) FROM seq_1_to_1000;
+ALTER TABLE t1 FORCE;
+# Cleanup
+DROP TABLE t2, t1;
diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc
index 708d2724595..0aa05a702f3 100644
--- a/storage/innobase/row/row0mysql.cc
+++ b/storage/innobase/row/row0mysql.cc
@@ -3806,6 +3806,11 @@ row_drop_table_for_mysql(
 			trx_commit_for_mysql(trx);
 		}
 
+		/* Add the table to fts queue if drop table fails */
+		if (err != DB_SUCCESS && table->fts) {
+			fts_optimize_add_table(table);
+		}
+
 		row_mysql_unlock_data_dictionary(trx);
 	}
 
