MySQL 서버를 Document DB처럼 사용하기 위해 MySQL 5.7.12 버전부터 X Plugin이라는 신규 컴포넌트가 도입되었다. X 플러그인은 도큐먼트 스토어용 MySQL 서버를 위해 반드시 필요한 플러그인이며, MySQL 서버가 X Protocol을 사용해서 클라이언트와 통신할 수 있도록 해준다. 여기서 X 플러그인이 활성화(8.0 default) 되어 있는 MySQL 서버와 상호작용을 할 수 있도록 클라이언트측에 제공되는 것이 X DevAPI이다.
MySQL 도큐먼트 스토어에 연결하기 위해서는 MySQL 서버 인스턴스에 X DevAPI 세션을 생성해야 하는데, 애플리케이션에서 드라이버를 통해 생성할 수도 있지만 인터렉티브한 모드를 제공하는 MySQL Shell을 통해 세션을 생성해보도록 하자.
MySQL Shell은 자바스크립트, 파이썬, SQL로 모드 전환이 가능하며, 기본적으로 자바스크립트와 파이썬에 X DevAPI가 구현되어 있다. (예시는 파이썬)
## MySQLShell 접속
$ mysqlsh -u root -p
MySQL Shell 8.0.35
Copyright (c) 2016, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.
Type '\help' or '\?' for help; '\quit' to exit.
Creating a session to 'root@localhost'
Fetching schema names for auto-completion... Press ^C to stop.
Your MySQL connection id is 706 (X protocol)
Server version: 8.1.0-debug Source distribution
No default schema selected; type \use <schema> to set one.
## 모드 전환
MySQL localhost:33060+ ssl JS > \py
Switching to Python mode...
MySQL localhost:33060+ ssl Py >
(참고로, 세션은 mysqlx 팩토리에 의해 생성되며, 반환된 세션은 X 플러그인을 실행하는 하나 이상의 MySQL 서버 인스턴스에 대한 접근을 캡슐화할 수 있다. )
모드 전환을 하고나서, mysqlx.getSession(connection) 메소드를 사용하여 X DevAPI 세션을 생성한다.
Py> session=mysqlx.get_session('root:<password>@localhost')
Py> db=session.get_schema('test')
Py> print(db)
<Schema:test>
test 스키마에 신규 컬렉션 데이터를 생성하고 조회해본다. mongo 클라이언트와 같이 탭을 누르면 자동완성 및 관련 메소드가 조회된다.
## test 스키마 선택
Py> \use test
## 컬렉션 생성
test Py> db.create_collection('silver')
<Collection:silver>
## 도큐먼트 생성
test Py> db.silver.add({'id':1, 'name':'leebumhwak'})
## 도큐먼트 조회
test Py> db.silver.find()
{
"id": 1,
"_id": "000065505fc20000000000000003",
"name": "leebumhwak"
}
1 document in set (0.0055 sec)
이번에는 SQL 모드로 전환하여 해당 컬렉션이 어떤 테이블 구조로 생성되어 있는지 확인해보자.
## SQL 모드
test Py> \sql
## 테이블 명세 조회
test SQL> show create table silver;
CREATE TABLE `silver` (
`doc` json DEFAULT NULL,
`_id` varbinary(32) GENERATED ALWAYS AS (json_unquote(json_extract(`doc`,_utf8mb4'$._id'))) STORED NOT NULL,
`_json_schema` json GENERATED ALWAYS AS (_utf8mb4'{"type":"object"}') VIRTUAL,
PRIMARY KEY (`_id`),
CONSTRAINT `$val_strict_A7BC7DAEC0FCFED7D6993CED43BC75D6F6B5CC59` CHECK (json_schema_valid(`_json_schema`,`doc`))
)
test Py> SELECT * FROM silver;
+------------------------------------------------------------------------+------------------------------------------------------------+--------------------+
| doc | _id | _json_schema |
+------------------------------------------------------------------------+------------------------------------------------------------+--------------------+
| {"id": 1, "_id": "000065505fc20000000000000003", "name": "leebumhwak"} | 0x30303030363535303566633230303030303030303030303030303033 | {"type": "object"} |
+------------------------------------------------------------------------+------------------------------------------------------------+--------------------+
doc 필드를 통해서 generated column 타입의, 물리적으로 저장되는 _id 필드와 가상의 _json_schema 필드가 자동으로 생성된다.
'MySQL' 카테고리의 다른 글
MySQL 인덱스 컨디션 푸시다운(Index condition pushdown)에 대해서 (0) | 2023.11.12 |
---|---|
[공유] mysql command-line client 실행 파일 (0) | 2023.11.12 |
[MySQL] pt-osc를 활용한 online 테이블 파티션 변경 (1) | 2023.10.31 |
MySQL Aborted connection error (1) | 2023.10.31 |
MySQL Command Line Clinet에 Online DDL 모니터링 기능 추가 (1) | 2023.10.29 |