Detaillierte Erläuterung der mysql5.6 Master-Slave-Einrichtung und asynchroner Probleme

Detaillierte Erläuterung der mysql5.6 Master-Slave-Einrichtung und asynchroner Probleme

System: centos6.6

Meister: 192.168.142.129 mysql-5.6.30.tar.gz

Von: 192.168.142.130 192.168.142.131 mysql-5.6.30.tar.gz

1. MySQL Master-Slave-Replikationsprinzip

mysql5.6 Master-Slave-Setup und Master-Slave-Asynchronitätsproblem

(1) Der Master protokolliert die Änderungen im Binärprotokoll.

(2) Der Slave kopiert die Binärprotokollereignisse des Masters in sein Relay-Protokoll. Der E/A-Thread des Slaves liest Ereignisse aus dem Binärprotokoll des Masters und schreibt sie in das Relay-Protokoll.

(3) Der Slave wiederholt die Ereignisse im Relay-Log und ändert die Daten so, dass sie seine eigenen widerspiegeln. Der SQL-Thread des Slaves liest Ereignisse aus dem Relay-Protokoll und spielt sie lokal erneut ab, um sie mit den Daten im Master in Einklang zu bringen.

Schritte zur Implementierung von MySQL Master-Slave:

1. Verwenden Sie den Befehl mysqldump, um die Datenbank zu sichern.

2. Überprüfen Sie den Speicherort der Masterknoten-Binärdatei

3. Erstellen Sie einen Backup-Benutzer und autorisieren Sie ihn (Replikationsclient.Replikationsslave).

4. Ändern Sie die Server-ID des Servers. Sie muss sich von der Server-ID des Haupt-MySQL unterscheiden. Aktivieren Sie das Relay-Datum und deaktivieren Sie das Binärdatum.

5. Importieren Sie Daten aus der Datenbank und verwenden Sie den autorisierten Benutzer, um eine Verbindung zum Haupt-MySQL herzustellen

6. Starten Sie den Slave

Die SQL-Sprache ist in folgende Kategorien unterteilt: Abfragesprache DQL, Steuersprache DCL, Manipulationssprache DML und Definitionssprache DDL. Transaktionskontrolle TCL.

DQL-Anweisung (Data QUERY Languages): eine Datenbankdefinitionsanweisung zum Abfragen eines Abfrageblocks, der aus einer SELECT-Klausel, einer FROM-Klausel und einer WHERE-Klausel besteht, wie etwa: select–from–where–grouop by–having–order by–limit

DDL-Anweisung (Data Definition Languages): d. h. Datenbankdefinitionsanweisung, die zum Erstellen von Tabellen, Indizes, Ansichten, gespeicherten Prozeduren, Triggern usw. in der Datenbank verwendet wird. Häufig verwendete Anweisungsschlüsselwörter sind CREATE, ALTER, DROP, TRUNCATE, COMMENT, RENAME. Die Struktur der Add-, Delete- und Modify-Tabelle

DML-Anweisungen (Data Manipulation Language): Datenmanipulationsanweisungen zum Abfragen, Hinzufügen, Aktualisieren, Löschen usw. Häufig verwendete Anweisungsschlüsselwörter sind: SELECT, INSERT, UPDATE, DELETE, MERGE, CALL, EXPLAIN PLAN, LOCK TABLE, einschließlich allgemeiner Hinzufügungen, Löschungen, Änderungen und Abfragen. Hinzufügen, Löschen und Ändern von Tabellendaten

DCL-Anweisung (Data Control Language): Datensteuerungsanweisung, die zum Erteilen/Widerrufen von Berechtigungen für die Datenbank und ihre Felder verwendet wird (DCL ist die Kurzbezeichnung für Data Control Language, die Befehle wie GRANT umfasst und sich hauptsächlich mit Rechten, Berechtigungen und anderen Steuerelementen des Datenbanksystems befasst.). Häufig verwendete Anweisungsschlüsselwörter sind: GRANT, REVOKE.

TCL-Anweisungen (Transaction Control Language): Transaktionssteuerungsanweisungen, die zur Steuerung von Transaktionen verwendet werden. Häufig verwendete Anweisungsschlüsselwörter sind: COMMIT, ROLLBACK, SAVEPOINT, SET TRANSACTION.

2. MySQL-Kompilierung und -Installation

#!/bin/bash
yum -y install make gcc gcc-c++ openssl openssl-devel pcre-devel gd cmake ncurses ncurses-devel
id -u MySQL
wenn [`echo $?` -ne 0 ];
Dann
MySQL-Gruppenadd
useradd -M -g mysql -s /sbin/nologin mysql
fi

wenn [ ! -d "/usr/local/mysql" ];
Dann
    mkdir -p /usr/local/mysql
fi
mkdir -p /data/mysql
chown -R mysql:mysql /data/mysql
cd /home/soft/ #Software-Speicherverzeichnis tar zxvf mysql-5.6.30.tar.gz
cd mysql-5.6.30

cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DSYSCONFDIR=/etc -DMYSQL_DATADIR=/data/mysql/data -DINSTALL_MANDIR=/usr/share/man -DMYSQL_TCP_PORT=3306 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DEXTRA_CHARSETS=alle -DDEFAULT_COLLATION=utf8_general_ci -DWITH_READLINE=1 -DWITH_SSL=system -DWITH_EMBEDDED_SERVER=1 -DENABLED_LOCAL_INFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1
machen && machen installieren

chown -R mysql:mysql.
chmod +x Skripte/mysql_install_db

./scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld
chmod 755 /etc/init.d/mysqld
chkconfig mysqld auf

cat> /etc/rc.d/init.d/mysqld <<'EOF' #mysql-Startskript #!/bin/sh
# Copyright aufgegeben 1996 TCX DataKonsult AB & Monty Program KB & Detron HB
# Diese Datei ist gemeinfrei und wird mit KEINER GARANTIE jeglicher Art geliefert

# Start-/Stopp-Skript für den MySQL-Daemon.

# Normalerweise wird dies in /etc/init.d abgelegt (zumindest auf Maschinen, die auf SYSV R4 basieren
# Systeme) und verknüpft mit /etc/rc3.d/S99mysql und /etc/rc0.d/K01mysql.
# Wenn dies erledigt ist, wird der MySQL-Server gestartet, wenn die Maschine
# gestartet und heruntergefahren, wenn das System ausfällt.

# Kommentare zur Unterstützung von chkconfig unter RedHat Linux
# chkconfig: 2345 64 36
# Beschreibung: Eine sehr schnelle und zuverlässige SQL-Datenbank-Engine.

# Kommentare zur Unterstützung von LSB-Init-Skriptkonventionen
### BEGINNEN INIT INFO
# Bietet: mysql
# Erforderlicher Start: $local_fs $network $remote_fs
# Sollte starten: ypbind nscd ldap ntpd xntpd
# Erforderlicher Stopp: $local_fs $network $remote_fs
# Standard-Start: 2 3 4 5
# Standard-Stopp: 0 1 6
# Kurzbeschreibung: MySQL starten und stoppen
# Beschreibung: MySQL ist eine sehr schnelle und zuverlässige SQL-Datenbank-Engine.
### ENDE INIT INFO

# Wenn Sie MySQL an einem anderen Ort als /usr/local/mysql installieren, dann
# müssen Sie eine der folgenden Aktionen ausführen, damit dieses Skript funktioniert:
#
# - Führen Sie dieses Skript aus dem MySQL-Installationsverzeichnis aus
# - Erstellen Sie eine /etc/my.cnf-Datei mit den folgenden Informationen:
# [mysqld]
# basedir=<Pfad zum MySQL-Installationsverzeichnis>
# - Fügen Sie das Obige zu einer beliebigen anderen Konfigurationsdatei hinzu (zum Beispiel ~/.my.ini)
# und kopiere my_print_defaults nach /usr/bin
# - Fügen Sie den Pfad zum MySQL-Installationsverzeichnis zur Variable basedir hinzu
# unten.
#
# Wenn Sie andere MySQL-Variablen beeinflussen möchten, sollten Sie Ihre Änderungen vornehmen
# in /etc/my.cnf, ~/.my.cnf oder anderen MySQL-Konfigurationsdateien.

# Wenn Sie das Basisverzeichnis ändern, müssen Sie auch das Datenverzeichnis ändern. Diese können
# durch Einstellungen in den MySQL-Konfigurationsdateien überschrieben.
basedir=/usr/local/mysql
Datenverzeichnis=/Daten/MySQL

# Standardwert in Sekunden, nach dem das Skript eine Zeitüberschreitung beim Warten
# für den Serverstart. 
# Der Wert hier wird durch den Wert in my.cnf überschrieben. 
# 0 bedeutet, überhaupt nicht zu warten
# Negative Zahlen bedeuten, unendlich zu warten
service_startup_timeout=900

# Verzeichnis für RedHat/SuSE sperren.
lockdir='/var/lock/subsys'
lock_file_path="$lockdir/mysql"

# Die folgenden Variablen werden nur festgelegt, damit mysql.server Dinge finden kann.

# Legen Sie einige Standardeinstellungen fest
mysqld_pid_file_path=
wenn test -z "$basedir"
Dann
  basedir=/usr/local/mysql
  bindir=/usr/local/mysql/bin
  wenn test -z "$datadir"
  Dann
    datadir=/Daten/mysql/Daten
  fi
  sbindir=/usr/local/mysql/bin
  libexecdir=/usr/local/mysql/bin
anders
 bindir="$basedir/bin"
  wenn test -z "$datadir"
  Dann
    Datenverzeichnis="$basedir/data"
  fi
  sbindir="$basedir/sbin"
  libexecdir="$basedir/libexec"
fi

# datadir_set wird verwendet, um zu bestimmen, ob datadir gesetzt wurde (und sollte es auch sein
# *nicht* innerhalb des --basedir=-Handlers festgelegt.)
datadir_set=
# Verwenden Sie nach Möglichkeit LSB-Init-Skriptfunktionen zum Drucken von Nachrichten
#
lsb_functions="/lib/lsb/init-functions"
wenn test -f $lsb_functions; dann
  . $lsb_funktionen
anders
  log_success_msg()
  {
    echo " ERFOLGREICH! $@"
  }
  log_failure_msg()
  {
    echo " FEHLER! $@"
  }
fi

PATH="/sbin:/usr/sbin:/bin:/usr/bin:$basedir/bin"
Exportpfad
mode=$1 # starten oder stoppen

[ $# -ge 1 ] && verschieben


other_args="$*" # ungewöhnlich, aber erforderlich, wenn es von einer RPM-Upgrade-Aktion aufgerufen wird
           # Erwartet: „--skip-networking --skip-grant-tables“
           # Sie werden hier absichtlich nicht überprüft, da es in der Verantwortung liegt
           # des Autors der „spec“-Datei, um nur korrekte Argumente anzugeben.

Fall `echo "testing\c"`, `echo -n testing` in
    *c*,-n*) echo_n= echo_c= ;;
    *c*,*) echo_n=-n echo_c= ;;
    *) echo_n= echo_c='\c' ;;
esac

parse_server_arguments() {
  für arg tun
    Fall "$arg" in
      --basedir=*) basedir=`echo "$arg" | sed -e ‚s/^[^=]*=//‘`
                    bindir="$basedir/bin"
                    wenn test -z "$datadir_set"; dann
                      Datenverzeichnis="$basedir/data"
                    fi
                    sbindir="$basedir/sbin"
                    libexecdir="$basedir/libexec"
        ;;
      --datadir=*) datadir=`echo "$arg" | sed -e ‚s/^[^=]*=//‘`
                    datadir_set=1
        ;;
      --pid-file=*) mysqld_pid_file_path=`echo "$arg" | sed -e ‚s/^[^=]*=//‘` ;;
      --service-startup-timeout=*) service_startup_timeout=`echo "$arg" | sed -e ‚s/^[^=]*=//'` ;;
    esac
  Erledigt
}

warte_auf_pid () {
  verb="$1" # erstellt | entfernt
  pid="$2" # Prozess-ID des Programms, das die PID-Datei bearbeitet
pid_file_path="$3" # Pfad zur PID-Datei.

  ich = 0
  avoid_race_condition="durch erneute Prüfung"

  während Test $i -ne $service_startup_timeout; mache

    Fall "$verb" in
      'erstellt')
        # Warten Sie, bis eine PID-Datei erstellt wird.
        test -s "$pid_file_path" && i='' && break
        ;;
      'ENTFERNT')
        # warten, bis diese PID-Datei verschwindet
        Prüfung! -s "$pid_file_path" && i='' && break
        ;;
      *)
        echo "wait_for_pid () Verwendung: wait_for_pid erstellt|entfernt pid pid_file_path"
        Ausfahrt 1
        ;;
    esac

    # wenn der Server nicht läuft, wird die PID-Datei nie aktualisiert
    wenn test -n "$pid"; dann
 wenn kill -0 "$pid" 2>/dev/null; dann
        : # der Server läuft noch
      anders
        # Der Server wurde möglicherweise zwischen der letzten PID-Dateiprüfung und jetzt beendet.  
        wenn test -n "$avoid_race_condition"; dann
          race_condition vermeiden=""
          weiter # Nochmals prüfen.
                                         
        fi

        # es gibt nichts, was die Datei beeinflussen würde.
        log_failure_msg "Der Server wurde beendet, ohne die PID-Datei ($pid_file_path) zu aktualisieren."
        return 1 # nicht mehr warten.
      fi
    fi

    echo $echo_n ".$echo_c"
    i=`Ausdruck $i + 1`
    Schlaf 1

  Erledigt

  wenn test -z "$i" ; dann
    log_erfolg_msg
    Rückgabe 0
  anders
    log_failure_msg
    Rückgabe 1
  fi
}

# Argumente aus der Datei my.cnf abrufen,
# die einzige Gruppe, die von nun an gelesen wird, ist [mysqld]
wenn test -x ./bin/my_print_defaults
Dann
  print_defaults="./bin/my_print_defaults"
elif test -x $bindir/my_print_defaults
Dann
  print_defaults="$bindir/meine_druck_defaults"
elif test -x $bindir/mysql_print_defaults
Dann
  print_defaults="$bindir/mysql_print_defaults"
anders
  # Versuchen Sie, das Basisverzeichnis in /etc/my.cnf zu finden
  conf=/etc/meine.cnf
  drucken_standardwerte=
  wenn test -r $conf
  Dann
    subpat='^[^=]*basedir[^=]*=\(.*\)$'
    dirs=`sed -e "/$subpat/!d" -e 's//\1/' $conf`
    für d in $dirs
    Tun
      d=`echo $d | sed -e 's/[ ]//g'`
      wenn test -x "$d/bin/my_print_defaults"
      Dann
        print_defaults="$d/bin/meine_druck_defaults"
        brechen
      fi
      wenn test -x "$d/bin/mysql_print_defaults"
      Dann
      print_defaults="$d/bin/mysql_print_defaults"
        brechen
      fi
    Erledigt
  fi
  # Hoffe, es ist im PATH ... aber ich bezweifle es
  test -z "$print_defaults" && print_defaults="meine_print_defaults"
fi

#
# Standarddatei aus 'basedir' lesen. Wenn dort keine Standarddatei vorhanden ist,
# prüfen, ob es sich am alten (veralteten) Ort (datadir) befindet und von dort lesen
#

extra_args=""
wenn test -r "$basedir/my.cnf"
Dann
  extra_args="-e $basedir/my.cnf"
anders
  wenn test -r "$datadir/my.cnf"
  Dann
    extra_args="-e $datadir/my.cnf"
  fi
fi

parse_server_arguments `$print_defaults $extra_args mysqld-Server mysql_server mysql.server`

#
# PID-Datei festlegen, falls nicht angegeben
#
wenn test -z "$mysqld_pid_file_path"
Dann
  mysqld_pid_file_path=$datadir/`hostname`.pid
anders
  Fall "$mysqld_pid_file_path" in
    /* ) ;;
    * )mysqld_pid_file_path="$datadir/$mysqld_pid_file_path" ;;
  esac
fi

Fall "$mode" in
  'Start')
    # Daemon starten

    # Absicherung (relative Pfade, Core Dumps...)
    cd $basedir

    echo $echo_n "MySQL wird gestartet"
    wenn test -x $bindir/mysqld_safe
    Dann
      # Geben Sie mysqld zusätzliche Argumente mit der Datei my.cnf. Dieses Skript
      # kann beim nächsten Upgrade überschrieben werden.
      $bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &
      wait_for_pid hat "$!" erstellt "$mysqld_pid_file_path"; Rückgabewert=$?

      # Sperre für RedHat / SuSE erstellen
      wenn test -w "$lockdir"
      Dann
        berühren Sie "$lock_file_path"
      fi
  beenden $return_value
    anders
      log_failure_msg "MySQL-Server konnte nicht gefunden werden ($bindir/mysqld_safe)"
    fi
    ;;

  'stoppen')
    # Daemon stoppen. Wir verwenden hier ein Signal, um nicht wissen zu müssen,
    # Root-Passwort.

    wenn test -s "$mysqld_pid_file_path"
    Dann
      mysqld_pid=`cat "$mysqld_pid_Dateipfad"`

      wenn (kill -0 $mysqld_pid 2>/dev/null)
      Dann
        echo $echo_n "MySQL wird heruntergefahren"
        Beenden Sie $mysqld_pid
        # mysqld sollte die PID-Datei beim Beenden entfernen, warten Sie also darauf.
        wait_for_pid hat "$mysqld_pid" "$mysqld_pid_file_path" entfernt; Rückgabewert=$?
      anders
        log_failure_msg "MySQL-Serverprozess #$mysqld_pid läuft nicht!"
        rm "$mysqld_pid_dateipfad"
      fi

      # Sperre für RedHat / SuSE löschen
      wenn test -f "$lock_file_path"
      Dann
        rm -f "$lock_file_pfad"
      fi
      beenden $return_value
 anders
      log_failure_msg "MySQL-Server-PID-Datei konnte nicht gefunden werden!"
    fi
    ;;

  'Neustart')
    # Stoppen Sie den Dienst und unabhängig davon, ob er
    # läuft oder nicht, starten Sie es erneut.
    wenn $0, stopp $other_args; dann
      $0 Start $andere_args
    anders
      log_failure_msg "Der laufende Server konnte nicht gestoppt werden. Daher wird ein Startversuch abgelehnt."
      Ausfahrt 1
    fi
    ;;

  'neu laden'|'erzwungenes Neuladen')
    wenn test -s "$mysqld_pid_file_path" ; dann
      mysqld_pid lesen < "$mysqld_pid_file_path"
      kill -HUP $mysqld_pid && log_success_msg "MySQL-Dienst wird neu geladen"
      berühren Sie "$mysqld_pid_file_path"
    anders
      log_failure_msg "MySQL PID-Datei konnte nicht gefunden werden!"
      Ausfahrt 1
    fi
    ;;
  'Status')
    # Überprüfen Sie zunächst, ob die PID-Datei vorhanden ist
    wenn test -s "$mysqld_pid_file_path" ; dann
      mysqld_pid lesen < "$mysqld_pid_file_path"
      wenn kill -0 $mysqld_pid 2>/dev/null; dann
  log_success_msg "MySQL läuft ($mysqld_pid)"
        Ausfahrt 0
      anders
        log_failure_msg "MySQL läuft nicht, aber die PID-Datei existiert"
        Ausfahrt 1
      fi
    anders
      # Versuchen Sie, den passenden mysqld-Prozess zu finden
      mysqld_pid=`pidof $libexecdir/mysqld`
      wenn test -z $mysqld_pid; dann
        wenn test -f "$lock_file_path" ; dann
          log_failure_msg "MySQL läuft nicht, aber die Sperrdatei ($lock_file_path) existiert"
          Ausfahrt 2
        fi
        log_failure_msg "MySQL läuft nicht"
        Ausfahrt 3
      anders
        log_failure_msg „MySQL läuft, aber die PID-Datei konnte nicht gefunden werden“
        Ausfahrt 4
      fi
    fi
    ;;
    *)
      # Verwendung
      Basisname=`Basisname "$0"`
      echo "Verwendung: $basename {start|stop|restart|reload|force-reload|status} [MySQL-Serveroptionen]"
      Ausfahrt 1
    ;;
                             
esac

Ausfahrt 0
Ende der Laufzeit

cat> /etc/my.cnf <<'EOF' #mysql-Konfigurationsdatei [Client]
#password = Ihr_Passwort
Port = 3306
Socket = /tmp/mysql.sock

# Hier folgen Einträge für einige spezifische Programme

# Der MySQL-Server
[mysqld]
Port = 3306
Socket = /tmp/mysql.sock
externe Verriegelung überspringen
Schlüsselpuffergröße = 384 M
max_allowed_packet = 64M
table_open_cache = 512
Sortierpuffergröße = 2 M
Lesepuffergröße = 2 M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64 M
Thread-Cache-Größe = 8
Abfrage-Cachegröße = 32 M
# Versuchen Sie die Anzahl der CPUs*2 für Thread_Concurrency
Thread_Parallelität = 8
basedir = /usr/local/mysql
Datenverzeichnis = /data/mysql
max_verbindungen = 5000
lange_Abfragezeit = 1
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log

# Lauschen Sie überhaupt nicht auf einem TCP/IP-Port. Dies kann eine Sicherheitsverbesserung sein,
# wenn alle Prozesse, die eine Verbindung zu mysqld herstellen müssen, auf demselben Host ausgeführt werden.
# Die gesamte Interaktion mit mysqld muss über Unix-Sockets oder Named Pipes erfolgen.
# Beachten Sie, dass die Verwendung dieser Option ohne Aktivierung von Named Pipes unter Windows
# (über die Option „enable-named-pipe“) macht mysqld unbrauchbar!
Kleinbuchstaben-Tabellennamen = 1
# Replikationsmasterserver (Standard)
# Binäre Protokollierung ist für die Replikation erforderlich
#log-bin=mysql-bin
Namensauflösung überspringen
# erforderliche eindeutige ID zwischen 1 und 2^32 - 1
# ist standardmäßig 1, wenn der Master-Host nicht festgelegt ist
# funktioniert aber nicht als Master, wenn es weggelassen wird
#Server-ID = 1
# Binäres Logging - für Slaves nicht erforderlich, aber empfohlen
#log-bin=mysql-bin
#
# Binäres Protokollierungsformat – gemischt empfohlen 
#binlog_format=gemischt

# Entfernen Sie die folgenden Kommentare, wenn Sie InnoDB-Tabellen verwenden
#innodb_data_home_dir = /Daten/mysql/Daten
#innodb_data_file_path = ibdata1:2000M;ibdata2:10M:autoextend
#innodb_log_group_home_dir = /Daten/mysql/Daten
# Sie können .._buffer_pool_size auf bis zu 50 - 80 % einstellen
Anzahl der RAM, aber achten Sie darauf, die Speichernutzung nicht zu hoch einzustellen
innodb_buffer_pool_size = 4096 M
#innodb_additional_mem_pool_size = 20 M
# Setze .._log_file_size auf 25 % der Pufferpoolgröße
innodb_log_file_size = 512 M
#innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 0
#innodb_lock_wait_timeout = 50

[mysqldump]
schnell
max_allowed_packet = 64M

[mysql]
kein automatisches Wiederaufwärmen
# Entfernen Sie das nächste Kommentarzeichen, wenn Sie mit SQL nicht vertraut sind
#sichere-updates
[myisamchk]
Schlüsselpuffergröße = 256 M
Sortierpuffergröße = 256 M
Lesepuffer = 2M
Schreibpuffer = 2M

[mysqlhotcopy]
Interaktives Timeout

Ende der Laufzeit

ln -s /usr/local/mysql/bin/mysqladmin /usr/bin
ln -s /usr/local/mysql/lib/mysql /usr/lib
ln -s /usr/local/mysql/include/mysql /usr/include/mysql
mkdir /var/lib/mysql
ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
Schlaf 2
Quelle /etc/Profil

Dienst MySQLD starten

Schlaf 5
cd /usr/local/mysql/bin && mysqladmin -uroot password 'mysql' #Autorisieren Sie das Passwort des Root-Benutzers
Quelle /etc/Profil

3. Master-Slave-Konfiguration

1. Überprüfen Sie, ob die Masterdatenbank Daten enthält, und autorisieren Sie dann Benutzer mit Replikationsberechtigungen

mysql> Datenbank db1 erstellen;
mysql> verwende db1
mysql> Tabelle erstellen t1(id int, name varchar(12));
mysql> in t1-Werte einfügen (1, „Tom“), (2, „Jerry“), (3, „Jack“);
mysql> gewähre Replikations-Slave, Replikations-Client auf *.* an „backuser“@„192.168.142.130“, identifiziert durch „mysqll“;
mysql> gewähre Replikations-Slave, Replikations-Client auf *.* an 'backuser'@'192.168.142.131', identifiziert durch 'mysql';
mysql> Berechtigungen leeren;

2. Ändern Sie die Konfigurationsdateien jeder Datenbank und starten Sie die Datenbank neu

vi /etc/my.cnf #Hauptbibliothekskonfigurationsdatei server-id=1
log-bin=mysql-bin
binlog-do-db=db1
binlog-ignore-db=mysql 

vi /etc/my.cnf #Konfigurationsdatei der Slave-Bibliothek server-id=2 #Die ID der Slave-Bibliothek kann nicht mit der der Master-Bibliothek identisch sein, andere Slave-Bibliotheken werden dahinter angeordnet log-bin=relay-bin
replicate-do-db=db1 #DB1-Datenbank synchronisieren replicate-ignore-db=mysql #MySQL-Datenbank nicht synchronisieren read_only #Nur-Lese-Dienst mysqld restart

3. Die Master-Datenbank sperrt die Tabelle zur Sicherung und überträgt die Datei dann in die Slave-Datenbank

mysql> Tabellen mit Lesesperre leeren; #Sperren Sie die Mastertabelle, um das Schreiben neuer Daten zu verhindernmysql> Masterstatus anzeigen; #Den Masterstandortknoten anzeigenÖffnen Sie ein neues Terminal-Backup:
mysqldump -u root -p --default-character-set=utf8 --opt -Q -R --skip-lock-tables db1 > /root/db1.sql  
scp /root/db1.sql [email protected]:/root   
scp /root/db1.sql [email protected]:/root

4. Daten aus der Datenbank importieren und dann zum Knoten der Hauptdatenbank wechseln

mysql -u root -p
mysql> Datenbank db1 erstellen;
mysql> verwende db1
mysql> Quelle /root/db1.sql
mysql> ändere Master in master_host='192.168.142.129',master_user='backuser',master_password='mysql',master_log_file='mysql-bin.000001',master_log_pos=120;
mysql> Slave starten;
mysql> Slave-Status anzeigen\G 

MySQL5.6 Master-Slave-Setup und Master-Slave-Asynchronitätsproblem_Datenbank_02

5. Entsperren Sie die Hauptdatenbank

mysql> Tabellen entsperren;

Die obige Konfiguration ist auch auf die Neukonfiguration von Master und Slave anwendbar, wenn Master und Slave nicht synchron sind.

4. Master-Slave-Asynchronität

1. Ursachen der Asynchronität

Netzwerkverzögerung Inkonsistente Belastung der Master- und Slave-Rechner Inkonsistente max_allowed_packet-Einstellungen Inkonsistente Schlüsselwert- und Auto-Increment-Schritteinstellungen verursachen Master-Slave-Inkonsistenz Im Falle einer anormalen MySQL-Ausfallzeit ist es sehr wahrscheinlich, dass sync_binlog=1 oder innodb_flush_log_at_trx_commit=1 nicht gesetzt ist.

Die Binlog- oder Relaylog-Datei ist beschädigt, was zu Inkonsistenzen zwischen Master und Slave führt. Master und Slave sind aufgrund eines Fehlers in MySQL selbst nicht synchron. Inkonsistente Versionen, insbesondere wenn die höhere Version der Master und die niedrigere Version der Slave ist. Die auf der Master-Datenbank unterstützte Funktion wird auf der Slave-Datenbank nicht unterstützt.

2. Lösung

(1) Ignorieren Sie den Fehler und setzen Sie die Synchronisierung fort

Diese Methode eignet sich für Situationen, in denen sich die Daten der Master- und Slave-Datenbanken nicht sehr unterscheiden oder die Daten nicht vollständig vereinheitlicht werden können und die Datenanforderungen nicht streng sind.

Sklave stoppen;
setze globalen sql_slave_skip_counter = 1;
Slave starten;
Slave-Status anzeigen\G

(2) Wiederherstellung der Master-Slave-Beziehung

Beziehen Sie sich auf die obige Konfiguration, um die Master-Datenbanktabelle zu sperren und sie wieder zu einem Master-Slave zu machen.

Dies ist das Ende dieses Artikels mit der detaillierten Erklärung der Probleme mit der Master-Slave-Konstruktion und Asynchronität in MySQL 5.6. Weitere Informationen zur Master-Slave-Konstruktion und Asynchronität von MySQL finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Implementierungsschritte der MySQL-Master-Slave-Replikation
  • Prinzip und Anwendung der MySQL-Master-Slave-Synchronisation
  • Analyse des Prinzips und der Funktion der MySQL-Datenbank-Master-Slave-Replikation

<<:  Detaillierte Erklärung des Plattformbusses des Linux-Treibers

>>:  So stoppen Sie die CSS-Animation mittendrin und behalten die Haltung bei

Artikel empfehlen

JavaScript-Canvas zum Erzielen eines Code-Rain-Effekts

In diesem Artikel wird der spezifische Code für C...

Vue – Erste Schritte mit der Wettervorhersage

In diesem Artikelbeispiel wird der spezifische Co...

Beispiel, wie nginx dynamische und statische Trennung implementiert

Inhaltsverzeichnis Stellen Sie nginx auf Server1 ...

Vue implementiert dynamische Routingdetails

Inhaltsverzeichnis 1. Frontend-Steuerung 1. In de...

Beispiel für Auslassungspunkte bei Überlauf von mehrzeiligem CSS-Text

Auslassungspunkte werden angezeigt, wenn mehrzeil...

Detaillierte Erklärung der MySQL 30-Militärregeln

1. Grundlegende Spezifikationen (1) Es muss die I...

Schritte zur Vue-Batch-Update-DOM-Implementierung

Inhaltsverzeichnis Szeneneinführung Hohe Reaktion...

Detaillierte Erklärung des this-Zeigeproblems in JavaScript

Zusammenfassen Globale Umgebung ➡️ Fenster Normal...