diff --git a/mysql-test/suite/innodb/r/rename_recovery.result b/mysql-test/suite/innodb/r/rename_recovery.result
new file mode 100644
index 00000000000..3e68d5debbd
--- /dev/null
+++ b/mysql-test/suite/innodb/r/rename_recovery.result
@@ -0,0 +1,14 @@
+#
+# MDEV-33011 mariabackup --backup: FATAL ERROR: ... Can't open datafile cool_down/t3
+#
+CREATE TABLE t1(col1 int PRIMARY KEY) ENGINE=InnoDB;
+INSERT INTO t1 VALUES(100);
+# RENAME that fails after redo log entry is written and flushed
+RENAME TABLE t1 TO non_existent_schema.t1;
+ERROR HY000: Error on rename of './test/t1' to './non_existent_schema/t1' (errno: 168 "Unknown (generic) error from engine")
+SET GLOBAL innodb_fast_shutdown=2;
+# restart
+SELECT * FROM t1;
+col1
+100
+DROP TABLE t1;
diff --git a/mysql-test/suite/innodb/t/rename_recovery.test b/mysql-test/suite/innodb/t/rename_recovery.test
new file mode 100644
index 00000000000..15e678091f1
--- /dev/null
+++ b/mysql-test/suite/innodb/t/rename_recovery.test
@@ -0,0 +1,22 @@
+--source include/have_innodb.inc
+
+--echo #
+--echo # MDEV-33011 mariabackup --backup: FATAL ERROR: ... Can't open datafile cool_down/t3
+--echo #
+
+--disable_query_log
+call mtr.add_suppression("InnoDB: Cannot rename '.*/test/t1.ibd' to .*/non_existent_schema/t1.ibd' because the target schema directory doesn't exist");
+--enable_query_log
+
+CREATE TABLE t1(col1 int PRIMARY KEY) ENGINE=InnoDB;
+INSERT INTO t1 VALUES(100);
+
+--echo # RENAME that fails after redo log entry is written and flushed
+--error ER_ERROR_ON_RENAME
+RENAME TABLE t1 TO non_existent_schema.t1;
+
+SET GLOBAL innodb_fast_shutdown=2;
+--source include/restart_mysqld.inc
+
+SELECT * FROM t1;
+DROP TABLE t1;
diff --git a/mysql-test/suite/mariabackup/rename_during_backup.result b/mysql-test/suite/mariabackup/rename_during_backup.result
index ba1dbec0e1b..7093511d01e 100644
--- a/mysql-test/suite/mariabackup/rename_during_backup.result
+++ b/mysql-test/suite/mariabackup/rename_during_backup.result
@@ -60,3 +60,15 @@ SELECT * from t6;
 i
 5
 DROP TABLE t6;
+#
+# MDEV-33011 mariabackup --backup: FATAL ERROR: ... Can't open datafile cool_down/t3
+#
+# Simulate zero intialized page to defer tablespace load after rename log is found
+SET @save_dbug = @@SESSION.debug_dbug;
+SET DEBUG_DBUG="+d,checkpoint_after_file_create";
+CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB;
+INSERT INTO t1 VALUES(1);
+# RENAME that fails after redo log entry is written and flushed
+RENAME TABLE t1 TO non_existent_schema.t1;
+ERROR HY000: Error on rename of './test/t1' to './non_existent_schema/t1' (errno: 168 "Unknown (generic) error from engine")
+DROP TABLE t1;
diff --git a/mysql-test/suite/mariabackup/rename_during_backup.test b/mysql-test/suite/mariabackup/rename_during_backup.test
index 238a8b1985c..99026b3eb19 100644
--- a/mysql-test/suite/mariabackup/rename_during_backup.test
+++ b/mysql-test/suite/mariabackup/rename_during_backup.test
@@ -90,4 +90,30 @@ SELECT * from t6;
 DROP TABLE t6;
 rmdir $targetdir;
 
+--echo #
+--echo # MDEV-33011 mariabackup --backup: FATAL ERROR: ... Can't open datafile cool_down/t3
+--echo #
 
+--disable_query_log
+call mtr.add_suppression("InnoDB: Cannot rename '.*/test/t1.ibd' to .*/non_existent_schema/t1.ibd' because the target schema directory doesn't exist");
+--enable_query_log
+
+mkdir $targetdir;
+
+--echo # Simulate zero intialized page to defer tablespace load after rename log is found
+SET @save_dbug = @@SESSION.debug_dbug;
+SET DEBUG_DBUG="+d,checkpoint_after_file_create";
+CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB;
+INSERT INTO t1 VALUES(1);
+
+--echo # RENAME that fails after redo log entry is written and flushed
+--error ER_ERROR_ON_RENAME
+RENAME TABLE t1 TO non_existent_schema.t1;
+
+--disable_result_log
+exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir;
+exec $XTRABACKUP --prepare --target-dir=$targetdir;
+--enable_result_log
+
+DROP TABLE t1;
+rmdir $targetdir;
diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc
index 885b0a700ea..5ed4d0039ea 100644
--- a/storage/innobase/fil/fil0fil.cc
+++ b/storage/innobase/fil/fil0fil.cc
@@ -1961,13 +1961,15 @@ and a suffix. The string must be freed by caller with ut_free().
 @param[in] name NULL if path is full, or Table/Tablespace name
 @param[in] suffix NULL or the file extention to use.
 @param[in] trim_name true if the last name on the path should be trimmed.
+@param[in] dir_path true, if the intended path name is directory.
 @return own: file name */
 char*
 fil_make_filepath(
 	const char*	path,
 	const char*	name,
 	ib_extention	ext,
-	bool		trim_name)
+	bool		trim_name,
+	bool		dir_path)
 {
 	/* The path may contain the basename of the file, if so we do not
 	need the name.  If the path is NULL, we can use the default path,
@@ -1975,8 +1977,15 @@ fil_make_filepath(
 	ut_ad(path != NULL || name != NULL);
 
 	/* If we are going to strip a name off the path, there better be a
-	path and a new name to put back on. */
-	ut_ad(!trim_name || (path != NULL && name != NULL));
+	path and a new name to put back on unless caller is asking for
+	directory path. */
+	ut_ad(!trim_name || (path != NULL && name != NULL) || dir_path);
+
+	if (dir_path) {
+		ut_a(trim_name);
+		ut_a(ext == NO_EXT);
+		ut_a(name == NULL);
+	}
 
 	if (path == NULL) {
 		path = fil_path_to_mysql_datadir;
@@ -2084,6 +2093,22 @@ fil_rename_tablespace_check(
 
 	exists = false;
 	if (os_file_status(new_path, &exists, &ftype) && !exists) {
+		auto schema_path= fil_make_filepath(new_path, NULL, NO_EXT,
+						    true, true);
+		if (schema_path == NULL) {
+			return DB_ERROR;
+		}
+		exists= false;
+		if (os_file_status(schema_path, &exists, &ftype) && !exists)
+		{
+			ib::error() << "Cannot rename '" << old_path
+				    << "' to '" << new_path
+				    << "' because the target schema directory"
+				    << " doesn't exist.";
+			ut_free(schema_path);
+			return DB_ERROR;
+		}
+		ut_free(schema_path);
 		return DB_SUCCESS;
 	}
 
diff --git a/storage/innobase/include/fil0fil.h b/storage/innobase/include/fil0fil.h
index 10c084bbbf1..e62a73f4828 100644
--- a/storage/innobase/include/fil0fil.h
+++ b/storage/innobase/include/fil0fil.h
@@ -1619,13 +1619,15 @@ and a suffix. The string must be freed by caller with ut_free().
 @param[in] path NULL or the directory path or the full path and filename.
 @param[in] name NULL if path is full, or Table/Tablespace name
 @param[in] suffix NULL or the file extention to use.
+@param[in] dir_path true, if the intended path name is directory.
 @return own: file name */
 char*
 fil_make_filepath(
 	const char*	path,
 	const char*	name,
 	ib_extention	suffix,
-	bool		strip_name);
+	bool		strip_name,
+	bool		dir_path = false);
 
 /** Create a tablespace file.
 @param[in]	space_id	Tablespace ID
