1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288
|
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* Replication helpers
*
* @package PhpMyAdmin
*/
if (! defined('PHPMYADMIN')) {
exit;
}
/**
* get master replication from server
*/
$server_master_replication = $GLOBALS['dbi']->fetchResult('SHOW MASTER STATUS');
/**
* get slave replication from server
*/
$server_slave_replication = $GLOBALS['dbi']->fetchResult('SHOW SLAVE STATUS');
/**
* replication types
*/
$replication_types = array('master', 'slave');
/**
* define variables for master status
*/
$master_variables = array(
'File',
'Position',
'Binlog_Do_DB',
'Binlog_Ignore_DB',
);
/**
* Define variables for slave status
*/
$slave_variables = array(
'Slave_IO_State',
'Master_Host',
'Master_User',
'Master_Port',
'Connect_Retry',
'Master_Log_File',
'Read_Master_Log_Pos',
'Relay_Log_File',
'Relay_Log_Pos',
'Relay_Master_Log_File',
'Slave_IO_Running',
'Slave_SQL_Running',
'Replicate_Do_DB',
'Replicate_Ignore_DB',
'Replicate_Do_Table',
'Replicate_Ignore_Table',
'Replicate_Wild_Do_Table',
'Replicate_Wild_Ignore_Table',
'Last_Errno',
'Last_Error',
'Skip_Counter',
'Exec_Master_Log_Pos',
'Relay_Log_Space',
'Until_Condition',
'Until_Log_File',
'Until_Log_Pos',
'Master_SSL_Allowed',
'Master_SSL_CA_File',
'Master_SSL_CA_Path',
'Master_SSL_Cert',
'Master_SSL_Cipher',
'Master_SSL_Key',
'Seconds_Behind_Master',
);
/**
* define important variables, which need to be watched for
* correct running of replication in slave mode
*
* @usedby PMA_getHtmlForReplicationStatusTable()
*/
// TODO change to regexp or something, to allow for negative match.
// To e.g. highlight 'Last_Error'
//
$slave_variables_alerts = array(
'Slave_IO_Running' => 'No',
'Slave_SQL_Running' => 'No',
);
$slave_variables_oks = array(
'Slave_IO_Running' => 'Yes',
'Slave_SQL_Running' => 'Yes',
);
// check which replication is available and
// set $server_{master/slave}_status and assign values
// replication info is more easily passed to functions
/*
* @todo use $replication_info everywhere instead of the generated variable names
*/
$replication_info = array();
foreach ($replication_types as $type) {
if (count(${"server_{$type}_replication"}) > 0) {
${"server_{$type}_status"} = true;
$replication_info[$type]['status'] = true;
} else {
${"server_{$type}_status"} = false;
$replication_info[$type]['status'] = false;
}
if (${"server_{$type}_status"}) {
if ($type == "master") {
${"server_{$type}_Do_DB"} = explode(
",", $server_master_replication[0]["Binlog_Do_DB"]
);
$replication_info[$type]['Do_DB'] = ${"server_{$type}_Do_DB"};
${"server_{$type}_Ignore_DB"} = explode(
",", $server_master_replication[0]["Binlog_Ignore_DB"]
);
$replication_info[$type]['Ignore_DB'] = ${"server_{$type}_Ignore_DB"};
} elseif ($type == "slave") {
${"server_{$type}_Do_DB"} = explode(
",", $server_slave_replication[0]["Replicate_Do_DB"]
);
if (! empty(${"server_{$type}_Do_DB"})) {
$replication_info[$type]['Do_DB'] = ${"server_{$type}_Do_DB"};
}
${"server_{$type}_Ignore_DB"} = explode(
",", $server_slave_replication[0]["Replicate_Ignore_DB"]
);
$replication_info[$type]['Ignore_DB'] = ${"server_{$type}_Ignore_DB"};
${"server_{$type}_Do_Table"} = explode(
",", $server_slave_replication[0]["Replicate_Do_Table"]
);
$replication_info[$type]['Do_Table'] = ${"server_{$type}_Do_Table"};
${"server_{$type}_Ignore_Table"} = explode(
",", $server_slave_replication[0]["Replicate_Ignore_Table"]
);
$replication_info[$type]['Ignore_Table']
= ${"server_{$type}_Ignore_Table"};
${"server_{$type}_Wild_Do_Table"} = explode(
",", $server_slave_replication[0]["Replicate_Wild_Do_Table"]
);
$replication_info[$type]['Wild_Do_Table']
= ${"server_{$type}_Wild_Do_Table"};
${"server_{$type}_Wild_Ignore_Table"} = explode(
",", $server_slave_replication[0]["Replicate_Wild_Ignore_Table"]
);
$replication_info[$type]['Wild_Ignore_Table']
= ${"server_{$type}_Wild_Ignore_Table"};
}
}
}
/**
* Extracts database or table name from string
*
* @param string $string contains "dbname.tablename"
* @param string $what what to extract (db|table)
*
* @return $string the extracted part
*/
function PMA_extractDbOrTable($string, $what = 'db')
{
$list = explode(".", $string);
if ('db' == $what) {
return $list[0];
} else {
return $list[1];
}
}
/**
* Configures replication slave
*
* @param string $action possible values: START or STOP
* @param string $control default: null,
* possible values: SQL_THREAD or IO_THREAD or null.
* If it is set to null, it controls both
* SQL_THREAD and IO_THREAD
* @param mixed $link mysql link
*
* @return mixed output of DatabaseInterface::tryQuery
*/
function PMA_Replication_Slave_control($action, $control = null, $link = null)
{
$action = strtoupper($action);
$control = strtoupper($control);
if ($action != "START" && $action != "STOP") {
return -1;
}
if ($control != "SQL_THREAD" && $control != "IO_THREAD" && $control != null) {
return -1;
}
return $GLOBALS['dbi']->tryQuery($action . " SLAVE " . $control . ";", $link);
}
/**
* Changes master for replication slave
*
* @param string $user replication user on master
* @param string $password password for the user
* @param string $host master's hostname or IP
* @param int $port port, where mysql is running
* @param array $pos position of mysql replication,
* array should contain fields File and Position
* @param bool $stop shall we stop slave?
* @param bool $start shall we start slave?
* @param mixed $link mysql link
*
* @return string output of CHANGE MASTER mysql command
*/
function PMA_Replication_Slave_changeMaster($user, $password, $host, $port,
$pos, $stop = true, $start = true, $link = null
) {
if ($stop) {
PMA_Replication_Slave_control("STOP", null, $link);
}
$out = $GLOBALS['dbi']->tryQuery(
'CHANGE MASTER TO ' .
'MASTER_HOST=\'' . $host . '\',' .
'MASTER_PORT=' . ($port * 1) . ',' .
'MASTER_USER=\'' . $user . '\',' .
'MASTER_PASSWORD=\'' . $password . '\',' .
'MASTER_LOG_FILE=\'' . $pos["File"] . '\',' .
'MASTER_LOG_POS=' . $pos["Position"] . ';', $link
);
if ($start) {
PMA_Replication_Slave_control("START", null, $link);
}
return $out;
}
/**
* This function provides connection to remote mysql server
*
* @param string $user mysql username
* @param string $password password for the user
* @param string $host mysql server's hostname or IP
* @param int $port mysql remote port
* @param string $socket path to unix socket
*
* @return mixed $link mysql link on success
*/
function PMA_Replication_connectToMaster(
$user, $password, $host = null, $port = null, $socket = null
) {
$server = array();
$server["host"] = $host;
$server["port"] = $port;
$server["socket"] = $socket;
// 5th parameter set to true means that it's an auxiliary connection
// and we must not go back to login page if it fails
return $GLOBALS['dbi']->connect($user, $password, false, $server, true);
}
/**
* Fetches position and file of current binary log on master
*
* @param mixed $link mysql link
*
* @return array an array containing File and Position in MySQL replication
* on master server, useful for PMA_Replication_Slave_changeMaster
*/
function PMA_Replication_Slave_binLogMaster($link = null)
{
$data = $GLOBALS['dbi']->fetchResult('SHOW MASTER STATUS', null, null, $link);
$output = array();
if (! empty($data)) {
$output["File"] = $data[0]["File"];
$output["Position"] = $data[0]["Position"];
}
return $output;
}
?>
|