MySQL 마스터-슬레이브 복제 구성에 대한 자세한 설명

1. 환경 구성

운영 체제: CentOS 7.6이 설치된 두 개의 Linux 시스템

데이터베이스 버전: MySQL 5.6.39

주 서버 IP: 192.168.0.1

슬레이브 서버 IP: 192.168.0.2

2. 데이터베이스 설치

이전에 친구들에게 CentOS에 MySQL을 설치하는 단계를 자세히 설명한 적이 있습니다. 못 보신 분들은 여기를 클릭하세요.

" 리눅스 환경에서 MySQL을 설치하기 위한 세부 단계 "

3. 구성 전제 조건

1. MySQL 설치에 도입된 포트 3306에서 방화벽이 열리거나 닫혀 있는지 확인해야 합니다.

2. 두 서버가 서로 ping할 수 있음

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

3. MySQL을 성공적으로 설치한 후 가상 머신을 사용하여 하나를 슬레이브 서버로 복제합니다.

4. 마스터 데이터베이스 구성

4.1 데이터베이스 설정 파일 수정

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

내부 내용을 다음으로 변경

[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

로그 저장 방법 및 규칙 추가(선택 사항)

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

참고: 저는 로그의 저장 용량을 비교적 작게 설정했지만, 물론 실제 상황에 따라 더 크게 수정할 수 있습니다.

4.2, 데이터베이스 서비스 mysqld 다시 시작

service mysqld restart

위와 같이 mysql을 올바르게 설치했다면 여기에서 정상적으로 재시작할 수 있다. 시작이 정상이 아닌 경우 다음과 같은 오류가 나타납니다.

PID 파일을 업데이트하지 않고 서버가 종료됩니다.....

여전히 mysqld 프로세스가 있는지 확인하려면 다음 명령을 사용해야 합니다.

ps -ef|grep mysqld

있는 경우 다음 명령을 사용할 수 있습니다. kill -9 mysqld의 프로세스 번호를 사용하여 종료한 다음 mysqld를 다시 시작합니다.

위와 같은 상황을 겪었습니다. 물론 다른 이유가 있습니다. 다음은 참조할 수 있는 다른 가능한 이유에 대한 해결책입니다.

https://javawind.net/p141

4.3 MySQL 데이터베이스에 로그인하여 라이브러리의 메인 라이브러리 로그 허용

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

참고: 첫 번째 로그인에는 루트 암호를 입력할 필요가 없습니다.

입력 후 다음 구성을 수행합니다.

#给从库放权限
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 MySQL 서비스를 다시 시작하고 MySQL에 로그인하여 기본 데이터베이스 정보 보기

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

대략적으로 다음을 보여줍니다.

+------------------+----------+--------------+----------------------------------+-------------------+
| 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)

참고 : 이 단계가 항상 실행 Empty set(0.00 sec)되면 이전 my.cnf가 올바르게 구성되지 않았음을 의미합니다 . 돌아가서 구성 단계를 다시 확인하십시오.

5. 슬레이브 데이터베이스 구성

5.1 슬레이브 라이브러리의 데이터베이스 설정 파일 수정

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

내부 내용을 다음으로 변경

#开启二进制日志
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 MySQL 서비스를 다시 시작하고 MySQL에 로그인

[root@localhost ~]# service mysqld restart

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

다음과 같이 수정합니다.

#关闭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;

참고 : 위의 master_log_file은 Master 설정 시 File 필드이고, master_log_pos는 Master 설정 시 Position 필드입니다. 일치해야합니다
 

5.3 슬레이브 라이브러리의 상태 정보 보기

mysql> show slave status \G;

성공하면 다음 정보가 표시됩니다.

*************************** 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

참고 : Slave_IO_Running: No이고 다음과 같은 오류가 발생하는 경우

Last_IO_Error: 치명적 오류: 마스터와 슬레이브의 MySQL 서버 UUID가 동일하기 때문에 슬레이브 I/O 스레드가 중지됩니다. 복제가 작동하려면 이러한 UUID가 달라야 합니다.

데이터베이스를 성공적으로 설치한 직후 복제했기 때문에 마스터 서버의 UUID와 슬레이브 서버의 UUID가 반복되어 UUID가 동일하고 이 오류가 보고된다는 의미입니다. 슬레이브 라이브러리의 UUID를 수정할 수 있습니다.

먼저 라이브러리의 데이터베이스에 UUID를 생성합니다.

mysql>select UUID();

데이터베이스에서 쿼리한 UUID를 복사한 후 슬레이브 라이브러리의 UUID 구성 파일을 편집합니다.

저와 같은 방법으로 설치하셨다면 설정 파일의 경로는 다음과 같습니다.

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

입력한 후 32비트 UUID 문자열을 데이터베이스에서 방금 쿼리한 UUID로 바꿉니다.

Slave_IO_Running인 경우: No이고 다음과 같은 오류가 발생합니다.

바이너리 로그에서 데이터를 읽을 때 마스터에서 치명적인 오류 1236이 발생했습니다. '바이너리 로그 인덱스 파일에서 첫 번째 로그 파일 이름을 찾을 수 없습니다'

솔루션: 재설정

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

이 시점에서 전체 프로세스가 구성됩니다.

어떤 친구들은 내가 이 구성 파일을 구성했고 정보가 귀하와 동일하다고 물을 수 있습니다. 나는 여전히 구성이 성공했는지 여부를 확신하지 못합니다.

그런 다음 마스터 서버에 테이블을 생성한 다음 슬레이브 서버에 새로 생성된 테이블을 쿼리하여 존재하는지 확인할 수 있습니다.

6, 팁

6.1 추가, 삭제, 수정 및 조회와 관련된 마스터-슬레이브 데이터의 불일치:

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

Reason: 주 라이브러리의 logbin에는 실제로 delete 문이 있지만 슬레이브 라이브러리의 logbin에는 delete 문이 없습니다.

해결 방법: 데이터베이스를 사용하여 현재 데이터베이스 스키마에서 운영해야 하는 데이터베이스를 선택한 다음 삭제를 실행하면 OK 동기화가 성공합니다.

6.2, 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 마스터 로그를 수동으로 정리하려면 /etc/my.cnf에서 로그를 닫는 것이 가장 좋습니다.

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

추천

출처blog.csdn.net/ytp552200ytp/article/details/125987646