• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 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 args
      die "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")
          or die "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")
        or die "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;")
          or die "Error while preparing to select epoch from slave: ",
                 $dbhS->errstr;
    
      $sth->execute
          or die "Selecting epoch from slave error: ", $sth->errstr;
    
      $sth->bind_col (1, \$epoch);
      $sth->fetch;
      print "\tSlave Epoch =  $epoch\n";
      $sth->finish;
    }
    
    #######  Find the position of the last GCI in the binary log ########
    
    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;")
          or die "Prepare to select from master error: ", $dbhM->errstr;
    
      $sth->execute
          or die "Selecting from master error: ", $sth->errstr;
    
      $sth->bind_col (1, \$binlog);
      $sth->bind_col (2, \$binpos);
      $sth->fetch;
      print "\tMaster binary log =  $binlog\n";
      print "\tMaster binary log position =  $binpos\n";
      $sth->finish;
    }
    
    ##########  Set the slave to process from that location #########
    
    sub UpdateSlave
    {
      $sth = $dbhS->prepare("CHANGE MASTER TO
                             MASTER_LOG_FILE='$binlog',
                             MASTER_LOG_POS=$binpos;")
          or die "Prepare to CHANGE MASTER error: ", $dbhS->errstr;
    
      $sth->execute
           or die "CHANGE MASTER on slave error: ", $sth->errstr;
      $sth->finish;
      print "\tSlave has been updated. You may now start the slave.\n";
    }
    
    # end reset-slave.pl