Replication support - tomas_zahra branch merged

This commit is contained in:
Tomas Srnka
2009-08-30 14:54:36 +00:00
parent e354f4ea98
commit feb562e77b
11 changed files with 1210 additions and 156 deletions

View File

@@ -42,6 +42,8 @@ if (empty($is_info)) {
// Gets the database structure // Gets the database structure
$sub_part = '_structure'; $sub_part = '_structure';
require './libraries/db_info.inc.php'; require './libraries/db_info.inc.php';
require_once './libraries/replication.inc.php';
} }
// 1. No tables // 1. No tables
@@ -134,7 +136,7 @@ PMA_listNavigator($total_num_tables, $pos, $_url_params, 'db_structure.php', 'fr
<?php <?php
echo PMA_generate_common_hidden_inputs($db); echo PMA_generate_common_hidden_inputs($db);
PMA_TableHeader($db_is_information_schema); PMA_TableHeader($db_is_information_schema, $server_slave_status);
$i = $sum_entries = 0; $i = $sum_entries = 0;
$sum_size = (double) 0; $sum_size = (double) 0;
@@ -330,8 +332,36 @@ foreach ($tables as $keyname => $each_table) {
</tbody> </tbody>
</table> </table>
<?php <?php
PMA_TableHeader(); PMA_TableHeader(false, $server_slave_status);
} }
$ignored = false;
$do = false;
if ($server_slave_status) {
////////////////////////////////////////////////////////////////
if ((strlen(array_search($truename, $server_slave_Do_Table))>0) || (strlen(array_search($db, $server_slave_Do_DB))>0) || (count($server_slave_Do_DB)==1 && count($server_slave_Ignore_DB)==1)) {
$do = true;
}
foreach ($server_slave_Wild_Do_Table as $table) {
if (($db == PMA_replication_strout($table)) && (ereg("^".substr(PMA_replication_strout($table, true), 0, strlen(PMA_replication_strout($table, true))-1), $truename)))
$do = true;
}
////////////////////////////////////////////////////////////////////
if ((strlen(array_search($truename, $server_slave_Ignore_Table))>0) || (strlen(array_search($db, $server_slave_Ignore_DB))>0)) {
$ignored = true;
}
foreach ($server_slave_Wild_Ignore_Table as $table) {
if (($db == PMA_replication_strout($table)) && (ereg("^".substr(PMA_replication_strout($table, true), 0, strlen(PMA_replication_strout($table, true))-1), $truename)))
$ignored = true;
}
}/* elseif ($server_master_status) {
if ((strlen(array_search($db, $server_master_Do_DB))>0) || count($server_master_Do_DB)==1)
$do = true;
elseif ((strlen(array_search($db, $server_master_Ignore_DB))>0) || count($server_master_Ignore_DB)==1)
$ignored = true;
}*/
?> ?>
<tr class="<?php echo $odd_row ? 'odd' : 'even'; $odd_row = ! $odd_row; ?>"> <tr class="<?php echo $odd_row ? 'odd' : 'even'; $odd_row = ! $odd_row; ?>">
<td align="center"> <td align="center">
@@ -339,9 +369,9 @@ foreach ($tables as $keyname => $each_table) {
value="<?php echo $each_table['TABLE_NAME']; ?>" value="<?php echo $each_table['TABLE_NAME']; ?>"
id="checkbox_tbl_<?php echo $i; ?>"<?php echo $checked; ?> /></td> id="checkbox_tbl_<?php echo $i; ?>"<?php echo $checked; ?> /></td>
<th><label for="checkbox_tbl_<?php echo $i; ?>" <th><label for="checkbox_tbl_<?php echo $i; ?>"
title="<?php echo $alias; ?>"><?php echo $truename; ?></label> title="<?php echo $alias; ?>" style="<?php echo $ignored ? ' ignored' : ''; ?>"><?php echo $truename; ?></label>
<label><?php echo $tracking_icon; ?> </label>
</th> </th>
<?php if ($server_slave_status) { ?><td align="center"><?php echo $ignored ? ' <img class="icon" src="' . $pmaThemeImage . 's_cancel.png" width="16" height="16" alt="REPLICATED" />' : ''. $do ? ' <img class="icon" src="' . $pmaThemeImage . 's_success.png" width="16" height="16" alt="REPLICATED" />' : ''; ?></td><?php } ?>
<td align="center"><?php echo $browse_table; ?></td> <td align="center"><?php echo $browse_table; ?></td>
<td align="center"> <td align="center">
<a href="tbl_structure.php?<?php echo $tbl_url_query; ?>"> <a href="tbl_structure.php?<?php echo $tbl_url_query; ?>">

View File

@@ -1569,4 +1569,50 @@ $strYes = 'Yes';
$strZeroRemovesTheLimit = 'Note: Setting these options to 0 (zero) removes the limit.'; $strZeroRemovesTheLimit = 'Note: Setting these options to 0 (zero) removes the limit.';
$strZip = '"zipped"'; $strZip = '"zipped"';
///////// NEW STRINGS
$strReplcationSelectDatabases = 'Please select databases:';
$strReplcationSynchronize = 'Synchronize databases with master';
$strReplicationAddLines = 'Now, add following lines at the end of your my.cnf and please restart the mysql server afterwards.';
$strReplicationAddSlaveUser = 'Add slave replication user?';
$strReplicationChangedSuccesfully = 'Master server changed succesfully to %s';
$strReplicationConfiguredMaster = 'This server is configured as master in replication process.';
$strReplicationControlSlave = 'Control slave:';
$strReplicationMaster = 'Master Replication';
$strReplicationMasterChooseAll = 'Replicate all databases; Ignore:';
$strReplicationMasterChooseIgn = 'Ignore all databases; Replicate:';
$strReplicationMasterChooseMode = 'This server is not configured as master server in replication process. You can choose from either replicating all databases and ignoring certain (useful if you want to replicate majority of databases) or you can choose to ignore all databases by default and allow only certain databases to be replicated. Please select the mode:';
$strReplicationMasterConfiguration = 'Master Configuration';
$strReplicationRestartServer = 'Once you restarted MySQL server, please click on Go button. Afterwards, you should see a message informating you, that this server <b>is</b> configured as master';
$strReplicationServernConfiguredMaster = 'This server is not configured as master in replication process. Would you like to <a href="%s">configure</a> it?';
$strReplicationShowMasterStatus = 'Show master status';
$strReplicationSkippingErrorWarn = 'Skiping error(s) might lead into unsynchronized master and slave!';
$strReplicationSlave = 'Slave Replication';
$strReplicationSlaveChangeMaster = 'Change or reconfigure master server';
$strReplicationSlaveConfigured = 'Server is configured as slave in replication process. Would you like to:';
$strReplicationSlaveNotConfigured = 'This server is not configured as slave in replication process. Would you like to <a href="%s">configure</a> it?';
$strReplicationSlaveErrorManagement = 'Error management:';
$strReplicationSlaveIOThread = 'IO Thread %s only';
$strReplicationSlaveReset = 'Reset Slave';
$strReplicationSlaveSQLThread = 'SQL Thread %s only';
$strReplicationSlaveSeeStatus = 'See slave status table';
$strReplicationSlaveSkipCurrentError = 'Skip current error';
$strReplicationSlaveSkipNext = 'Skip next';
$strReplicationSlaveSkipNextErrors = 'errors.';
$strReplicationStatus = 'Replication status';
$strPort = 'Port';
$strFull = 'Full';
$strStop = 'Stop';
$strStart ='Start';
$strShowMasterStatus = 'Show master status';
$strSlaveConfigure = 'Make sure, you have unique server-id in your configuration file (my.cnf). If not, please add following line into [mysqld] section:';
$strDataSyn = 'Data Synchronization';
$strStructureSyn = 'Structure Synchronization';
$strSynchronizationNote='Target database will completely synchronize with source database.Source database will remain unchanged.';
$strSynchronize = 'Synchronize';
$strSynchronizeDb= 'Synchronize Databases';
$strReplicationUnknownError = 'Unknown error';
$strReplicationUnableToChange = 'Unable to change master';
?> ?>

View File

@@ -28,8 +28,9 @@ if (! defined('PHPMYADMIN')) {
* @uses $GLOBALS['structure_tbl_col_cnt'] * @uses $GLOBALS['structure_tbl_col_cnt']
* @uses PMA_SortableTableHeader() * @uses PMA_SortableTableHeader()
* @param boolean $db_is_information_schema * @param boolean $db_is_information_schema
* @param boolean $replication
*/ */
function PMA_TableHeader($db_is_information_schema = false) function PMA_TableHeader($db_is_information_schema = false, $replication = false)
{ {
$cnt = 0; // Let's count the columns... $cnt = 0; // Let's count the columns...
@@ -42,8 +43,13 @@ function PMA_TableHeader($db_is_information_schema = false)
echo '<table class="data" style="float: left;">' . "\n" echo '<table class="data" style="float: left;">' . "\n"
.'<thead>' . "\n" .'<thead>' . "\n"
.'<tr><th></th>' . "\n" .'<tr><th></th>' . "\n"
.' <th>' . PMA_SortableTableHeader($GLOBALS['strTable'], 'table') . '</th>' . "\n" .' <th>' . PMA_SortableTableHeader($GLOBALS['strTable'], 'table') . '</th>' . "\n";
.' <th colspan="' . $action_colspan . '">' . "\n" if ($replication) {
echo ' <th>' . "\n"
.' ' . "Replication" . "\n"
.' </th>';
}
echo ' <th colspan="' . $action_colspan . '">' . "\n"
.' ' . $GLOBALS['strAction'] . "\n" .' ' . $GLOBALS['strAction'] . "\n"
.' </th>' .' </th>'
// larger values are more interesting so default sort order is DESC // larger values are more interesting so default sort order is DESC

View File

@@ -0,0 +1,372 @@
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
*
* @version $Id: replication.inc.php 12506 2009-05-27 17:36:57Z lem9 $
* @package phpMyAdmin
*/
if (! defined('PHPMYADMIN')) {
exit;
}
/**
* get master replication from server
*/
$server_master_replication = PMA_DBI_fetch_result('SHOW MASTER STATUS');
/**
* get slave replication from server
*/
$server_slave_replication = PMA_DBI_fetch_result('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
*/
$slave_variables_alerts = array(
'Slave_IO_Running' => 'No',
'Slave_SQL_Running' => 'No'
);
$slave_variables_oks = array(
'Slave_IO_Running' => 'Yes',
'Slave_SQL_Running' => 'Yes'
);
$serverid = time();
// check which replication is available and set $server_{master/slave}_status and assign values
foreach ($replication_types as $type) {
if (count(${"server_{$type}_replication"}) > 0)
${"server_{$type}_status"} = true;
else
${"server_{$type}_status"} = false;
if (${"server_{$type}_status"}) {
if ($type=="master") {
${"server_{$type}_Do_DB"} = split (",", $server_master_replication[0]["Binlog_Do_DB"]);
${"server_{$type}_Ignore_DB"} = split (",", $server_master_replication[0]["Binlog_Ignore_DB"]);
} elseif ($type=="slave") {
${"server_{$type}_Do_DB"} = split (",", $server_slave_replication[0]["Replicate_Do_DB"]);
${"server_{$type}_Ignore_DB"} = split (",", $server_slave_replication[0]["Replicate_Ignore_DB"]);
${"server_{$type}_Do_Table"} = split (",", $server_slave_replication[0]["Replicate_Do_Table"]);
${"server_{$type}_Ignore_Table"} = split (",", $server_slave_replication[0]["Replicate_Ignore_Table"]);
${"server_{$type}_Wild_Do_Table"} = split(",", $server_slave_replication[0]["Replicate_Wild_Do_Table"]);
${"server_{$type}_Wild_Ignore_Table"} = split(",", $server_slave_replication[0]["Replicate_Wild_Ignore_Table"]);
}
}
}
/**
* @param $string -
* @param $table -
* @return
*/
function PMA_replication_strout($string, $table=false) {
$list = explode(".", $string);
return $list[(int)$table];
}
/**
* @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 PMA_DBI_try_query
*/
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 PMA_DBI_try_query($action." SLAVE ".$control.";", $link);
}
/**
* @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 boolean $stop - shall we stop slave?
* @param boolean $start - shall we start slave?
* @param mixed $link - mysql link
*
* @return output of CHANGE MASTER mysql command
*/
function PMA_replication_slave_change_master($user, $password, $host, $port, $pos, $stop=true, $start=true, $link=null)
{
if ($stop)
PMA_replication_slave_control("STOP", null, $link);
$out = PMA_DBI_try_query('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_connect_to_master($user, $password, $host=null, $port=null, $socket=null)
{
$server = array();
$server["host"] = $host;
$server["port"] = $port;
$server["socket"] = $socket;
return PMA_DBI_connect($user, $password, false, $server);
}
/**
* @param $link - mysql link
*
* @return array - containing File and Position in MySQL replication on master server, useful for PMA_replication_slave_change_master
*/
function PMA_replication_slave_bin_log_master($link=null)
{
$data = PMA_DBI_fetch_result('SHOW MASTER STATUS', null, null, $link);
$output = array();
$output["File"] = $data[0]["File"];
$output["Position"] = $data[0]["Position"];
return $output;
}
/**
* Get list of replicated databases on master server
*
* @param mixed mysql link
*
* @return array array of replicated databases
*/
function PMA_replication_master_replicated_dbs($link=null)
{
$data = PMA_DBI_fetch_result('SHOW MASTER STATUS', null, null, $link); // let's find out, which databases are replicated
$do_db = array();
$ignore_db = array();
if (!empty($data[0]['Binlog_Do_DB']))
$do_db = explode($data[0]['Binlog_Do_DB'], ',');
if (!empty($data[0]['Binlog_Ignore_DB']))
$ignore_db = explode($data[0]['Binlog_Ignore_DB'], ',');
$tmp_alldbs = PMA_DBI_query('SHOW DATABASES;', $link);
while ($tmp_row = PMA_DBI_fetch_row($tmp_alldbs)) {
if ($tmp_row[0] == 'information_schema')
continue;
if (count($do_db)==0) {
if (array_search($tmp_row[0], $ignore_db)!==false) {
continue;
}
$dblist[] = $tmp_row[0];
} else {
if (array_search($tmp_row[0], $do_db)!==false) {
$dblist[] = $tmp_row[0];
}
}
} // end while
return $link;
}
/**
* This function provides synchronization of structure and data between two mysql servers.
* TODO: improve code sharing between the function and synchronization
*
* @param String $db - name of database, which should be synchronized
* @param mixed $src_link - link of source server, note: if the server is current PMA server, use null
* @param mixed $trg_link - link of target server, note: if the server is current PMA server, use null
* @param boolean $data - if true, then data will be copied as well
*/
function PMA_replication_synchronize_DB($db, $src_link, $trg_link, $data=true)
{
$src_db = $db;
$trg_db = $db;
$src_connection = PMA_DBI_select_db($db, $src_link);
$trg_connection = PMA_DBI_select_db($db, $trg_link);
$src_tables = PMA_DBI_get_tables($src_db, $src_link);
$source_tables_num = sizeof($src_tables);
$trg_tables = PMA_DBI_get_tables($trg_db, $trg_link);
$target_tables_num = sizeof($trg_tables);
/**
* initializing arrays to save table names
*/
$unmatched_num_src = 0;
$source_tables_uncommon = array();
$unmatched_num_trg = 0;
$target_tables_uncommon = array();
$matching_tables = array();
$matching_tables_num = 0;
/**
* Criterion for matching tables is just their names.
* Finding the uncommon tables for the source database
* BY comparing the matching tables with all the tables in the source database
*/
PMA_getMatchingTables($trg_tables, $src_tables, $matching_tables, $source_tables_uncommon);
/**
* Finding the uncommon tables for the target database
* BY comparing the matching tables with all the tables in the target database
*/
PMA_getNonMatchingTargetTables($trg_tables, $matching_tables, $target_tables_uncommon);
/**
*
* ********************************************* Comparing Data In the Matching Tables ******************************************
* *********************It is assumed that the matching tables are structurally and typely exactly the same *********************
*/
$fields_num = array();
$matching_tables_fields = array();
$matching_tables_keys = array();
$insert_array = array(array(array()));
$update_array = array(array(array()));
$delete_array = array();
$row_count = array();
$uncommon_tables_fields = array();
$matching_tables_num = sizeof($matching_tables);
for($i=0; $i< sizeof($matching_tables); $i++)
{
PMA_dataDiffInTables($src_db, $trg_db, $src_link, $trg_link, $matching_tables, $matching_tables_fields, $update_array, $insert_array,
$delete_array, $fields_num, $i, $matching_tables_keys);
}
for($j=0; $j< sizeof($source_tables_uncommon); $j++)
{
PMA_dataDiffInUncommonTables($source_tables_uncommon, $src_db, $src_link, $j, $row_count);
}
/**
* INTEGRATION OF STRUCTURE DIFFERENCE CODE
*
*/
$source_columns = array();
$target_columns = array();
$alter_str_array = array(array());
$add_column_array = array(array());
$uncommon_columns = array();
$target_tables_keys = array();
$source_indexes = array();
$target_indexes = array();
$add_indexes_array = array();
$remove_indexes_array = array();
$criteria = array('Field', 'Type', 'Null', 'Collation', 'Key', 'Default', 'Comment');
for ($counter= 0; $counter< $matching_tables_num; $counter++)
{
// PMA_structureDiffInTables($src_db, $trg_db, $src_link, $trg_link, $matching_tables, $source_columns,
// $target_columns, $alter_str_array, $add_column_array, $uncommon_columns, $criteria, $matching_tables_keys,
// $target_tables_keys, $matching_tables_fields, $counter);
//
// PMA_indexesDiffInTables($src_db, $trg_db, $src_link, $trg_link, $matching_tables, $source_indexes, $target_indexes,
// $add_indexes_array, $remove_indexes_array, $counter);
PMA_structureDiffInTables($src_db, $trg_db, $src_link, $trg_link, $matching_tables, $source_columns,
$target_columns, $alter_str_array, $add_column_array, $uncommon_columns, $criteria, $target_tables_keys, $counter);
PMA_indexesDiffInTables($src_db, $trg_db, $src_link, $trg_link, $matching_tables, $source_indexes, $target_indexes,
$add_indexes_array, $alter_indexes_array,$remove_indexes_array, $counter);
}
$matching_table_data_diff = array();
$matching_table_structure_diff = array();
$uncommon_table_structure_diff = array();
$uncommon_table_data_diff = array();
$uncommon_tables = $source_tables_uncommon;
/**
* Generating Create Table query for all the non-matching tables present in Source but not in Target and populating tables.
*/
for($q=0; $q < sizeof($source_tables_uncommon) ;$q++)
{
if (isset($uncommon_tables[$q])) {
PMA_createTargetTables($src_db, $trg_db, $src_link, $trg_link, $source_tables_uncommon, $q, $uncommon_tables_fields, false);
}
if (isset($row_count[$q]) && $data) {
PMA_populateTargetTables($src_db, $trg_db, $src_link, $trg_link, $source_tables_uncommon, $q, $uncommon_tables_fields, false);
}
}
}
?>

View File

@@ -0,0 +1,189 @@
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
*
* @version $Id: replication_gui.lib.php 12533 2009-06-02 16:53:44Z lem9 $
* @package phpMyAdmin
*/
if (! defined('PHPMYADMIN')) {
exit;
}
$jscode['master_replication'] = 'divShowHideFunc(\'master_status_href\', \'replication_master_section\');'."\n";
$jscode['configure_master'] =
'var c_output = "";'."\n".
'var c_text = "server-id='.$serverid.'<br />log-bin=mysql-bin<br />log-error=mysql-bin.err<br />";'."\n".
'var c_ignore = "binlog_ignore_db=";'."\n".
'var c_do = "binlog_do_db=";'."\n".
'$(\'db_reset_href\').addEvent(\'click\', function() {'."\n".
' $(\'db_select\').getSelected().each(function(el) {'."\n".
' el.selected = false;'."\n".
' });'."\n".
' $(\'rep\').set(\'html\', c_text);'."\n".
'});'."\n".
'$(\'db_type\').addEvent(\'change\',function() {'."\n".
' if ($(\'db_type\').getSelected().get(\'value\')=="all")'."\n".
' $(\'rep\').set(\'html\', c_text+c_ignore+c_output+\';\');'."\n".
' else'."\n".
' $(\'rep\').set(\'html\', c_text+c_do+c_output+\';\');'."\n".
'});'."\n".
'$(\'db_select\').addEvent(\'change\',function() {'."\n".
' var count = 0;'."\n".
' $(\'db_select\').getSelected().each(function(el) { '."\n".
' if (count==0)'."\n".
' c_output = el.get(\'value\');'."\n".
' else'."\n".
' c_output = c_output + \',\' +el.get(\'value\');'."\n".
' count=count+1;'."\n".
' if ($(\'db_select\').getSelected().length==count) {'."\n".
' if ($(\'db_type\').getSelected().get(\'value\')=="all")'."\n".
' $(\'rep\').set(\'html\', c_text+c_ignore+c_output);'."\n".
' else'."\n".
' $(\'rep\').set(\'html\', c_text+c_do+c_output);'."\n".
' count = 0;'."\n".
' }'."\n".
' });'."\n".
'});'."\n";
$jscode['slave_control'] =
'divShowHideFunc(\'slave_status_href\', \'replication_slave_section\');'."\n".
'divShowHideFunc(\'slave_control_href\', \'slave_control_gui\');'."\n".
'divShowHideFunc(\'slave_errormanagement_href\',\'slave_errormanagement_gui\'); '."\n";
$jscode['slave_control_sync'] =
'divShowHideFunc(\'slave_synchronization_href\', \'slave_synchronization_gui\');'."\n";
/**
* returns code for selecting databases
*
* @return String HTML code
*/
function PMA_replication_db_multibox()
{
$multi_values = '';
$multi_values .= '<select name="db_select[]" size="6" multiple="multiple" id="db_select">';
$multi_values .= "\n";
foreach ($GLOBALS['pma']->databases as $current_db) {
if (!empty($selectall) || (isset($tmp_select) && strpos(' ' . $tmp_select, '|' . $current_db . '|'))) {
$is_selected = ' selected="selected"';
} else {
$is_selected = '';
}
$current_db = htmlspecialchars($current_db);
$multi_values .= ' <option value="' . $current_db . '" ' . $is_selected . '>' . $current_db . '</option>' . "\n";
} // end while
$multi_values .= "\n";
$multi_values .= '</select>';
$multi_values .= '<br /><a href="#" id="db_reset_href">Uncheck all</a>';
return $multi_values;
}
/**
* prints out code for changing master
*
* @param String $submitname - submit button name
*/
function PMA_replication_gui_changemaster($submitname) {
global $username_length;
global $hostname_length;
echo '<form method="post" action="server_replication.php">'."\n";
echo PMA_generate_common_hidden_inputs('', '');
echo ' <fieldset id="fieldset_add_user_login">'."\n";
echo ' <legend>Slave configuration - change master server</legend>'."\n";
echo $GLOBALS['strSlaveConfigure'].'<br />'."\n";
echo '<pre>server-id='.time().'</pre>'."\n";
echo ' <div class="item">'."\n";
echo ' <label for="select_pred_username">'. $GLOBALS['strUserName'].':</label>'."\n";
echo ' <input type="text" name="username" maxlength="'. $username_length .'" title="'. $GLOBALS['strUserName'] .'" onchange="pred_username.value = \'userdefined\';" />'."\n";
echo ' </div>'."\n";
echo ' <div class="item">'."\n";
echo ' <label for="select_pred_password">'. $GLOBALS['strPassword'] .' :</label>'."\n";
echo ' <input type="password" id="text_pma_pw" name="pma_pw" title="'. $GLOBALS['strPassword'] .'" onchange="pred_password.value = \'userdefined\';" />'."\n";
echo ' </div>'."\n";
echo ' <div class="item">'."\n";
echo ' <label for="select_pred_hostname">'.$GLOBALS['strHost'].' :</label>'."\n";
echo ' <input type="text" name="hostname" maxlength="'. $hostname_length .'" value="" />'."\n";
echo ' </div>'."\n";
echo ' <div class="item">'."\n";
echo ' <label for="select_pred_hostname">'.$GLOBALS['strPort'].':</label>'."\n";
echo ' <input type="text" name="port" maxlength="6" value="3306" />'."\n";
echo ' </div>'."\n";
echo ' </fieldset>'."\n";
echo ' <fieldset id="fieldset_user_privtable_footer" class="tblFooters">'."\n";
echo ' <input type="hidden" name="sr_take_action" value="true" />'."\n";
echo ' <input type="submit" name="'.$submitname.'" id="confslave_submit" value="'. $GLOBALS['strGo'] .'" />'."\n";
echo ' </fieldset>'."\n";
echo '</form>'."\n";
}
/**
* This function prints out table with replication status.
*
* @param String type - either master or slave
* @param boolean $hidden - if true, then default style is set to hidden, default value false
* @param boolen $title - if true, then title is displayed, default true
*/
function PMA_replication_print_status_table ($type, $hidden=false, $title=true) {
global ${"{$type}_variables"};
global ${"{$type}_variables_alerts"};
global ${"{$type}_variables_oks"};
global ${"server_{$type}_replication"};
global ${"strReplicationStatus_{$type}"};
echo '<div id="replication_'. $type .'_section" style="'. ($hidden ? 'display: none' : '') .'"> '."\n";
if ($title) {
echo '<h4><a name="replication_'. $type .'"></a>'.${"strReplicationStatus_{$type}"} .'</h4>'."\n";
} else {
echo '<br />'."\n";
}
echo ' <table id="server'. $type .'replicationsummary" class="data"> '."\n";
echo ' <thead>'."\n";
echo ' <tr>'."\n";
echo ' <th>'. $GLOBALS['strVar'] .'</th>'."\n";
echo ' <th>'. $GLOBALS['strValue'] .'</th>'."\n";
echo ' </tr>'."\n";
echo ' </thead>'."\n";
echo ' <tbody>'."\n";
$odd_row = true;
foreach(${"{$type}_variables"} as $variable) {
echo ' <tr class="'. ($odd_row ? 'odd' : 'even') .'">'."\n";
echo ' <td class="name">'."\n";
echo $variable."\n";
echo ' </td>'."\n";
echo ' <td class="value">'."\n";
if (isset(${"{$type}_variables_alerts"}[$variable]) && ${"{$type}_variables_alerts"}[$variable] == ${"server_{$type}_replication"}[0][$variable])
echo '<span class="attention">'."\n";
if (isset(${"{$type}_variables_oks"}[$variable]) && ${"{$type}_variables_oks"}[$variable] == ${"server_{$type}_replication"}[0][$variable])
echo '<span class="allfine">'."\n";
else
echo '<span>'."\n";
echo ${"server_{$type}_replication"}[0][$variable];
echo '</span>'."\n";
echo ' </td>'."\n";
echo ' </tr>'."\n";
$odd_row = !$odd_row;
}
echo ' </tbody>'."\n";
echo ' </table>'."\n";
echo ' <br />'."\n";
echo '</div>'."\n";
}
?>

View File

@@ -64,6 +64,10 @@ if ($is_superuser) {
$tabs['rights']['icon'] = 's_rights.png'; $tabs['rights']['icon'] = 's_rights.png';
$tabs['rights']['link'] = 'server_privileges.php'; $tabs['rights']['link'] = 'server_privileges.php';
$tabs['rights']['text'] = $strPrivileges; $tabs['rights']['text'] = $strPrivileges;
$tabs['replication']['icon'] = 's_replication.png';
$tabs['replication']['link'] = 'server_replication.php';
$tabs['replication']['text'] = "Replication";
} }
if (! empty($binary_logs)) { if (! empty($binary_logs)) {

View File

@@ -14,6 +14,7 @@ require_once './libraries/common.inc.php';
$GLOBALS['js_include'][] = 'functions.js'; $GLOBALS['js_include'][] = 'functions.js';
require './libraries/server_common.inc.php'; require './libraries/server_common.inc.php';
require './libraries/replication.inc.php';
/** /**
* avoids 'undefined index' errors * avoids 'undefined index' errors
@@ -34,7 +35,7 @@ if (isset($_REQUEST['sort_order'])
$dbstats = empty($_REQUEST['dbstats']) ? 0 : 1; $dbstats = empty($_REQUEST['dbstats']) ? 0 : 1;
$pos = empty($_REQUEST['pos']) ? 0 : (int) $_REQUEST['pos']; $pos = empty($_REQUEST['pos']) ? 0 : (int) $_REQUEST['pos'];
/** /**
* Drops multiple databases * Drops multiple databases
*/ */
@@ -187,6 +188,17 @@ if ($databases_count > 0) {
.' </a></th>' . "\n"; .' </a></th>' . "\n";
} }
} }
foreach ($replication_types as $type)
{
if ($type=="master")
$name = "strReplicationMaster";
elseif($type == "slave")
$name = "strReplicationSlave";
if (${"server_{$type}_status"})
echo ' <th>'.$GLOBALS[$name].'</th>' . "\n";
}
if ($is_superuser) { if ($is_superuser) {
echo ' <th>' . ($cfg['PropertiesIconic'] ? '' : $strAction) . "\n" echo ' <th>' . ($cfg['PropertiesIconic'] ? '' : $strAction) . "\n"
. ' </th>' . "\n"; . ' </th>' . "\n";
@@ -247,7 +259,25 @@ if ($databases_count > 0) {
} }
} }
} }
foreach ($replication_types as $type) {
if (${"server_{$type}_status"}) {
echo '<td class="tool" style="text-align: center;">' . "\n";
if (strlen(array_search($current["SCHEMA_NAME"], ${"server_{$type}_Ignore_DB"}))>0) {
echo '<img class="icon" src="' . $pmaThemeImage . 's_cancel.png" width="16" height="16" alt="REPLICATED" />' . "\n";
} else {
$key = array_search($current["SCHEMA_NAME"], ${"server_{$type}_Do_DB"});
if (strlen($key)>0 || (${"server_{$type}_Do_DB"}[0]=="" && count(${"server_{$type}_Do_DB"})==1)) // if ($key != null) did not work for index "0"
echo '<img class="icon" src="' . $pmaThemeImage . 's_success.png" width="16" height="16" alt="REPLICATED" />' . "\n";
else
echo '';
}
echo '</td>';
}
}
if ($is_superuser) { if ($is_superuser) {
echo ' <td class="tool">' . "\n" echo ' <td class="tool">' . "\n"
. ' <a onclick="' . ' <a onclick="'
@@ -294,6 +324,13 @@ if ($databases_count > 0) {
} }
} }
} }
foreach ($replication_types as $type)
{
if (${"server_{$type}_status"})
echo ' <th></th>' . "\n";
}
if ($is_superuser) { if ($is_superuser) {
echo ' <th></th>' . "\n"; echo ' <th></th>' . "\n";
} }

489
server_replication.php Normal file
View File

@@ -0,0 +1,489 @@
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
*
* @version $Id: replication.php 12533 2009-06-02 16:53:44Z lem9 $
* @package phpMyAdmin
*/
/**
*
*/
require_once './libraries/common.inc.php';
/**
* Does the common work
*/
$GLOBALS['js_include'][] = 'server_privileges.js';
$GLOBALS['js_include'][] = 'functions.js';
$GLOBALS['js_include'][] = 'mootools.js';
$GLOBALS['js_include'][] = 'mootools_common.js';
require './libraries/server_common.inc.php';
require './libraries/replication.inc.php';
require './libraries/replication_gui.lib.php';
require_once './libraries/server_synchronize.lib.php';
/**
* Checks if the user is allowed to do what he tries to...
*/
if (!$is_superuser) {
require './libraries/server_links.inc.php';
echo '<h2>' . "\n"
. PMA_getIcon('s_replication.png')
. $GLOBALS['strReplication'] . "\n"
. '</h2>' . "\n";
PMA_Message::error('strNoPrivileges')->display();
require_once './libraries/footer.inc.php';
}
/**
* Handling control requests
*/
if (isset($GLOBALS['sr_take_action'])) {
$refresh = false;
if (isset($GLOBALS['slave_chagemaster'])) {
$_SESSION['replication']['m_username'] = $sr['username'] = PMA_sqlAddslashes($GLOBALS['username']);
$_SESSION['replication']['m_password'] = $sr['pma_pw'] = PMA_sqlAddslashes($GLOBALS['pma_pw']);
$_SESSION['replication']['m_hostname'] = $sr['hostname'] = PMA_sqlAddslashes($GLOBALS['hostname']);
$_SESSION['replication']['m_port'] = $sr['port'] = PMA_sqlAddslashes($GLOBALS['port']);
$_SESSION['replication']['m_correct'] = '';
$_SESSION['replication']['sr_action_status'] = 'error';
$_SESSION['replication']['sr_action_info'] = $strReplicationUnknownError;
$url = $sr['hostname'];
if ($sr['port']!='')
$url .= ':'.$sr['port'];
$check_master = null;
error_reporting(0);
$check_master = @mysql_connect($url, $sr['username'], $sr['pma_pw']);
error_reporting(15);
unset($url);
if (!$check_master) {
$_SESSION['replication']['sr_action_status'] = 'error';
$_SESSION['replication']['sr_action_info'] = 'Unable to connect to master '. $sr['hostname'] .'. ';
} else {
$link_to_master = PMA_replication_connect_to_master($sr['username'], $sr['pma_pw'], $sr['hostname'], $sr['port']);
$position = PMA_replication_slave_bin_log_master($link_to_master);
$_SESSION['replication']['m_correct'] = true;
if (PMA_replication_slave_change_master($sr['username'], $sr['pma_pw'], $sr['hostname'], $sr['port'], $position, true, false)) {
$_SESSION['replication']['sr_action_status'] = 'error';
$_SESSION['replication']['sr_action_info'] = $GLOBALS['strReplicationUnableToChange'];
} else {
$_SESSION['replication']['sr_action_status'] = 'success';
$_SESSION['replication']['sr_action_info'] = sprintf($GLOBALS['strReplicationChangedSuccesfully'], $sr['hostname']);
}
}
} elseif (isset($GLOBALS['sr_slave_server_control'])) {
if ($GLOBALS['sr_slave_action']=='reset') {
PMA_replication_slave_control("STOP");
PMA_DBI_try_query("RESET SLAVE;");
PMA_replication_slave_control("START");
} else {
PMA_replication_slave_control($GLOBALS['sr_slave_action'], $GLOBALS['sr_slave_control_parm']);
}
$refresh = true;
} elseif (isset($GLOBALS['sr_slave_skip_error'])) {
$count = 1;
if (isset($GLOBALS['sr_skip_errors_count'])) {
$count = $GLOBALS['sr_skip_errors_count']*1;
}
PMA_replication_slave_control("STOP");
PMA_DBI_try_query("SET GLOBAL SQL_SLAVE_SKIP_COUNTER = ".$count.";");
PMA_replication_slave_control("START");
} elseif (isset($GLOBALS['sl_sync'])) {
$src_link = PMA_replication_connect_to_master($_SESSION['replication']['m_username'], $_SESSION['replication']['m_password'], $_SESSION['replication']['m_hostname'], $_SESSION['replication']['m_port']);
$trg_link = null;
$data = PMA_DBI_fetch_result('SHOW MASTER STATUS', null, null, $src_link); // let's find out, which databases are replicated
$do_db = array();
$ignore_db = array();
if (!empty($data[0]['Binlog_Do_DB']))
$do_db = explode($data[0]['Binlog_Do_DB'], ',');
if (!empty($data[0]['Binlog_Ignore_DB']))
$ignore_db = explode($data[0]['Binlog_Ignore_DB'], ',');
$tmp_alldbs = PMA_DBI_query('SHOW DATABASES;', $src_link);
while ($tmp_row = PMA_DBI_fetch_row($tmp_alldbs)) {
if ($tmp_row[0] == 'information_schema')
continue;
if (count($do_db)==0) {
if (array_search($tmp_row[0], $ignore_db)!==false) {
continue;
}
$dblist[] = $tmp_row[0];
PMA_DBI_query('CREATE DATABASE IF NOT EXISTS '.$tmp_row[0], $trg_link);
} else {
if (array_search($tmp_row[0], $do_db)!==false) {
$dblist[] = $tmp_row[0];
PMA_DBI_query('CREATE DATABASE IF NOT EXISTS '.$tmp_row[0], $trg_link);
}
}
} // end while
if (isset($GLOBALS['repl_data']))
$data = true;
else
$data = false;
foreach ($dblist as $db) {
PMA_replication_synchronize_db($db, $src_link, $trg_link, $data);
}
}
if ($refresh)
Header("Location: ". PMA_generate_common_url($GLOBALS['url_params']));
unset($refresh);
}
/**
* Displays the links
*/
require './libraries/server_links.inc.php';
echo '<div id="replication">'."\n";
echo ' <h2>'."\n";
echo ' <img class="icon" src="'. $GLOBALS['pmaThemeImage'] .'s_replication.png" width="16" height="16" alt="" />'."\n";
echo $GLOBALS['strReplication']."\n";
echo ' </h2>'."\n";
if (isset($_SESSION['replication']['sr_action_status']) && isset($_SESSION['replication']['sr_action_info'])) {
if ($_SESSION['replication']['sr_action_status']=='error') {
PMA_Message::error($_SESSION['replication']['sr_action_info'])->display();
$_SESSION['replication']['sr_action_status'] = 'unknown';
} elseif ($_SESSION['replication']['sr_action_status']=='success') {
PMA_Message::success($_SESSION['replication']['sr_action_info'])->display();
$_SESSION['replication']['sr_action_status'] = 'unknown';
}
}
if ($server_master_status) {
if (!isset($GLOBALS['repl_clear_scr'])) {
echo PMA_js_mootools_domready($jscode['master_replication']);
echo '<fieldset>'."\n";
echo '<legend>'. $GLOBALS['strReplicationMaster'] .'</legend>'."\n";
echo $GLOBALS['strReplicationConfiguredMaster']."\n";
echo '<ul>'."\n";
echo ' <li><a href="#" id="master_status_href">'. $GLOBALS['strReplicationShowMasterStatus'] .'</a> </li>';
PMA_replication_print_status_table('master', true, false);
$_url_params = $GLOBALS['url_params'];
$_url_params['mr_adduser'] = true;
$_url_params['repl_clear_scr'] = true;
echo ' <li><a href="'.PMA_generate_common_url($_url_params).'" id="master_addslaveuser_href">'. $GLOBALS['strReplicationAddSlaveUser'] .'</a></li>';
}
if (isset($GLOBALS['mr_adduser'])) {
$fields_info = PMA_DBI_get_fields('mysql', 'user');
$username_length = 16;
$hostname_length = 41;
foreach ($fields_info as $key => $val) {
if ($val['Field'] == 'User') {
strtok($val['Type'], '()');
$v = strtok('()');
if (is_int($v)) {
$username_length = $v;
}
} elseif ($val['Field'] == 'Host') {
strtok($val['Type'], '()');
$v = strtok('()');
if (is_int($v)) {
$hostname_length = $v;
}
}
}
unset($fields_info);
if (isset($GLOBALS['username']) && strlen($GLOBALS['username']) === 0) {
$GLOBALS['pred_username'] = 'any';
}
echo '<div id="master_addslaveuser_gui">'."\n";
echo '<form autocomplete="off" method="post" action="server_privileges.php" onsubmit="return checkAddUser(this);">'."\n";
echo PMA_generate_common_hidden_inputs('', '');
echo '<fieldset id="fieldset_add_user_login">' . "\n"
. '<legend>'.$GLOBALS['strReplicationAddSlaveUser'].'</legend>' . "\n"
. '<input id="checkbox_Repl_slave_priv" type="hidden" title="Needed for the replication slaves." value="Y" name="Repl_slave_priv"/>'. "\n"
. '<input type="hidden" name="sr_take_action" value="true" />'. "\n"
. '<div class="item">' . "\n"
. '<label for="select_pred_username">' . "\n"
. ' ' . $GLOBALS['strUserName'] . ':' . "\n"
. '</label>' . "\n"
. '<span class="options">' . "\n"
. ' <select name="pred_username" id="select_pred_username" title="' . $GLOBALS['strUserName'] . '"' . "\n"
. ' onchange="if (this.value == \'any\') { username.value = \'\'; } else if (this.value == \'userdefined\') { username.focus(); username.select(); }">' . "\n"
. ' <option value="any"' . ((isset($GLOBALS['pred_username']) && $GLOBALS['pred_username'] == 'any') ? ' selected="selected"' : '') . '>' . $GLOBALS['strAnyUser'] . '</option>' . "\n"
. ' <option value="userdefined"' . ((!isset($GLOBALS['pred_username']) || $GLOBALS['pred_username'] == 'userdefined') ? ' selected="selected"' : '') . '>' . $GLOBALS['strUseTextField'] . ':</option>' . "\n"
. ' </select>' . "\n"
. '</span>' . "\n"
. '<input type="text" name="username" maxlength="'
. $username_length . '" title="' . $GLOBALS['strUserName'] . '"'
. (empty($GLOBALS['username'])
? ''
: ' value="' . (isset($GLOBALS['new_username'])
? $GLOBALS['new_username']
: $GLOBALS['username']) . '"')
. ' onchange="pred_username.value = \'userdefined\';" />' . "\n"
. '</div>' . "\n"
. '<div class="item">' . "\n"
. '<label for="select_pred_hostname">' . "\n"
. ' ' . $GLOBALS['strHost'] . ':' . "\n"
. '</label>' . "\n"
. '<span class="options">' . "\n"
. ' <select name="pred_hostname" id="select_pred_hostname" title="' . $GLOBALS['strHost'] . '"' . "\n";
$_current_user = PMA_DBI_fetch_value('SELECT USER();');
if (! empty($_current_user)) {
$thishost = str_replace("'", '', substr($_current_user, (strrpos($_current_user, '@') + 1)));
if ($thishost == 'localhost' || $thishost == '127.0.0.1') {
unset($thishost);
}
}
echo ' onchange="if (this.value == \'any\') { hostname.value = \'%\'; } else if (this.value == \'localhost\') { hostname.value = \'localhost\'; } '
. (empty($thishost) ? '' : 'else if (this.value == \'thishost\') { hostname.value = \'' . addslashes(htmlspecialchars($thishost)) . '\'; } ')
. 'else if (this.value == \'hosttable\') { hostname.value = \'\'; } else if (this.value == \'userdefined\') { hostname.focus(); hostname.select(); }">' . "\n";
unset($_current_user);
// when we start editing a user, $GLOBALS['pred_hostname'] is not defined
if (!isset($GLOBALS['pred_hostname']) && isset($GLOBALS['hostname'])) {
switch (strtolower($GLOBALS['hostname'])) {
case 'localhost':
case '127.0.0.1':
$GLOBALS['pred_hostname'] = 'localhost';
break;
case '%':
$GLOBALS['pred_hostname'] = 'any';
break;
default:
$GLOBALS['pred_hostname'] = 'userdefined';
break;
}
}
echo ' <option value="any"'
. ((isset($GLOBALS['pred_hostname']) && $GLOBALS['pred_hostname'] == 'any')
? ' selected="selected"' : '') . '>' . $GLOBALS['strAnyHost']
. '</option>' . "\n"
. ' <option value="localhost"'
. ((isset($GLOBALS['pred_hostname']) && $GLOBALS['pred_hostname'] == 'localhost')
? ' selected="selected"' : '') . '>' . $GLOBALS['strLocalhost']
. '</option>' . "\n";
if (!empty($thishost)) {
echo ' <option value="thishost"'
. ((isset($GLOBALS['pred_hostname']) && $GLOBALS['pred_hostname'] == 'thishost')
? ' selected="selected"' : '') . '>' . $GLOBALS['strThisHost']
. '</option>' . "\n";
}
unset($thishost);
echo ' <option value="hosttable"'
. ((isset($GLOBALS['pred_hostname']) && $GLOBALS['pred_hostname'] == 'hosttable')
? ' selected="selected"' : '') . '>' . $GLOBALS['strUseHostTable']
. '</option>' . "\n"
. ' <option value="userdefined"'
. ((isset($GLOBALS['pred_hostname']) && $GLOBALS['pred_hostname'] == 'userdefined')
? ' selected="selected"' : '')
. '>' . $GLOBALS['strUseTextField'] . ':</option>' . "\n"
. ' </select>' . "\n"
. '</span>' . "\n"
. '<input type="text" name="hostname" maxlength="'
. $hostname_length . '" value="'
. (isset($GLOBALS['hostname']) ? $GLOBALS['hostname'] : '')
. '" title="' . $GLOBALS['strHost']
. '" onchange="pred_hostname.value = \'userdefined\';" />' . "\n"
. PMA_showHint($GLOBALS['strHostTableExplanation'])
. '</div>' . "\n"
. '<div class="item">' . "\n"
. '<label for="select_pred_password">' . "\n"
. ' ' . $GLOBALS['strPassword'] . ':' . "\n"
. '</label>' . "\n"
. '<span class="options">' . "\n"
. ' <select name="pred_password" id="select_pred_password" title="'
. $GLOBALS['strPassword'] . '"' . "\n"
. ' onchange="if (this.value == \'none\') { pma_pw.value = \'\'; pma_pw2.value = \'\'; } else if (this.value == \'userdefined\') { pma_pw.focus(); pma_pw.select(); }">' . "\n"
. ' <option value="none"';
if (isset($GLOBALS['username']) && $mode != 'change') {
echo ' selected="selected"';
}
echo '>' . $GLOBALS['strNoPassword'] . '</option>' . "\n"
. ' <option value="userdefined"' . (isset($GLOBALS['username']) ? '' : ' selected="selected"') . '>' . $GLOBALS['strUseTextField'] . ':</option>' . "\n"
. ' </select>' . "\n"
. '</span>' . "\n"
. '<input type="password" id="text_pma_pw" name="pma_pw" title="' . $GLOBALS['strPassword'] . '" onchange="pred_password.value = \'userdefined\';" />' . "\n"
. '</div>' . "\n"
. '<div class="item">' . "\n"
. '<label for="text_pma_pw2">' . "\n"
. ' ' . $GLOBALS['strReType'] . ':' . "\n"
. '</label>' . "\n"
. '<span class="options">&nbsp;</span>' . "\n"
. '<input type="password" name="pma_pw2" id="text_pma_pw2" title="' . $GLOBALS['strReType'] . '" onchange="pred_password.value = \'userdefined\';" />' . "\n"
. '</div>' . "\n"
. '<div class="item">' . "\n"
. '<label for="button_generate_password">' . "\n"
. ' ' . $GLOBALS['strGeneratePassword'] . ':' . "\n"
. '</label>' . "\n"
. '<span class="options">' . "\n"
. ' <input type="button" id="button_generate_password" value="' . $GLOBALS['strGenerate'] . '" onclick="suggestPassword(this.form)" />' . "\n"
. '</span>' . "\n"
. '<input type="text" name="generated_pw" id="generated_pw" />' . "\n"
. '</div>' . "\n"
. '</fieldset>' . "\n";
echo '<fieldset id="fieldset_user_privtable_footer" class="tblFooters">' . "\n"
. ' <input type="submit" name="adduser_submit" id="adduser_submit" value="' . $GLOBALS['strGo'] . '" />' . "\n"
. '</fieldset>' . "\n";
echo '</form>'."\n";
echo '</div>'."\n";///////
} elseif (!isset($GLOBALS['repl_clear_scr'])) {
echo "</ul>\n";
echo '</fieldset>'."\n";
}
} elseif (!isset($GLOBALS['mr_configure']) && !isset($GLOBALS['repl_clear_scr'])) {
$_url_params = $GLOBALS['url_params'];
$_url_params['mr_configure'] = true;
echo '<fieldset>'."\n";
echo '<legend>'. $GLOBALS['strReplicationMaster'] .'</legend>'."\n";
echo sprintf($GLOBALS['strReplicationServernConfiguredMaster'], PMA_generate_common_url($_url_params)) ."\n";
echo '</fieldset>'."\n";
}
if (isset($GLOBALS['mr_configure'])) {
echo PMA_js_mootools_domready($jscode['configure_master']);
echo '<fieldset>'."\n";
echo '<legend>'. $GLOBALS['strReplicationMasterConfiguration'] .'</legend>'."\n";
echo $GLOBALS['strReplicationMasterChooseMode'].'<br /><br />'."\n";
echo '<select name="db_type" id="db_type">'."\n";
echo '<option value="all">'. $GLOBALS['strReplicationMasterChooseAll'] .'</option>'."\n";
echo '<option value="ign">'. $GLOBALS['strReplicationMasterChooseIgn'] .'</option>'."\n";
echo '</select>'."\n";
echo '<br /><br />'."\n";
echo $GLOBALS['strReplcationSelectDatabases'].'<br />'."\n";
echo PMA_replication_db_multibox();
echo '<br /><br />'."\n";
echo $GLOBALS['strReplicationAddLines'].'<br />'."\n";
echo '<pre><div id="rep">server-id='. $serverid .'<br />log-bin=mysql-bin<br />log-error=mysql-bin.err<br /></div></pre>'."\n";
echo $GLOBALS['strReplicationRestartServer'] ."\n";
echo '</fieldset>'."\n";
echo '<fieldset class="tblFooters">';
echo ' <form autocomplete="off" method="post" action="server_replication.php" >'."\n";
echo PMA_generate_common_hidden_inputs('', '');
echo ' <input type="submit" value="' . $GLOBALS['strGo'] . '" id="goButton" />';
echo ' </form>'."\n";
echo '</fieldset>';
require_once './libraries/footer.inc.php';
exit;
}
echo '</div>';
if (!isset($GLOBALS['repl_clear_scr'])) {
echo '<fieldset>'."\n";
echo '<legend>Server Replication</legend>'."\n";
if ($server_slave_status) {
echo PMA_js_mootools_domready($jscode['slave_control']);
echo '<div id="slave_configuration_gui">'."\n";
$_url_params = $GLOBALS['url_params'];
$_url_params['sr_take_action'] = true;
$_url_params['sr_slave_server_control'] = true;
if ($server_slave_replication[0]['Slave_IO_Running']=='No')
$_url_params['sr_slave_action'] = 'start';
else
$_url_params['sr_slave_action'] = 'stop';
$_url_params['sr_slave_control_parm'] = 'IO_THREAD';
$slave_control_io_link = PMA_generate_common_url($_url_params);
if ($server_slave_replication[0]['Slave_SQL_Running']=='No')
$_url_params['sr_slave_action'] = 'start';
else
$_url_params['sr_slave_action'] = 'stop';
$_url_params['sr_slave_control_parm'] = 'SQL_THREAD';
$slave_control_sql_link = PMA_generate_common_url($_url_params);
if ($server_slave_replication[0]['Slave_IO_Running']=='No' || $server_slave_replication[0]['Slave_SQL_Running']=='No')
$_url_params['sr_slave_action'] = 'start';
else
$_url_params['sr_slave_action'] = 'stop';
$_url_params['sr_slave_control_parm'] = null;
$slave_control_full_link = PMA_generate_common_url($_url_params);
$_url_params['sr_slave_action'] = 'reset';
$slave_control_reset_link = PMA_generate_common_url($_url_params);
$_url_params = $GLOBALS['url_params'];
$_url_params['sr_slave_skip_error'] = true;
$slave_skip_error_link = PMA_generate_common_url($_url_params);
if ($server_slave_replication[0]['Slave_SQL_Running']=='No')
PMA_Message::warning('Slave SQL Thread not running!')->display();
if ($server_slave_replication[0]['Slave_IO_Running']=='No')
PMA_Message::warning('Slave IO Thread not running!')->display();
$_url_params = $GLOBALS['url_params'];
$_url_params['sl_configure'] = true;
$_url_params['repl_clear_scr'] = true;
$reconfiguremaster_link = PMA_generate_common_url($_url_params);
echo $GLOBALS['strReplicationSlaveConfigured']."\n";
echo '<br />'."\n";
echo '<ul>'."\n";
echo ' <li><a href="#" id="slave_status_href">'. $GLOBALS['strReplicationSlaveSeeStatus'].'</a></li>'."\n";
echo PMA_replication_print_status_table('slave', true, false);
if (isset($_SESSION['replication']['m_correct']) && $_SESSION['replication']['m_correct']==true) {
echo PMA_js_mootools_domready($jscode['slave_control_sync']);
echo ' <li><a href="#" id="slave_synchronization_href">'.$GLOBALS['strReplcationSynchronize'].'</a></li>'."\n";
echo ' <div id="slave_synchronization_gui" style="display: none">'."\n";
echo ' <form method="post">'."\n";
echo PMA_generate_common_hidden_inputs('', '');
echo ' <input type="checkbox" name="repl_struc" value="1" checked disabled /> '. $GLOBALS['strStructure']. '<br />'."\n"; // this is just for vizualization, it has no other purpose
echo ' <input type="checkbox" name="repl_data" value="1" checked /> '. $GLOBALS['strData'] .' <br />'."\n";
echo ' <input type="hidden" name="sr_take_action" value="1" />'."\n";
echo ' <input type="submit" name="sl_sync" value="'. $GLOBALS['strGo'] .'" />'."\n";
echo ' </form>'."\n";
echo ' </div>'."\n";
}
echo ' <li><a href="#" id="slave_control_href">'. $GLOBALS['strReplicationControlSlave'] .'</li>'."\n";
echo ' <div id="slave_control_gui" style="display: none">'."\n";
echo ' <ul>'."\n";
echo ' <li><a a href="'. $slave_control_full_link .'">'. $GLOBALS['strFull'] . '&nbsp;' . (($server_slave_replication[0]['Slave_IO_Running']=='No' || $server_slave_replication[0]['Slave_SQL_Running']=='No') ? $GLOBALS['strStart'] : $GLOBALS['strStop']). ' </a></li>'."\n";
echo ' <li><a a href="'. $slave_control_reset_link .'">'. $GLOBALS['strReplicationSlaveReset'] .'</li>'."\n";
echo ' <li><a a href="'. $slave_control_sql_link .'">'. sprintf($GLOBALS['strReplicationSlaveSQLThread'], ($server_slave_replication[0]['Slave_SQL_Running']=='No' ? $GLOBALS['strStart'] : $GLOBALS['strStop'])) .'</a></li>'."\n";
echo ' <li><a a href="'. $slave_control_io_link .'">'. sprintf($GLOBALS['strReplicationSlaveIOThread'], ($server_slave_replication[0]['Slave_IO_Running']=='No' ? $GLOBALS['strStart'] : $GLOBALS['strStop'])) .'</a></li>'."\n";
echo ' </ul>'."\n";
echo ' </div>'."\n";
echo ' <li><a href="#" id="slave_errormanagement_href">'. $GLOBALS['strReplicationSlaveErrorManagement'] .'</a></li>'."\n";
echo ' <div id="slave_errormanagement_gui" style="display: none">'."\n";
PMA_Message::warning($GLOBALS['strReplicationSkippingErrorWarn'])->display();
echo ' <ul>'."\n";
echo ' <li><a href="'. $slave_skip_error_link .'">'. $GLOBALS['strReplicationSlaveSkipCurrentError'] .'</a></li>'."\n";
echo ' <li>'.$GLOBALS['strReplicationSlaveSkipNext']."\n";
echo ' <form method="post">'."\n";
echo PMA_generate_common_hidden_inputs('', '');
echo ' <input type="text" name="sr_skip_errors_count" value="1" style="width: 30px" />'.$GLOBALS['strReplicationSlaveSkipNextErrors']."\n";
echo ' <input type="submit" name="sr_slave_skip_error" value="'. $GLOBALS['strGo'] .'" />'."\n";
echo ' <input type="hidden" name="sr_take_action" value="1" />'."\n";
echo ' </form></li>'."\n";
echo ' </ul>'."\n";
echo ' </div>'."\n";
echo ' <li><a href="'. $reconfiguremaster_link .'">'.$GLOBALS['strReplicationSlaveChangeMaster'].'</a></li>'."\n";
echo '</ul>'."\n";
} elseif (!isset($GLOBALS['sl_configure'])) {
$_url_params = $GLOBALS['url_params'];
$_url_params['sl_configure'] = true;
$_url_params['repl_clear_scr'] = true;
echo sprintf($GLOBALS['strReplicationSlaveNotConfigured'], PMA_generate_common_url($_url_params))."\n";
}
echo '</fieldset>'."\n";
}
if (isset($GLOBALS['sl_configure'])) {
PMA_replication_gui_changemaster("slave_chagemaster");
}
echo '</div>'."\n";
require_once './libraries/footer.inc.php';
?>

View File

@@ -28,6 +28,11 @@ require './libraries/server_common.inc.php';
*/ */
require './libraries/server_links.inc.php'; require './libraries/server_links.inc.php';
/**
* Replication library
*/
require './libraries/replication.inc.php';
require_once './libraries/replication_gui.lib.php';
/** /**
* Displays the sub-page heading * Displays the sub-page heading
@@ -64,17 +69,6 @@ if (isset($_REQUEST['flush'])) {
*/ */
$server_status = PMA_DBI_fetch_result('SHOW GLOBAL STATUS', 0, 1); $server_status = PMA_DBI_fetch_result('SHOW GLOBAL STATUS', 0, 1);
/**
* get master status from server
*/
$server_master_status = PMA_DBI_fetch_result('SHOW MASTER STATUS');
/**
* get slave status from server
*/
$server_slave_status = PMA_DBI_fetch_result('SHOW SLAVE STATUS');
/** /**
* for some calculations we require also some server settings * for some calculations we require also some server settings
*/ */
@@ -263,70 +257,6 @@ $sections = array(
'tc' => array('title' => $strTransactionCoordinator), 'tc' => array('title' => $strTransactionCoordinator),
); );
/**
* 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
*/
$slave_variables_alerts = array(
'Slave_IO_Running' => 'No',
'Slave_SQL_Running' => 'No'
);
$slave_variables_oks = array(
'Slave_IO_Running' => 'Yes',
'Slave_SQL_Running' => 'Yes'
);
/** /**
* define some needfull links/commands * define some needfull links/commands
*/ */
@@ -339,12 +269,16 @@ $links['table'][$strShowOpenTables]
= 'sql.php?sql_query=' . urlencode('SHOW OPEN TABLES') . = 'sql.php?sql_query=' . urlencode('SHOW OPEN TABLES') .
'&amp;goto=server_status.php&amp;' . PMA_generate_common_url(); '&amp;goto=server_status.php&amp;' . PMA_generate_common_url();
$links['repl'][$strShowSlaveHosts] if ($server_master_status) {
$links['repl'][$strShowSlaveHosts]
= 'sql.php?sql_query=' . urlencode('SHOW SLAVE HOSTS') . = 'sql.php?sql_query=' . urlencode('SHOW SLAVE HOSTS') .
'&amp;goto=server_status.php&amp;' . PMA_generate_common_url(); '&amp;goto=server_status.php&amp;' . PMA_generate_common_url();
$links['repl'][$strShowSlaveStatus] $links['repl'][$strShowMasterStatus] = '#replication_master';
= 'sql.php?sql_query=' . urlencode('SHOW SLAVE STATUS') . }
'&amp;goto=server_status.php&amp;' . PMA_generate_common_url(); if ($server_slave_status) {
$links['repl'][$strShowSlaveStatus] = '#replication_slave';
}
$links['repl']['doc'] = 'replication'; $links['repl']['doc'] = 'replication';
$links['qcache'][$strFlushQueryCache] $links['qcache'][$strFlushQueryCache]
@@ -387,14 +321,6 @@ foreach ($server_status as $name => $value) {
} }
unset($name, $value, $filter, $section, $allocations); unset($name, $value, $filter, $section, $allocations);
// check which replication is available
foreach ($replication_types as $type)
{
if (count(${"server_{$type}_status"}) > 0)
${"server_{$type}_status_run"} = true;
else
${"server_{$type}_status_run"} = false;
}
// rest // rest
$sections['all']['vars'] =& $server_status; $sections['all']['vars'] =& $server_status;
@@ -423,17 +349,19 @@ echo sprintf($strServerStatusUptime,
</p> </p>
<?php <?php
if ($server_master_status_run || $server_slave_status_run) { if ($server_master_status || $server_slave_status)
$replicationOut = ""; {
foreach ($replication_types as $type) { $replicationOut = "";
if (${"server_{$type}_status_run"}) { foreach ($replication_types as $type)
if ($replicationOut != "") { {
$replicationOut .= $strAndSmall . ' '; if (${"server_{$type}_status"})
} {
$replicationOut .= '<b>' . $type . '</b> '; if ($replicationOut != "")
} $replicationOut .= $strAndSmall . ' ';
$replicationOut .= '<b>' . $type . '</b> ';
} }
echo sprintf('<p>' . $strReplicationStatusInfo . '</p>', $replicationOut); }
echo sprintf('<p>' . $strReplicationStatusInfo . '</p>', $replicationOut);
} }
?> ?>
@@ -770,7 +698,7 @@ unset($section_name, $section, $sections, $server_status, $odd_row, $alerts);
</div> </div>
<?php <?php
/* if the server works as master or slave in replication process, display useful information */ /* if the server works as master or slave in replication process, display useful information */
if ($server_master_status_run || $server_slave_status_run) if ($server_master_status || $server_slave_status)
{ {
?> ?>
<hr class="clearfloat" /> <hr class="clearfloat" />
@@ -780,56 +708,9 @@ if ($server_master_status_run || $server_slave_status_run)
foreach ($replication_types as $type) foreach ($replication_types as $type)
{ {
if (${"server_{$type}_status_run"}) if (${"server_{$type}_status"})
{ PMA_replication_print_status_table($type);
?>
<h4><?php echo ${"strReplicationStatus_{$type}"}; ?></h4>
<?php
?>
<table id="server<?php echo $type; ?>replicationsummary" class="data">
<thead>
<tr>
<th><?php echo $strVar; ?></th>
<th><?php echo $strValue; ?></th>
</tr>
</thead>
<tbody>
<?php
$odd_row = true;
foreach(${"{$type}_variables"} as $variable)
{
?>
<tr class="<?php echo $odd_row ? 'odd' : 'even'; ?>">
<td class="name">
<?php echo $variable; ?>
</td>
<td class="value">
<?php
if (isset(${"{$type}_variables_alerts"}[$variable])
&& ${"{$type}_variables_alerts"}[$variable] == ${"server_{$type}_status"}[0][$variable]) {
echo '<span class="attention">';
} elseif (isset(${"{$type}_variables_oks"}[$variable])
&& ${"{$type}_variables_oks"}[$variable] == ${"server_{$type}_status"}[0][$variable]) {
echo '<span class="allfine">';
} else {
echo '<span>';
}
echo ${"server_{$type}_status"}[0][$variable];
echo '</span>';
?>
</td>
</tr>
<?php
$odd_row = ! $odd_row;
}
unset(${"server_{$type}_status"});
?>
</tbody>
</table>
<?php
}
} }
unset($types); unset($types);
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 447 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 447 B