**Describe the solution you'd like**

We already can run clickhouse-server without configured ZooKeeper (the tables will start in read-only mode)
and with configured ZooKeeper, if it starts to be inaccessible at runtime (the tables will be read-only until the session is re-established).

Let's also make it possible to start up when ZooKeeper is unavailable.

**Additional context**

If that will be very hard to implement, we can consider other options:
- lazy attaching of the tables after sever start-up;
- a maintenance mode when the tables are not attached at start-up and require manual ATTACH queries.
backup_entries = std::move(backup_entries),
                                 &backup_entries_collector]()
    {
        Strings data_paths = coordination->getReplicatedDataPaths(shared_id);
        std::vector<fs::path> data_paths_fs;
        data_paths_fs.reserve(data_paths.size());
        for (const auto & data_path : data_paths)
            data_paths_fs.push_back(data_path);
        Strings part_names = coordination->getReplicatedPartNames(shared_id, replica_name);
        std::unordered_set<std::string_view> part_names_set{part_names.begin(), part_names.end()};
        for (const auto & [relative_path, backup_entry] : backup_entries)
        {
            size_t slash_pos = relative_path.find('/');
            String part_name = relative_path.substr(0, slash_pos);
            if (!part_names_set.contains(part_name))
                continue;
            for (const auto & data_path : data_paths_fs)
                backup_entries_collector.addBackupEntry(data_path / relative_path, backup_entry);
        }
        auto mutation_infos = coordination->getReplicatedMutations(shared_id, replica_name);
        for (const auto & mutation_info : mutation_infos)
        {
            auto backup_entry = ReplicatedMergeTreeMutationEntry::parse(mutation_info.entry, mutation_info.id).backup();
            for (const auto & data_path : data_paths_fs)
                backup_entries_collector.addBackupEntry(data_path / "mutations" / (mutation_info.id + ".txt"), backup_entry);
        }
    };
    backup_entries_collector.addPostTask(post_collecting_task);
}
void StorageReplicatedMergeTree::restoreDataFromBackup(RestorerFromBackup & restorer, const String & data_path_in_backup, const std::optional<ASTs> & partitions)