[Oracle Cloud] MDS 간의 Inbound Replication을 사용해 보았습니다.

13485 단어 oraclecloudoci

소개



이전 기사에서는 Compute Instance와 MySQL Database Service 간의 복제를 시도했습니다. 이번 기사는 MySQL Database Service 동시 복제를 시도합니다.

Document 에는 명기되어 있지 않은 구성입니다만, 기술적으로 할 수 있을지 어떨지를 시도해 보았습니다. 절차를 비망록적으로 남겨 둡니다.

MDS 2대 준비



MySQL Database Service에서 MySQL 인스턴스 2개를 준비합니다.



Source : 테스트 데이터 작성



만든 Source MySQL에 테스트 데이터를 만듭니다.sugitest 스키마 작성
mysql> create database sugitest;
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sugitest           |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql>
sample 테이블 만들기
use sugitest;

CREATE TABLE sample(
 id INT(11) NOT NULL AUTO_INCREMENT,
 value INT(5) NOT NULL DEFAULT 0,
 PRIMARY KEY (id)
);

INSERT INTO sample(value) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);

Source : 복제 사용자 설정



사용자 작성
CREATE USER rpluser001@'%' IDENTIFIED BY 'Rpl001#!' REQUIRE SSL;

REPLICATION SLAVE 권한 부여
GRANT REPLICATION SLAVE on *.* to rpluser001@'%';

Source : Dump 파일을 Export



MDS를 만들 때 지정한 사용자로 MySQL Shell을 사용하여 연결
mysqlsh [email protected]

아무 것도 생각하지 않고 전체 MDS 인스턴스의 Dump를 검색하면 오류가 발생합니다.
 MySQL  10.0.12.41:3306 ssl  JS > util.dumpInstance("MDStoMDS1", {osBucketName: "mysqldump", osNamespace: "orasejapan", threads: 4, ocimds: true, compatibility: ["strip_restricted_grants"]})
Acquiring global read lock
NOTE: Error acquiring global read lock: MySQL Error 1227 (42000): Access denied; you need (at least one of) the RELOAD or FLUSH_TABLES privilege(s) for this operation
WARNING: The current user lacks privileges to acquire a global read lock using 'FLUSH TABLES WITH READ LOCK'. Falling back to LOCK TABLES...
Locking instance for backup
ERROR: Could not acquire backup lock: MySQL Error 1227 (42000): Access denied; you need (at least one of) the BACKUP_ADMIN privilege(s) for this operation
ERROR: Unable to acquire global read lock neither table read locks.
Global read lock has been released
Util.dumpInstance: Unable to lock tables: MySQL Error 1227 (42000): Access denied; you need (at least one of) the BACKUP_ADMIN privilege(s) for this operation (RuntimeError)
 MySQL  10.0.12.41:3306 ssl  JS >
BACKUP_ADMIN 권한을 부여하라고 말하지만 MDS에서는 부여할 수 없습니다.
mysql> grant BACKUP_ADMIN on sugitest.* to sugi01@'%';
ERROR 3619 (HY000): Illegal privilege level specified for BACKUP_ADMIN
mysql>

해결 방법은 "consistent":"false"를 지정하여 일관되지 않은 백업을 검색합니다. 일관되지 않은 백업이므로 프로덕션 MDS에서 직접 지정하는 것은 더 이상 사용되지 않습니다. 프로덕션을 실행하는 경우 Snapshot에서 새로운 MDS를 만들고 워크로드가 움직이지 않는 상태에서 일관성 없는 dumpInstance를 실행하는 것이 좋습니다.

dumpInstance는 새 MDS를 만들 때 지정한 사용자가 아닌 경우 오류가 발생합니다.
util.dumpInstance("MDStoMDS1", {osBucketName: "mysqldump", osNamespace: "orasejapan", threads: 4, ocimds: true, compatibility: ["strip_restricted_grants"], "consistent":"false"})

실행 예
 MySQL  10.0.12.41:3306 ssl  JS > util.dumpInstance("MDStoMDS1", {osBucketName: "mysqldump", osNamespace: "orasejapan", threads: 4, ocimds: true, compatibility: ["strip_restricted_grants"], "consistent":"false"})
Gathering information - done
WARNING: The dumped value of gtid_executed is not guaranteed to be consistent
Checking for compatibility with MySQL Database Service 8.0.23
NOTE: User 'admin'@'%' had restricted privilege (PROXY) removed
NOTE: User 'ociadmin'@'127.0.0.1' had restricted privileges (AUDIT_ADMIN, BACKUP_ADMIN, BINLOG_ADMIN, BINLOG_ENCRYPTION_ADMIN, CLONE_ADMIN, CREATE TABLESPACE, ENCRYPTION_KEY_ADMIN, FILE, FLUSH_OPTIMIZER_COSTS, FLUSH_STATUS, FLUSH_TABLES, FLUSH_USER_RESOURCES, GROUP_REPLICATION_ADMIN, INNODB_REDO_LOG_ARCHIVE, INNODB_REDO_LOG_ENABLE, PERSIST_RO_VARIABLES_ADMIN, PROXY, RELOAD, REPLICATION_SLAVE_ADMIN, ROLE_ADMIN, SERVICE_CONNECTION_ADMIN, SESSION_VARIABLES_ADMIN, SET_USER_ID, SHOW_ROUTINE, SHUTDOWN, SUPER, SYSTEM_USER, SYSTEM_VARIABLES_ADMIN, TABLE_ENCRYPTION_ADMIN) removed
NOTE: User 'ocirpl'@'%' had restricted privileges (GROUP_REPLICATION_ADMIN, RELOAD, REPLICATION_SLAVE_ADMIN, SERVICE_CONNECTION_ADMIN, SYSTEM_USER, SYSTEM_VARIABLES_ADMIN) removed
NOTE: User 'sugi01'@'%' had restricted privilege (ALL PRIVILEGES) removed
NOTE: Database sugitest had unsupported ENCRYPTION option commented out
Compatibility issues with MySQL Database Service 8.0.23 were found and repaired. Please review the changes made before loading them.
Writing global DDL files
Writing users DDL
Preparing data dump for table `sugitest`.`sample`
Writing DDL for schema `sugitest`
Data dump for table `sugitest`.`sample` will be chunked using column `id`
Running data dump using 4 threads.
NOTE: Progress information uses estimated values and may not be accurate.
Writing DDL for table `sugitest`.`sample`
Data dump for table `sugitest`.`sample` will be written to 1 file
1 thds dumping - 100% (10 rows / ~10 rows), 5.00 rows/s, 22.00 B/s uncompressed, 0.00 B/s compressed
Duration: 00:00:01s
Schemas dumped: 1
Tables dumped: 1
Uncompressed data size: 42 bytes
Compressed data size: 0 bytes
Compression ratio: 42.0
Rows written: 10
Bytes written: 0 bytes
Average uncompressed throughput: 22.08 B/s
Average compressed throughput: 0.00 B/s
 MySQL  10.0.12.41:3306 ssl  JS >

Replica : Dumpfile 가져오기



Replica 용 MDS로 Dumpfile을 가져옵니다. MySQL Shell로 연결
mysqlsh [email protected]

Dumpfile 가져오기
util.loadDump("MDStoMDS1", {osBucketName: "mysqldump", osNamespace: "orasejapan", threads: 4})

실행 예
 MySQL  mdsreplica01.mysqlsubnet01.vcn.oraclevcn.com:3306 ssl  JS > util.loadDump("MDStoMDS1", {osBucketName: "mysqldump", osNamespace: "orasejapan", threads: 4})
Loading DDL and Data from OCI ObjectStorage bucket=mysqldump, prefix='MDStoMDS1' using 4 threads.
Opening dump...
Target is MySQL 8.0.23-cloud (MySQL Database Service). Dump was produced from MySQL 8.0.23-cloud
Fetching dump data from remote location...
Fetching 1 table metadata files for schema `sugitest`...
Checking for pre-existing objects...
Executing common preamble SQL
Executing DDL script for schema `sugitest`
[Worker000] Executing DDL script for `sugitest`.`sample`
[Worker001] sugitest@sample@@0.tsv.zst: Records: 10  Deleted: 0  Skipped: 0  Warnings: 0
Executing common postamble SQL

1 chunks (10 rows, 42 bytes) for 1 tables in 1 schemas were loaded in 1 sec (avg throughput 42.00 B/s)
0 warnings were reported during the load.
 MySQL  mdsreplica01.mysqlsubnet01.vcn.oraclevcn.com:3306 ssl  JS >

GTID 기반 복제는 GTID를 사용하여 트랜잭션을 얼마나 많이 복제했는지 관리합니다. MySQL Shell 유틸리티는 Replica 측에서 GTID 관련 설정이 필요합니다.
Object Storage의 json 메타데이터에서 gtidExecuted를 가져와 메모합니다.

Object Storage @.json 파일을 다운로드합니다.


@.json 파일 내용은 다음과 같습니다. 이 중 gtidExecuted를 적어 둡니다.
{
    "dumper": "mysqlsh Ver 8.0.23 for Linux on x86_64 - for MySQL 8.0.23 (MySQL Community Server (GPL))",
    "version": "1.0.2",
    "origin": "dumpInstance",
    "schemas": [
        "sugitest"
    ],
    "basenames": {
        "sugitest": "sugitest"
    },
    "users": [
        "'admin'@'%'",
        "'administrator'@'%'",
        "'ociadmin'@'127.0.0.1'",
        "'ocirpl'@'%'",
        "'rpluser001'@'%'",
        "'sugi01'@'%'"
    ],
    "defaultCharacterSet": "utf8mb4",
    "tzUtc": true,
    "bytesPerChunk": 64000000,
    "user": "admin",
    "hostname": "mysql-client01",
    "server": "pzrhc2uodjtnf8yi",
    "serverVersion": "8.0.23-cloud",
    "gtidExecuted": "e37d8e20-5d61-11eb-9d40-0200170045b9:1-10",
    "gtidExecutedInconsistent": true,
    "consistent": false,
    "mdsCompatibility": true,
    "begin": "2021-01-23 11:38:01"
}

메모된 값을 사용하여 gtid_purged를 수행합니다. Replica에 MySQL Client(MySQL Shell이 ​​아님)를 사용하여 연결합니다. 다음에 기록한 값을 사용하여 명령을 실행합니다.
mysql> call sys.set_gtid_purged("e37d8e20-5d61-11eb-9d40-0200170045b9:1-10");
Query OK, 0 rows affected (0.00 sec)

mysql>

확인
mysql> select @@gtid_purged;
+-------------------------------------------+
| @@gtid_purged                             |
+-------------------------------------------+
| e37d8e20-5d61-11eb-9d40-0200170045b9:1-10 |
+-------------------------------------------+
1 row in set (0.00 sec)

mysql>


memo : 오류가 발생하면
mysql> call sys.set_gtid_purged("0e1a6a53-5cac-11eb-8d54-02001701e97e:1-10");
ERROR 3546 (HY000): @@GLOBAL.GTID_PURGED cannot be changed: the added gtid set must not overlap with @@GLOBAL.GTID_EXECUTED

memo : 다음 gtid_purged가 비어 있지 않으면 오류가 발생합니다.
mysql> show global variables like 'GTID%';
+----------------------------------+------------------------------------------------------------------------------------+
| Variable_name                    | Value                                                                              |
+----------------------------------+------------------------------------------------------------------------------------+
| gtid_executed                    | 0e1a6a53-5cac-11eb-8d54-02001701e97e:1-5,
cbcefcc6-5cb0-11eb-8761-020017004a1e:1-7 |
| gtid_executed_compression_period | 0                                                                                  |
| gtid_mode                        | ON                                                                                 |
| gtid_owned                       |                                                                                    |
| gtid_purged                      | 0e1a6a53-5cac-11eb-8d54-02001701e97e:1-3                                           |
+----------------------------------+------------------------------------------------------------------------------------+
5 rows in set (0.01 sec)

mysql>

Replica : Channel 만들기



OCI Console에서 Create Channel을 수행합니다.



Source로 만든 복제에 대한 사용자를 지정합니다.



Create Channel



Creating이지만 일정 시간 후 Active가 됩니다.



복제 확인



복제되었는지 확인하려면 Source에 테스트 데이터를 넣으십시오.
mysql -h mdssource01.mysqlsubnet01.vcn.oraclevcn.com -u admin -p

현재 데이터
mysql> select * from sugitest.sample;
+----+-------+
| id | value |
+----+-------+
|  1 |     1 |
|  2 |     2 |
|  3 |     3 |
|  4 |     4 |
|  5 |     5 |
|  6 |     6 |
|  7 |     7 |
|  8 |     8 |
|  9 |     9 |
| 10 |    10 |
+----+-------+
10 rows in set (0.00 sec)

mysql>

데이터 삽입
INSERT INTO sugitest.sample(value) VALUES (11);

replica 대상
mysql -h mdsreplica01.mysqlsubnet01.vcn.oraclevcn.com -u admin -p

Replica되었습니다
mysql> select * from sugitest.sample;
+----+-------+
| id | value |
+----+-------+
|  1 |     1 |
|  2 |     2 |
|  3 |     3 |
|  4 |     4 |
|  5 |     5 |
|  6 |     6 |
|  7 |     7 |
|  8 |     8 |
|  9 |     9 |
| 10 |    10 |
| 11 |    11 |
+----+-------+
11 rows in set (0.00 sec)

mysql>

참고 URL

좋은 웹페이지 즐겨찾기