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 e071b6b2e21..c61026c1adc 100644
--- a/mysql-test/suite/mariabackup/rename_during_backup.result
+++ b/mysql-test/suite/mariabackup/rename_during_backup.result
@@ -61,3 +61,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 d8e40b28941..e5a107d3651 100644
--- a/mysql-test/suite/mariabackup/rename_during_backup.test
+++ b/mysql-test/suite/mariabackup/rename_during_backup.test
@@ -92,4 +92,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 58598ec5581..05c039c888d 100644
--- a/storage/innobase/fil/fil0fil.cc
+++ b/storage/innobase/fil/fil0fil.cc
@@ -1735,9 +1735,10 @@ and a suffix. The string must be freed by caller with ut_free().
 @param[in] name {} if path is full, or Table/Tablespace name
 @param[in] ext the file extension 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 fil_space_t::name_type &name,
-                        ib_extention ext, bool trim_name)
+                        ib_extention ext, 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,
@@ -1745,8 +1746,15 @@ char* fil_make_filepath(const char *path, const fil_space_t::name_type &name,
 	ut_ad(path || name.data());
 
 	/* 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 && name.data()));
+	path and a new name to put back on unless caller is asking for
+	directory path. */
+	ut_ad(!trim_name || (path && name.data()) || dir_path);
+
+	if (dir_path) {
+		ut_a(trim_name);
+		ut_a(ext == NO_EXT);
+		ut_a(name.empty());
+	}
 
 	if (path == NULL) {
 		path = fil_path_to_mysql_datadir;
@@ -1879,14 +1887,33 @@ dberr_t fil_space_t::rename(const char *path, bool log, bool replace)
     return DB_TABLESPACE_NOT_FOUND;
   }
 
-  exists= false;
   if (replace);
-  else if (!os_file_status(path, &exists, &ftype) || exists)
+  else
   {
-    sql_print_error("InnoDB: Cannot rename '%s' to '%s'"
-                    " because the target file exists.",
-                    old_path, path);
-    return DB_TABLESPACE_EXISTS;
+    auto schema_path= fil_make_filepath(path, fil_space_t::name_type{}, NO_EXT,
+                                        true, true);
+    if (schema_path == nullptr) {
+      return DB_ERROR;
+    }
+    exists= false;
+    if (os_file_status(schema_path, &exists, &ftype) && !exists)
+    {
+      sql_print_error("InnoDB: Cannot rename '%s' to '%s'"
+                      " because the target schema directory doesn't exist.",
+                      old_path, path);
+      ut_free(schema_path);
+      return DB_ERROR;
+    }
+    ut_free(schema_path);
+
+    exists= false;
+    if (!os_file_status(path, &exists, &ftype) || exists)
+    {
+      sql_print_error("InnoDB: Cannot rename '%s' to '%s'"
+                      " because the target file exists.",
+                      old_path, path);
+      return DB_TABLESPACE_EXISTS;
+    }
   }
 
   mtr_t mtr;
diff --git a/storage/innobase/include/fil0fil.h b/storage/innobase/include/fil0fil.h
index 5bebc304a27..a206ec1234b 100644
--- a/storage/innobase/include/fil0fil.h
+++ b/storage/innobase/include/fil0fil.h
@@ -1729,9 +1729,11 @@ and a suffix. The string must be freed by caller with ut_free().
 @param[in] name {} if path is full, or Table/Tablespace name
 @param[in] ext the file extension 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 fil_space_t::name_type &name,
-                        ib_extention ext, bool trim_name);
+                        ib_extention ext, bool trim_name,
+                        bool dir_path = false);
 
 char *fil_make_filepath(const char* path, const table_name_t name,
                         ib_extention suffix, bool strip_name);
