I did some modifications in database.inc, database.mysqli.inc and settings.php in order to work when master mysql server was down.
Scenario
- If mysql master is inactive, connect to Slave,
- if slave is inactive but Master is active, then connect to Master
- if Master and Slave both are inactive, Redirect user to Offline page
Modifications can be found in red text.
database.inc
- Below change will modify the db_connect call to Master instance by passing 2nd parameter ("master") and by assigning $db_slave_conns[$name] values to $active_db.
- Validate before slave connection create. If master is active we are not calling Slave by adding $db_conns[$name]->connect_errno > 0
function db_set_active($name = 'default') { global $db_url, $db_slave_url, $db_type, $active_db, $active_slave_db; static $db_conns, $db_slave_conns, $active_name = FALSE;
if (empty($db_url)) { include_once 'includes/install.inc'; install_goto('install.php'); }
if (!isset($db_conns[$name])) { // Initiate a new connection, using the named DB URL specified. if (is_array($db_url)) { $connect_url = array_key_exists($name, $db_url) ? $db_url[$name] : $db_url['default']; if (is_array($db_slave_url[$name])) { $slave_index = mt_rand(0, count($db_slave_url[$name]) - 1); $slave_connect_url = $db_slave_url[$name][$slave_index]; } else { $slave_connect_url = $db_slave_url[$name]; } } else { $connect_url = $db_url; if (is_array($db_slave_url)) { $slave_index = mt_rand(0, count($db_slave_url) - 1); $slave_connect_url = $db_slave_url[$slave_index]; } else { $slave_connect_url = $db_slave_url; } }
$db_type = substr($connect_url, 0, strpos($connect_url, '://')); $handler = "./includes/database.$db_type.inc";
if (is_file($handler)) { include_once $handler; } else { _db_error_page("The database type '". $db_type ."' is unsupported. Please use either 'mysql' or 'mysqli' for MySQL, or 'pgsql' for PostgreSQL databases."); }
$db_conns[$name] = db_connect($connect_url,'master'); if ($db_conns[$name]->connect_errno > 0 && !empty($slave_connect_url)) { $db_slave_conns[$name] = db_connect($slave_connect_url); } }
$previous_name = $active_name; // Set the active connection. $active_name = $name; $active_db = $db_conns[$name]; if (isset($db_slave_conns[$name])) { $active_slave_db = $db_slave_conns[$name]; $active_db = $db_slave_conns[$name]; } else { unset($active_slave_db); }
return $previous_name;}