Explication détaillée de la configuration de la réplication maître-esclave MySQL

1. Configurer l'environnement

Système d'exploitation : Deux systèmes Linux avec CentOS 7.6

Version de la base de données : MySQL 5.6.39

IP du serveur principal : 192.168.0.1

IP du serveur esclave : 192.168.0.2

2. Installez la base de données

J'ai déjà expliqué en détail les étapes d'installation de MySQL sur CentOS à mes amis. Pour ceux qui ne l'ont pas vu, vous pouvez cliquer ici :

" Étapes détaillées pour installer MySQL dans un environnement Linux "

3. Prérequis de configuration

1. Il est nécessaire de s'assurer que le pare-feu est ouvert ou fermé sur le port 3306, qui est introduit dans l'installation de MySQL.

2. Les deux serveurs peuvent se pinger

--在192.168.0.2上输入ping命令
ping 192.168.0.1
--在192.168.0.1上输入ping命令
ping 192.168.0.2

3. Après avoir installé avec succès un MySQL, utilisez une machine virtuelle pour en cloner un en tant que serveur esclave

4. Configurer la base de données master

4.1. Modifier le fichier de configuration de la base de données

[root@localhost ~]# vi /etc/my.cnf

Modifiez le contenu à l'intérieur pour

[mysqld]
#开启二进制日志
log-bin=mysql-bin
#标识唯一id(必须),一般使用ip最后位
server-id=1
#不同步的数据库,可设置多个
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=mysql
#指定需要同步的数据库(和slave是相互匹配的),可以设置多个
binlog-do-db=test

Ajouter une méthode et des règles de stockage des journaux (facultatif)

#设置存储模式不设置默认
binlog_format=MIXED
#日志清理时间
expire_logs_days=7
#日志大小
max_binlog_size=100m
#缓存大小
binlog_cache_size=4m
#最大缓存大小
max_binlog_cache_size=521m

Remarque : J'ai défini la capacité de stockage du journal sur une taille relativement petite, bien sûr, vous pouvez la modifier pour qu'elle soit plus grande en fonction de la situation réelle.

4.2, redémarrez le service de base de données mysqld

service mysqld restart

Si vous avez correctement installé mysql conformément à ce qui précède, vous pouvez redémarrer normalement ici. Si le démarrage n'est pas normal, l'erreur suivante apparaît :

Le serveur s'est arrêté sans mettre à jour le fichier PID......

Vous devez utiliser la commande suivante pour voir s'il existe toujours un processus mysqld

ps -ef|grep mysqld

Si c'est le cas, vous pouvez utiliser la commande : kill -9 numéro de processus de mysqld pour y mettre fin, puis redémarrez mysqld

J'ai rencontré la situation ci-dessus. Bien sûr il y a d'autres raisons, voici une solution pour d'autres raisons possibles de référence :

https://javawind.net/p141

4.3. Connectez-vous à la base de données MySQL pour autoriser le journal principal de la bibliothèque à partir de la bibliothèque

[root@localhost ~]# mysql -u root -p

Remarque : Vous n'avez pas besoin d'entrer le mot de passe root pour la première connexion.

Après avoir entré, effectuez la configuration suivante :

#给从库放权限
mysql>GRANT FILE ON *.* TO 'root'@'192.168.0.2' IDENTIFIED BY 'root password'; #创建用户
mysql>GRANT REPLICATION SLAVE ON *.* TO 'root'@'192.168.0.2' IDENTIFIED BY 'root password'; #修改用户权限
mysql>select host ,user ,password from mysql.user; #查看是否修改成功
mysql>FLUSH PRIVILEGES; #刷新权限

4.4. Redémarrez le service MySQL, connectez-vous à MySQL et affichez les principales informations de la base de données

[root@localhost ~]# service mysqld restart #重启mysql服务
[root@localhost ~]# mysql -u root -p #登陆mysql
mysql> show master status; #查看master状态

Affiche à peu près ce qui suit

+------------------+----------+--------------+----------------------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+----------------------------------+-------------------+
| mysql-bin.000006 |    120 | ufind_db | information_schema,performance_schema,mysql | |
+------------------+----------+--------------+----------------------------------+-------------------+
1 row in set (0.00 sec)

Remarque : Si cette étape est toujours exécutée Empty set(0.00 sec), cela signifie que le my.cnf précédent n'est pas configuré correctement , veuillez revenir en arrière et revérifier les étapes de configuration.

5. Configurer la base de données esclave

5.1. Modifier le fichier de configuration de la base de données de la bibliothèque esclave

[root@localhost ~]# vi /etc/my.cnf

Modifiez le contenu à l'intérieur pour

#开启二进制日志
log-bin=mysql-bin
server-id=2
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=mysql
#与主库配置保持一致
replicate-do-db=test
replicate-ignore-db=mysql
log-slave-updates
slave-skip-errors=all
slave-net-timeout=60

5.2. Redémarrez le service MySQL et connectez-vous à MySQL

[root@localhost ~]# service mysqld restart

[root@localhost ~]# mysql -u root -p

et apportez les modifications suivantes :

#关闭Slave
mysql> stop slave; #设置连接主库信息
mysql> change master to master_host='192.168.0.1',master_user='root',master_password='root password',master_log_file='mysql-bin.000006', master_log_pos=120;
#开启Slave
mysql> start slave;

Remarque : Le master_log_file ci-dessus est le champ File lors de la configuration du Master, et master_log_pos est le champ Position lors de la configuration du Master. doit correspondre
 

5.3. Afficher les informations d'état de la bibliothèque esclave

mysql> show slave status \G;

En cas de succès, les informations suivantes s'affichent :

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.0.1
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000006
          Read_Master_Log_Pos: 120
               Relay_Log_File: localhost-relay-bin.000006
                Relay_Log_Pos: 520
        Relay_Master_Log_File: mysql-bin.000006
             Slave_IO_Running: Yes //显示yes为成功
            Slave_SQL_Running: Yes //显示yes为成功,如果为no,一般为没有启动master
              Replicate_Do_DB: test
          Replicate_Ignore_DB: mysql//上面的都是配置文件中的信息
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 357
              Relay_Log_Space: 697
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: //如果为no,此处会显示错误信息
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 2
                  Master_UUID: be0a41c0-2b40-11e8-b791-000c29267b6a
             Master_Info_File: /usr/local/mysql/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
1 row in set (0.00 sec)
 
ERROR:
No query specified

Remarque : Si Slave_IO_Running : Non et l'erreur suivante se produit

Last_IO_Error : erreur fatale : le thread d'E/S esclave s'arrête car le maître et l'esclave ont des UUID de serveur MySQL égaux ; ces UUID doivent être différents pour que la réplication fonctionne.

Cela signifie que l'UUID du serveur maître et l'UUID du serveur esclave sont répétés, car j'ai cloné une base de données directement après l'avoir installée avec succès, donc leurs UUID sont les mêmes, et cette erreur sera signalée. Vous pouvez modifier l'UUID de la bibliothèque esclave.

Nous générons d'abord un UUID dans la base de données à partir de la bibliothèque

mysql>select UUID();

Copiez l'UUID demandé à partir de la base de données, puis modifiez le fichier de configuration UUID de la bibliothèque esclave

Si vous avez également installé le même que moi, le chemin vers le fichier de configuration devrait être ici :

[root@localhost ~]# vi /usr/local/mysql/data/auto.cnf

Après avoir entré, remplacez une chaîne d'UUID 32 bits par les UUID que nous venons d'interroger dans la base de données.

Si Slave_IO_Running : Non et l'erreur suivante se produit

Erreur fatale 1236 du maître lors de la lecture des données du journal binaire : "Impossible de trouver le premier nom de fichier journal dans le fichier d'index du journal binaire"

Solution : Réinitialiser

mysql>stop slave; //停止
mysql>reset slave; //复位
mysql>start slave; //开启

À ce stade, l'ensemble du processus est configuré.

Certains amis peuvent demander, j'ai configuré ces fichiers de configuration et les informations sont les mêmes que les vôtres. Je ne suis toujours pas sûr que la configuration soit réussie.

Vous pouvez ensuite créer une table sur le serveur maître, puis interroger la table nouvellement créée sur le serveur esclave pour voir si elle existe.

6、Conseils

6.1. En ce qui concerne l'incohérence des données maître-esclave en ce qui concerne les ajouts, les suppressions, les révisions et les demandes :

#select 语句,暂时没有发现问题
 
#insert 语句,暂时没有发现问题
 
#update 语句,暂时没有发现问题
 
#delete 语句,主库删除多条数据,发现数据不一致

Raison : Il y a bien une instruction de suppression dans le logbin de la bibliothèque principale, mais il n'y a pas d'instruction de suppression dans le logbin de la bibliothèque esclave

Solution : utilisez la base de données pour sélectionner la base de données qui doit être utilisée dans le schéma de base de données actuel, puis exécutez la suppression, OK la synchronisation est réussie

6.2, la méthode d'interrogation du journal maître-esclave binlog

#查看binlog全部文件
mysql>show binary logs;
 
#查看binlog是否开启NO为开启
mysql> show variables like 'log_bin%';
 
#详细信息
mysql>  show variables like 'binlog%';
 
#查看binlog日志
mysql> show binlog events in'mysql-bin.000019';
 
#或者使用mysqlbinlog,如果报错使用--no-defaults(使用全路径)
[root@localhost ~]# /usr/local/mysql/bin/mysqlbinlog --no-defaults /usr/local/mysql/data/mysql-bin.000019

6.3. Nettoyer manuellement le journal principal, il est préférable de fermer le journal, dans /etc/my.cnf

#手动刷新日志
mysql> show master status;
#删除全部
mysql> reset slave;或 rest master;
#删除MySQL-bin.004
mysql> PURGE MASTER LOGS TO 'MySQL-bin.004';

Je suppose que tu aimes

Origine blog.csdn.net/ytp552200ytp/article/details/125987646
conseillé
Classement