diff --git a/lib/db/mysql.js b/lib/db/mysql.js
index 3657ff36e8f97bb9032d3516324f313b69523565..78749dac678532a13d1f2976ea278a888c41be41 100644
--- a/lib/db/mysql.js
+++ b/lib/db/mysql.js
@@ -118,9 +118,6 @@ exports.open = function(cfg, cb) {
     if (options[param] === undefined) delete options[param];
   });
 
-  // create the client
-  client = mysql.createClient(options);
-
   // let's figure out the database name
   var database = cfg.database;
   if (!database) database = "browserid";
@@ -129,15 +126,28 @@ exports.open = function(cfg, cb) {
   // that we should drop the database on close, do it
   if (database !== 'browserid' && cfg.drop_on_close) drop_on_close = database;
 
+  // create the client
+  function doConnect() {
+    logger.debug("connecting to database");
+    options.database = database;
+    client = mysql.createClient(options);
+    client.ping(function(err) {
+      logger.debug("connection to database " + (err ? ("fails: " + err) : "established"));
+      cb(err);
+    });
+  }
+
   // now create the databse
   if (cfg.create_schema) {
-    client.query("CREATE DATABASE IF NOT EXISTS " + database, function(err) {
+    logger.debug("creating database and tables if required");
+    var createClient = mysql.createClient(options);
+    createClient.query("CREATE DATABASE IF NOT EXISTS " + database, function(err) {
       if (err) {
         logUnexpectedError(err);
         cb(err);
         return;
       }
-      client.useDatabase(database, function(err) {
+      createClient.useDatabase(database, function(err) {
         if (err) {
           logUnexpectedError(err);
           cb(err);
@@ -147,7 +157,7 @@ exports.open = function(cfg, cb) {
         // now create tables
         function createNextTable(i) {
           if (i < schemas.length) {
-            client.query(schemas[i], function(err) {
+            createClient.query(schemas[i], function(err) {
               if (err) {
                 logUnexpectedError(err);
                 cb(err);
@@ -156,13 +166,22 @@ exports.open = function(cfg, cb) {
               }
             });
           } else {
-            cb();
+            createClient.end(function(err) {
+              if (err) {
+                logUnexpectedError(err);
+                cb(err);
+              } else {
+                doConnect();
+              }
+            });
           }
         }
         createNextTable(0);
       });
     });
-  };
+  } else {
+    doConnect();
+  }
 };
 
 exports.close = function(cb) {