diff --git a/lib/MogileFS/Config.pm b/lib/MogileFS/Config.pm
index 1861910..cc682be 100644
--- a/lib/MogileFS/Config.pm
+++ b/lib/MogileFS/Config.pm
@@ -213,6 +213,27 @@ sub config {
 }
 
 sub check_database {
+    my $class = shift;
+    my $sto = $class->check_database_connection;
+    $class->check_database_schema;
+    $sto->pre_daemonize_checks;
+}
+
+sub check_database_forever {
+    my $class = shift;
+    my $sto;
+    while () {
+        $sto = eval { $class->check_database_connection };
+        last if $sto;
+        # XXX is it ok to use Mgd::log here?
+        Mgd::log('err', "Cannot connect to MogileFS database, try again later. Details: err=$@");
+        sleep 5; # XXX configurable?
+    }
+    $class->check_database_schema;
+    $sto->pre_daemonize_checks;
+}
+
+sub check_database_connection {
     my $sto = eval { Mgd::get_store() };
     unless ($sto && $sto->ping) {
         die qq{
@@ -226,15 +247,17 @@ run 'mogdbsetup'.
 Details: [sto=$sto, err=$@]
 }
     }
+    $sto;
+}
 
+sub check_database_schema {
     my $sversion = MogileFS::Config->server_setting('schema_version') || 0;
     my $expect_ver = MogileFS::Store->latest_schema_version;
     unless ($sversion == $expect_ver || MogileFS::Config->config('no_schema_check')) {
+        # XXX Should probably use syslog if it's already daemonized?
         die "Server's database schema version of $sversion doesn't match expected value of $expect_ver.  Halting.\n\n".
             "Please run mogdbsetup to upgrade your schema.\n";
     }
-
-    $sto->pre_daemonize_checks;
 }
 
 # set_server_setting( key, value )
diff --git a/lib/MogileFS/Server.pm b/lib/MogileFS/Server.pm
index 60b4340..d96f9c3 100644
--- a/lib/MogileFS/Server.pm
+++ b/lib/MogileFS/Server.pm
@@ -96,9 +96,14 @@ sub run {
     die "mogilefsd cannot be run as root\n"
         if $< == 0 && MogileFS->config('user') ne "root";
 
-    MogileFS::Config->check_database;
     daemonize() if MogileFS->config("daemonize");
 
+    # open up our log
+    Sys::Syslog::openlog('mogilefsd', 'pid', 'daemon');
+    Mgd::log('info', 'beginning run');
+
+    MogileFS::Config->check_database_forever; # XXX configurable use of check_database vs. check_database_forever? Start check_database before daemonize()
+
     MogileFS::ProcManager->set_min_workers('queryworker' => MogileFS->config('query_jobs'));
     MogileFS::ProcManager->set_min_workers('delete'      => MogileFS->config('delete_jobs'));
     MogileFS::ProcManager->set_min_workers('replicate'   => MogileFS->config('replicate_jobs'));
@@ -107,10 +112,6 @@ sub run {
     MogileFS::ProcManager->set_min_workers('fsck'        => MogileFS->config('fsck_jobs'));
     MogileFS::ProcManager->set_min_workers('job_master'  => 1);
 
-    # open up our log
-    Sys::Syslog::openlog('mogilefsd', 'pid', 'daemon');
-    Mgd::log('info', 'beginning run');
-
     unless (MogileFS::ProcManager->write_pidfile) {
         Mgd::log('info', "Couldn't write pidfile, ending run");
         Sys::Syslog::closelog();