MySQL 데이터베이스 관리 시스템 간단히 알아보기

Stock 418675885 Editorial

MySQL 데이터베이스는 가장 널리 사용되고 있는 오픈 소스 관계형 데이터베이스 관리 시스템으로 LAMP(Linux, Apache, MySQL, PHP/Python/Perl) 스택의 세 번째 요소입니다. MySQL은 여타의 관계형 데이터베이스와 마찬가지로 데이터를 테이블에 저장하여 관리하고, 사용자는 구조화된 쿼리 언어(SQL: Structured Query Language)로 데이터를 추출 및 조작합니다.

MySQL 데이터베이스 개요


MySQL 데이터베이스는 원래 1995년에 MySQL AB라는 스웨덴 회사에서 만든 오픈 소스 RDBMS이었지만, 2008년 썬 마이크로시스템즈 Sun Microsystems에 인수되었다가, 2010년 썬 마이크로시스템즈이 오라클에 인수되면서 현재는 오라클 소유로 되어 있습니다. 오라클은 이미 전세계 데이터베이스 점유율 부동의 1위이자 매우 고가인 상용 데이터베이스 ‘오라클 RDBMS’를 갖고 있었지만, 오픈 소스인 MySQL을 넘겨받아 어쨌든 계속 유지를 하고 있습니다.

MySQL 데이터베이스는 대표적인 오픈 소스 RDBMS지만, 실제로는 GPL(General Public License) 라이센스를 따르는 무료 버전인 ‘커뮤니티 에디션(Community Edition)’과 유료 버전인 ‘스탠다드 에디션(Standard Edition)’, ‘엔터프라이즈 에디션(Enterprise Edition)’, ‘클러스터 캐리어 그레이드 에디션(Cluster Carrier Grade Edition)’으로 나뉘어 있습니다. 많은 오픈 소스 소프트웨어들이, 비용이 들더라도 오픈 소스에서는 찾아보기 어려운 ‘신속하고 책임있는 기술지원’을 일반 상용 소프트웨어보다는 저렴한 가격에 받고 싶은 기업 고객과 오픈 소스의 관리 및 개발에 투자할 비용이 필요한 오픈 소스 커뮤니티, 양쪽의 니즈를 모두 충족시켜주는 이중 라이센스 방식을 채택하고 있습니다. 무료 커뮤니티 에디션은 MySQL 웹사이트(https://dev.mysql.com/downloads/)에서 다운로드 할 수 있습니다.

MySQL 데이터베이스는 윈도우, 리눅스, 유닉스 등 여러 운영체제에서 사용 가능하며, 다양한 API를 통해  C++, Java, Python, PHP, Go, Ruby, Delphi 등 많은 프로그래밍 언어를 지원하지만, LAMP(Linux, Apache, MySQL, PHP/Python/Perl) 스택의 구성 요소로서 주로 웹 애플리케이션 개발에 널리 사용됩니다. 워드프레스 웹사이트는 LAMP 스택을 사용하는 대표적인 웹 애플리케이션입니다.

관계형 데이터베이스란 무엇인가


MySQL 데이터베이스는 관계형 데이터베이스 관리 시스템입니다. 관계형 데이터베이스(RDBMS: Relational Database Management System)는 데이터를 여러 테이블에 저장하며 키(Key)라는 개념을 이용하여 각 테이블의 관계를 설정하고 데이터를 관리합니다.

MySQL 데이터베이스 관리 시스템

예를 들어, 위와 같이 여러개의 테이블로 구성된 상품 판매 웹사이트의 데이터베이스가 있다고 할 때, 고객으로부터 상품 주문이 들어오면 데이터베이스는 OrderID라는 기본 키 즉, 고유하게 식별되는 값을 부여하여 해당 주문건을 Order 테이블에 기록합니다.

Order 테이블에는 주문 고객의 CustomerID가 함께 저장되는데, CustomerID는 고객 정보 테이블인 Customer의 기본 키이므로 이를 이용하여 이름, 주소, 우편번호, 성별, 생일, 휴대폰 번호 등 해당 고객의 상세 정보를 추출할 수 있습니다.

Order 테이블의 SalemanID는 판매자 정보 테이블인 Saleman의 기본 키이므로 이를 이용하여 해당 판매자 상세 정보를, Order 테이블의 OrderID는 주문 정보 테이블인 OrderDetail의 기본 키이므로 이를 이용하여 해당 주문 상세 내역을 추출할 수 있습니다.

OrderDetail의 ProductID는 상품 테이블인 Product의 기본 키이므로 이를 이용하여 해당 상품 정보, Product의 BrandID는 브랜드 테이블 Brand의 기본 키이므로 이를 이용하여 해당 브랜드 정보를, 그리고 Product의 SupplierID는 공급자 테이블인 Supplier의 기본 키이므로 이를 이용하여 해당 공급자 정보를 추출할 수 있습니다.

이렇게 각 테이블의 고유한 키를 ‘기본 키(Primary Key)’, 다른 테이블과의 연결 설정을 위해 해당 테이블의 기본 키 값을 갖고 있는 참조용 키를 ‘외래 키(Foreign Key)’라고 합니다. 관계형 데이터베이스는 이와 같이 기본 키와 외래 키로 연결된 여러 테이블에 데이터를 저장 및 관리하는 시스템입니다.

MySQL 데이터베이스의 장점과 특징


MySQL 데이터베이스는 오픈 소스임에도 불구하고 그 우수한 성능과 유연성을 인정받으며 오랫동안 업계 2위 자리를 지켜오고 있습니다. MySQL 데이터베이스가 꾸준히 인기를 얻고 있는 이유를 살펴봅니다.

  • 오픈 소스: MySQL은 오픈 소스 데이터베이스이기 때문에 무료로 다운로드하여 자유롭게 사용할 수 있고 필요시 수정도 가능합니다.
  • 커뮤니티 지원: 오픈 소스답게 MySQL 데이터베이스는 방대한 규모의 커뮤니티를 갖고 있어 각종 문서와 다양한 리소스를 사용할 수 있고, 수많은 개발자들과 사용자들로 구성된 커뮤니티 회원들과 소통하면서 통해 기술지원 및 컨설팅, 최신 뉴스 등을 얻을 수 있습니다.
  • 크로스 플랫폼 호환: 개발자는 MySQL을 윈도우 Windows, 리눅스 Linux, 맥 macOS 등 다양한 운영체제에 호환성 문제 없이 배포할 수 있습니다.
  • 뛰어난 확장성: MySQL는 대용량 데이터를 처리하도록 설계되어, 데이터 요구가 증가하면 서버의 갯수를 늘리는 수평 확장(복제 Replication)을 통해 로드를 분산합니다. 원본 서버는 데이터 쓰기에 할당하고, 여러개의 복제 서버(레플리카 서버)는 데이터 읽기에 할당하는 방식이 일반적입니다.
  • 우수한 성능: MySQL은 읽기 및 쓰기 성능이 우수하고 복잡한 쿼리를 빠르게 처리하는 것으로 알려져 있습니다. 다중 사용자 접속 및 다중 트랜잭션을 지원하므로 효율성 면에서도 뛰어납니다.
  • 일관성과 신뢰성: MySQL은 ACID 트랜잭션 지원함으로써 데이터의 일관성과 신뢰성을 보장하므로, 데이터 무결성이 강조되는 시나리오에 최적화되어 있습니다.
  • 보안 기능: MySQL에는 데이터 보호를 위해 사용자 인증 및 접근 권한 설정, 데이터 암호화 등의 강력한 보안 기능을 제공합니다.
  • 사용 용이성: MySQL은 사용자 친화적이고 사용하기 쉽습니다. 설정도 간단한 편이고 문서도 아주 잘되어 있어 초보자도 부담없이 접근할 수 있습니다.
  • 웹 기술과의 호환성: MySQL은 PHP, Python, Java 등 다양한 웹 프로그래밍 언어를 지원하므로 웹 애플리케이션 개발에 많이 사용됩니다.
  • 인덱싱: MySQL 데이터베이스는 특정 열 또는 열의 조합에 대해 빠른 검색을 가능하게 하는 인덱스를 생성하여 데이터 검색 및 전체 시스템 성능을 향상시킵니다. MySQL의 인덱스는 데이터 저장 방식에 따라 클러스터형 인덱스(Clustered/Primary Index)와 비클러스터형 인덱스(Non-clustered/Secondary Index), 그리고 자료 구조에 따라 B-트리 인덱스(B-Tree Index), 해시 인덱스(Hash Index), 프랙탈-트리(Fractal-Tree Index) 등으로 나뉩니다.

ACID 데이터베이스 트랜잭션 모델


대부분의 관계형 데이터베이스와 마찬가지로 MySQL 데이터베이스도 ACID 트랜잭션 모델을 채택하고 있습니다. 여기에서 트랜잭션이란 한 개의 논리적 작업 단위로, 데이터베이스에서 수행되는 일련의 작업 그룹을 의미합니다. 트랜잭션은 여러 개의 하위 단계로 구성되며, 한 단계라도 실패하면 전체 트랜잭션이 실패한 것으로 간주됩니다. 트랜잭션은 완료되었거나 아예 실행되지 않았거나 이 둘 중 하나이며, ‘진행중’이라든지 ‘부분 완료’ 같은 중간 개념은 없습니다. 

ACID는 다음과 같은 트랜잭션의 4가지 속성을 가리키는 용어입니다.

  • 원자성(Atomicity) 

트랜잭션을 분할할 수 없는 하나의 단위로 취급하는 속성으로, 일련의 작업들이 모두 실행되어 완료되었거나 아예 한 단계도 실행되지 않았거나, 둘 중 하나의 상태를 보장하는 속성입니다. 은행의 계좌이체 트랜잭션을 예로 들어보면, 송금자의 계좌에서 이미 금액이 출금되었는데 수신자의 계좌로 입금되기 직전 상태에서 서버 오류 등으로 인해 트랜잭션이 중단되어버린다면 이는 매우 복잡한 문제를 야기하게 됩니다. 이럴 때 원자성에 근거하여 아예 트랜잭션이 일어나지 않았던 시점으로 돌려놓으면, 그 어떤 손실도 문제도 발생하지 않은 상태에서 서버 정상화 후 트랜잭션을 처음부터 다시 시작할 수 있습니다. 데이터 커밋(Commit)과 롤백(Rollback) 기능을 이용하여 이를 구현합니다.

  • 일관성(Consistency) 

일관성은 데이터 무결성 제약 조건을 유지해야 한다는 속성으로, 다양한 데이터베이스, 시스템 및 애플리케이션 전반에 걸쳐 유효한 데이터만 기록하며 균일하고 정확한 데이터 품질을 유지해야 한다는 의미입니다. 일관성을 적용하면 데이터베이스의 데이터 무결성 제약 조건 위반이 발생하는 경우 프로세스가 중단되고 변경 사항은 이전 상태로 롤백됩니다.

  • 격리(Isolation)

여러 트랜잭션이 서로 간섭하지 않으면서 동일한 데이터에 액세스할 수 있도록 해야 한다는 속성으로, 한 트랜잭션이 데이터를 읽거나 수정하는 동안은 다른 트랜잭션이 해당 데이터에 액세스할 수 없도록 격리하는 것입니다. 실제로는, 아직 반영되지 않은 변경 사항을 읽는 정도는 허용해주는 낮은 수준의 격리부터 무조건 하나의 트랜잭션이 끝나야만 다른 트랜잭션이 시작할 수 있게 하는 높은 수준의 격리까지, 데이터베이스에서 트랜잭션이 격리되는 정도를 조정할 수 있습니다.

  • 내구성(Durability)

트랜잭션 실행으로 인해 데이터에 적용된 변경 사항이 영구적으로 유지되도록 보장하는 것으로 ACID에서 가장 중요한 속성이기도 합니다. 주로 비휘발성 저장 매체에 트랜잭션 로그를 저장하는 방법으로 내구성을 구현하는데, 이는 중단, 충돌, 정전 등의 시스템 오류가 발생하는 경우에도 시스템 내의 데이터가 유지될 수 있도록 해줍니다.

MySQL 데이터베이스 관리 전용 유틸리티: mysqladmin


mysqladmin은 MySQL 데이터베이스와 함께 제공되는 커맨드-라인 방식의 관리용 유틸리티입니다. myqsladmin을 이용하면 MySQL에 직접 접속하지 않고도 리눅스 쉘 상태에서 MySQL 서버 구성 및 현재 상태 확인, 데이터베이스를 생성 및 삭제, 사용자 접속 제어, 캐시 데이터 관리, 계정 패스워드 변경 등의 다양한 관리 작업을 수행할 수 있습니다.

호스팅중인 블루호스트 리눅스 쉘에서 간단한 mysqladmin 명령어들을 실행해보았습니다.

1. 서버 상태 확인: mysqladmin -u username -p status

MySQL 데이터베이스: mysqladmin

MySQL의 총 실행 시간, 현재 작업중인 스레드 수, 오픈된 데이터베이스 및 테이블 수, 초당 처리하는 평균 쿼리 수 등을 확인할 수 있습니다.

2. 서버 실행 여부 확인: mysqladmin -u username -p ping

MySQL 데이터베이스: mysqladmin

MySQL 서버가 실행되고 있는 상태인지 여부를 보여줍니다.

3. 서버 버전 정보 확인: mysqladmin -u username -p version

MySQL 데이터베이스: mysqladmin

MySQL 버전 정보, mysqladmin 버전 정보, MySQL 저작권 정보, 프로토콜 버전 정보, 소켓 위치 정보, MySQL 총 실행 시간, 현재 작업중인 스레드 수, 오픈된 데이터베이스 및 테이블 수, 초당 처리하는 평균 쿼리 수 등을 확인할 수 있습니다.

4. 현재 접속중인 사용자(스레드) 목록 확인: mysqladmin -u username -p processlist

20240131 130210

현재 MySQL을 사용하고 있는 사용자 목록과 프로세스 ID, 사용자명, 사용자가 접속하고 있는 호스트명, 사용중인 데이터베이스, 사용자의 현재 명령, 현재 명령 상태에서 프로세스 동작 시간, 사용자 상태, 현재 실행중인 SQL 명령 등의 사용자 상세 정보를 확인할 수 있습니다.

Leave a Reply

Your email address will not be published. Required fields are marked *