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';