이 글에서는 주로 MySQL 마스터-슬레이브 복제 방법을 소개합니다. GTID 기반 복제는 MySQL 5.6 이후의 새로운 복제 방식입니다.
GTID 기반 복제
소개
GTID 기반 복제는 MySQL 5.6 이후의 새로운 복제 방식입니다.
GTID(Global Transaction Identifier)는 메인 데이터베이스에 제출된 각 트랜잭션이 클러스터에서 고유한 ID를 갖도록 보장하는 글로벌 트랜잭션 ID입니다.
원본 로그 기반 복제에서는 , 슬레이브 라이브러리는 증분 동기화를 수행할 오프셋을 마스터 라이브러리에 알려야 합니다. 지정된 오류가 지정되면 데이터가 생략되어 데이터 불일치가 발생합니다.
GTID 기반 복제에서 슬레이브 라이브러리는 inform 메인 라이브러리에서 실행된 트랜잭션의 GTID 값을 알려주면 메인 라이브러리는 실행되지 않은 모든 트랜잭션의 GTID 목록을 슬레이브 라이브러리에 반환하고 동일한 트랜잭션이 한 번만 실행되도록 할 수 있습니다. 지정된 슬레이브 라이브러리에서
실전 전투
1. 마스터 데이터베이스에 복제 계정을 생성하고 권한을 부여합니다
GTID 기반 복제는 슬레이브 데이터베이스의 데이터를 슬레이브 데이터베이스로 자동 복사하므로 실행된 트랜잭션이 재생되므로 다른 슬레이브 라이브러리에 동일한 계정을 생성하면 복제 링크 오류가 발생할 수 있습니다. .
mysql> create user 'repl'@'172.%' identified by '123456';
특정 비밀번호 강도를 달성하려면 프로덕션의 비밀번호가 관련 표준화를 따라야 하며, 메인 데이터베이스는 슬레이브 데이터베이스의 특정 네트워크 세그먼트에서만 액세스할 수 있다고 규정해야 합니다.
mysql> grant replication slave on *.* to 'repl'@'172.%';
사용자 보기
mysql> select user, host from mysql.user; +-----------+-----------+ | user | host | +-----------+-----------+ | prontera | % | | root | % | | mysql.sys | localhost | | root | localhost | +-----------+-----------+ 4 rows in set (0.00 sec)
권한 보기
mysql> show grants for repl@'172.%'; +--------------------------------------------------+ | Grants for repl@172.% | +--------------------------------------------------+ | GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.%' | +--------------------------------------------------+ 1 row in set (0.00 sec)
2. 기본 데이터베이스 서버 구성
[mysqld] log_bin = /var/log/mysql/mysql-bin log_bin_index = /var/log/mysql/mysql-bin.index binlog_format = row server_id = 101 gtid_mode = ON enforce_gtid_consistency = ON #log_slave_updates = ON
참고: 좋습니다. 로그와 데이터를 분리하는 습관을 들이는 것이 가장 좋습니다.
Enforce_gtid_consistency 활성화한 후에는 다음 명령을 더 이상 사용할 수 없습니다. 🎜>
테이블 만들기... 선택...mysql> create table dept select * from departments; ERROR 1786 (HY000): Statement violates GTID consistency: CREATE TABLE ... SELECT.
이벤트이므로 분할하여 먼저 테이블을 만든 다음 삽입할 수 있습니다. 테이블에 데이터
create temporary table
mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> create temporary table dept(id int); ERROR 1787 (HY000): Statement violates GTID consistency: CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can only be executed outside transactional context. These statements are also not allowed in a function or trigger because functions and triggers are also considered to be multi-statement transactions.
업데이트트랜잭션 테이블 및 비트랜잭션 테이블(MyISAM)
mysql> CREATE TABLE `dept_innodb` (id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT); Query OK, 0 rows affected (0.04 sec) mysql> CREATE TABLE `dept_myisam` (id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT) ENGINE = `MyISAM`; Query OK, 0 rows affected (0.03 sec) mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> insert into dept_innodb(id) value(1); Query OK, 1 row affected (0.00 sec) mysql> insert into dept_myisam(id) value(1); ERROR 1785 (HY000): Statement violates GTID consistency: Updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables.
3. 슬레이브 서버
master_info_repository 및 Relay_log_info_repository를 구성합니다. MySQL 5.6.2 이전에는 슬레이브가 기록한 마스터 정보와 슬레이브 애플리케이션의 binlog 정보는 master.info, Relay-log.info라는 파일에 저장되어 있다. 버전 5.6.2 이후에는 테이블에 기록하는 것이 허용된다. 해당 테이블은 mysql.slave_master_info이다. mysql.slave_relay_log_info, 이 두 테이블은 innodb 엔진 테이블입니다.[mysqld] log_bin = /var/log/mysql/mysql-bin log_bin_index = /var/log/mysql/mysql-bin.index server_id = 102 # slaves relay_log = /var/log/mysql/relay-bin relay_log_index = /var/log/mysql/relay-bin.index relay_log_info_file = /var/log/mysql/relay-bin.info enforce_gtid_consistency = ON log_slave_updates = ON read_only = ON master_info_repository = TABLE relay_log_info_repository = TABLE
4. 슬레이브 데이터 초기화 - [선택]
마스터 라이브러리에 데이터를 백업합니다. first코드는 다음과 같습니다.mysqldump --single-transaction --master-data=2 --triggers --routines --all-databases --events -u root -p > backup.sql
일반적인 오류
데이터베이스에서 SQL을 가져오면 이 나타납니다. 코드는 다음과 같습니다.ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.
5. GTID 기반 복제를 시작합니다
기존 master@172.20.0.2 및slave@172.20.0.3, 이제 mysqldump를 통해 슬레이브 데이터베이스 슬레이브에 데이터가 동기화되었습니다. serverslave 복제 링크 구성mysql> change master to master_host='master', master_user='repl', master_password='123456', master_auto_position=1; Query OK, 0 rows affected, 2 warnings (0.06 sec)
mysql> start slave;
mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Queueing master event to the relay log Master_Host: master Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 12793692 Relay_Log_File: relay-bin.000002 Relay_Log_Pos: 1027 Relay_Master_Log_File: mysql-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: 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: 814 Relay_Log_Space: 12794106 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: 5096 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 101 Master_UUID: a9fd4765-ec70-11e6-b543-0242ac140002 Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Reading event from the relay log Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: a9fd4765-ec70-11e6-b543-0242ac140002:1-39 Executed_Gtid_Set: a9fd4765-ec70-11e6-b543-0242ac140002:1-4 Auto_Position: 1 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: 1 row in set (0.00 sec)
6. 장점
로그 오프셋을 수동으로 설정할 필요가 없기 때문에 손쉽게 Failover를 수행할 수 있다
log_slave_updates인 경우 활성화되면 슬레이브 데이터베이스가 작동하지 않습니다. 기본 데이터베이스의 모든 수정 사항이 손실됩니다
SQL 실행에 제약이 있습니다
MySQL 5.6 이후 버전만 지원하며, 5.6 이전 버전은 사용을 권장하지 않습니다
위 내용은 MySQL 마스터-슬레이브 복제 실습 - GTID 기반 복제 코드 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!