NDB群集复制:自动将复制从设备同步到主二进制日志
可以使上一节中描述的大部分过程自动化(请参见“使用NDB群集复制进行备份并从中还原”)。以下Perl脚本reset-slave.pl
用作如何执行此操作的示例。
#!/user/bin/perl -w # file: reset-slave.pl # Copyright ©2005 MySQL AB # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to: # Free Software Foundation, Inc. # 59 Temple Place, Suite 330 # Boston, MA 02111-1307 USA # # Version 1.1 ######################## Includes ###############################use DBI; ######################## Globals ################################my $m_host='';my $m_port='';my $m_user='';my $m_pass='';my $s_host='';my $s_port='';my $s_user='';my $s_pass='';my $dbhM='';my $dbhS=''; ####################### Sub Prototypes ##########################sub CollectCommandPromptInfo;sub ConnectToDatabases;sub DisconnectFromDatabases;sub GetSlaveEpoch;sub GetMasterInfo;sub UpdateSlave; ######################## Program Main ########################### CollectCommandPromptInfo; ConnectToDatabases; GetSlaveEpoch; GetMasterInfo; UpdateSlave; DisconnectFromDatabases; ################## Collect Command Prompt Info ##################sub CollectCommandPromptInfo { ### Check that user has supplied correct number of command line argsdie "Usage:\n reset-slave >master MySQL host< >master MySQL port< \n >master user< >master pass< >slave MySQL host< \n >slave MySQL port< >slave user< >slave pass< \n All 8 arguments must be passed. Use BLANK for NULL passwords\n"unless @ARGV == 8; $m_host = $ARGV[0]; $m_port = $ARGV[1]; $m_user = $ARGV[2]; $m_pass = $ARGV[3]; $s_host = $ARGV[4]; $s_port = $ARGV[5]; $s_user = $ARGV[6]; $s_pass = $ARGV[7];if ($m_pass eq "BLANK") { $m_pass = '';}if ($s_pass eq "BLANK") { $s_pass = '';} } ############### Make connections to both databases #############sub ConnectToDatabases { ### Connect to both master and slave cluster databases ### Connect to master $dbhM = DBI->connect( "dbi:mysql:database=mysql;host=$m_host;port=$m_port", "$m_user", "$m_pass") ordie "Can't connect to Master Cluster MySQL process! Error: $DBI::errstr\n"; ### Connect to slave $dbhS = DBI->connect( "dbi:mysql:database=mysql;host=$s_host", "$s_user", "$s_pass") ordie "Can't connect to Slave Cluster MySQL process! Error: $DBI::errstr\n"; } ################ Disconnect from both databases ################sub DisconnectFromDatabases { ### Disconnect from master $dbhM->disconnect or warn " Disconnection failed: $DBI::errstr\n"; ### Disconnect from slave $dbhS->disconnect or warn " Disconnection failed: $DBI::errstr\n"; } ###################### Find the last good GCI ##################sub GetSlaveEpoch { $sth = $dbhS->prepare("SELECT MAX(epoch) FROM mysql.ndb_apply_status;") ordie "Error while preparing to select epoch from slave: ", $dbhS->errstr; $sth->execute ordie "Selecting epoch from slave error: ", $sth->errstr; $sth->bind_col (1, \$epoch); $sth->fetch;sub GetMasterInfo { $sth = $dbhM->prepare("SELECT SUBSTRING_INDEX(File, '/', -1), Position FROM mysql.ndb_binlog_index WHERE epoch > $epoch ORDER BY epoch ASC LIMIT 1;") ordie "Prepare to select from master error: ", $dbhM->errstr; $sth->execute ordie "Selecting from master error: ", $sth->errstr; $sth->bind_col (1, \$binlog); $sth->bind_col (2, \$binpos); $sth->fetch;sub UpdateSlave { $sth = $dbhS->prepare("CHANGE MASTER TO MASTER_LOG_FILE='$binlog', MASTER_LOG_POS=$binpos;") ordie "Prepare to CHANGE MASTER error: ", $dbhS->errstr; $sth->execute ordie "CHANGE MASTER on slave error: ", $sth->errstr; $sth->finish;