데이터베이스 서버 구성 및 사용
데이터베이스 서버에서 데이터 설치, 구성, 백업 및 마이그레이션
초록
Red Hat 문서에 관한 피드백 제공 링크 복사링크가 클립보드에 복사되었습니다!
당사는 고품질 문서를 제공하기 위해 노력하고 있으며 여러분의 피드백을 소중하게 생각합니다. 문서 개선을 돕기 위해 Red Hat Jira 추적 시스템을 통해 제안 사항을 제출하거나 오류를 보고할 수 있습니다.
프로세스
Jira 웹 사이트에 로그인합니다.
계정이 없는 경우 옵션을 선택하여 계정을 생성합니다.
- 상단 탐색 메뉴에서 생성 을 클릭합니다.
- 요약 필드에 설명 제목을 입력합니다.
- 설명 필드에 개선을 위한 제안을 입력합니다. 문서의 관련 부분에 대한 링크를 포함합니다.
- 창 하단에서 생성 을 클릭합니다.
1장. MariaDB 사용 링크 복사링크가 클립보드에 복사되었습니다!
MariaDB 서버는 고성능 오픈 소스 RDBMS(관계형 데이터베이스 관리 시스템)입니다. MySQL 기술을 기반으로 구축된 데이터 액세스를 위한 강력한 SQL 인터페이스를 제공하며 여러 스토리지 엔진 지원과 같은 고급 기능을 포함합니다.
RHEL 시스템에 MariaDB를 설치하고 구성하는 방법, MariaDB 데이터를 백업하는 방법, 이전 MariaDB 버전에서 마이그레이션하는 방법, MariaDB Galera 클러스터를 사용하여 데이터베이스를 복제하는 방법을 알아봅니다.
1.1. Installing MariaDB 링크 복사링크가 클립보드에 복사되었습니다!
RHEL 10은 MariaDB 10.11을 Application Stream의 초기 버전으로 제공하며 RPM 패키지로 설치할 수 있습니다. 추가 MariaDB 버전은 RHEL 10의 마이너 릴리스에서 라이프 사이클이 짧은 애플리케이션 스트림으로 제공됩니다.
RHEL 10에서 MariaDB 서버는 다음 버전에서 사용할 수 있으며 각각 별도의 스트림에서 제공합니다.
- MariaDB 10.11
- MariaDB 11.8 - RHEL 10.2 이후 사용 가능
설계에서는 동일한 애플리케이션 스트림의 하나의 버전(스트림)만 설치할 수 있으며, 충돌하는 RPM 패키지 때문에 동일한 호스트에 MariaDB 및 MySQL을 설치할 수 없습니다. 또는 컨테이너에서 데이터베이스 서버 서비스를 실행할 수 있습니다. 단일 호스트에서 여러 MariaDB 및 MySQL 인스턴스를 실행하려면 컨테이너 사용을 참조하십시오.
프로세스
MariaDB 서버 패키지를 설치합니다.
MariaDB 10.11의 경우 다음을 입력합니다.
# dnf install mariadb-serverMariaDB 11.8의 경우 다음을 입력합니다.
# dnf install mariadb11.8-server
mariadb서비스를 활성화하고 시작합니다.# systemctl enable --now mariadb.service
1.2. 컨테이너를 사용하여 단일 호스트에서 여러 MariaDB 및 MySQL 인스턴스 실행 링크 복사링크가 클립보드에 복사되었습니다!
패키지에서 MariaDB 또는 MySQL을 설치하는 경우 이러한 서비스 중 하나만 실행하고 동일한 호스트에서 단일 버전만 실행할 수 있습니다. 또는 컨테이너에서 서비스를 실행할 수 있습니다.
다음 시나리오를 구성할 수 있습니다.
- 동일한 호스트에서 MariaDB 또는 MySQL의 여러 인스턴스를 실행하려고 합니다.
- 동일한 호스트에서 MariaDB 및 MySQL을 모두 실행하려고 합니다.
데이터베이스 서버의 컨테이너 이름과 호스트 포트는 달라야 합니다.
사전 요구 사항
-
podman패키지가 설치되어 있습니다.
프로세스
Red Hat Customer Portal 계정을 사용하여
registry.redhat.io레지스트리에 인증합니다.# podman login registry.redhat.io컨테이너 레지스트리에 이미 로그인한 경우 이 단계를 건너뜁니다.
사용할 컨테이너를 시작합니다.
MariaDB 10.11:
$ podman run -d --name <container_name_1> -e MARIADB_ROOT_PASSWORD=<password> -p <host_port_1>:3306 rhel10/mariadb-1011이 컨테이너 이미지 사용에 대한 자세한 내용은 Red Hat Ecosystem Catalog 를 참조하십시오.
MariaDB 11.8:
$ podman run -d --name <container_name_2> -e MARIADB_ROOT_PASSWORD=<password> -p <host_port_2>:3306 rhel10/mariadb-118이 컨테이너 이미지 사용에 대한 자세한 내용은 Red Hat Ecosystem Catalog 를 참조하십시오.
MySQL 8.4:
$ podman run -d --name <container_name_3> -e MYSQL_ROOT_PASSWORD=<password> -p <host_port_3>:3306 rhel10/mysql-84이 컨테이너 이미지 사용에 대한 자세한 내용은 Red Hat Ecosystem Catalog 를 참조하십시오.
클라이언트가 네트워크의 데이터베이스 서버에 액세스할 수 있도록 하려면 방화벽에서 호스트 포트를 엽니다.
# firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,...} # firewall-cmd --reload
검증
데이터베이스 서버에 연결하고 root로 로그인합니다.
# mysql -u root -p -h localhost -P <host_port> --protocol tcp선택 사항: 실행 중인 컨테이너에 대한 정보를 표시합니다.
$ podman ps
1.3. MariaDB에 대한 네트워크 액세스 구성 링크 복사링크가 클립보드에 복사되었습니다!
데이터베이스 서버에 대한 원격 클라이언트 액세스를 허용하려면 네트워크 인터페이스에서 수신 대기하고 방화벽 포트를 열도록 MariaDB를 구성해야 합니다.
프로세스
/etc/my.cnf.d/mariadb-server.cnf파일의[mysqld]섹션을 편집합니다. 다음 구성 지시문을 설정할 수 있습니다.bind-address- 서버가 수신 대기하는 주소입니다. 가능한 옵션은 다음과 같습니다.- 호스트 이름
- IPv4 주소
- IPv6 주소
skip-networking- 서버가 TCP/IP 연결을 수신 대기하는지 여부를 제어합니다. 가능한 값은 다음과 같습니다.- 0 - 모든 클라이언트를 청취
- 1 - 로컬 고객만 청취
-
port- MariaDB 가 TCP/IP 연결을 수신 대기하는 포트입니다.
클라이언트가 네트워크의 데이터베이스 서버에 액세스할 수 있도록 하려면 방화벽에서 포트를 엽니다.
# firewall-cmd --permanent --add-service=mysql # firewall-cmd --reloadmariadb서비스를 다시 시작합니다.# systemctl restart mariadb.service
1.4. MariaDB 서버에서 TLS 암호화 설정 링크 복사링크가 클립보드에 복사되었습니다!
기본적으로 MariaDB는 암호화되지 않은 연결을 사용합니다. 보안 연결의 경우 MariaDB 서버에서 TLS 지원을 활성화하고 암호화된 연결을 설정하도록 클라이언트를 구성합니다.
1.4.1. MariaDB 서버에 CA 인증서, 서버 인증서 및 개인 키 배치 링크 복사링크가 클립보드에 복사되었습니다!
MariaDB 서버에서 TLS 암호화를 활성화하려면 먼저 인증 기관(CA) 인증서, 서버 인증서 및 개인 키를 MariaDB 서버에 저장합니다.
사전 요구 사항
Privacy Enhanced mail (PEM) 형식의 다음 파일이 서버에 복사되었습니다.
-
서버의 개인 키:
server.example.com.key.pem -
서버 인증서:
server.example.com.crt.pem -
CA(인증 기관) 인증서:
ca.crt.pem
개인 키 및 CSR(인증서 서명 요청) 생성 및 CA에서 인증서를 요청하는 방법에 대한 자세한 내용은 CA 설명서를 참조하십시오.
-
서버의 개인 키:
프로세스
/etc/pki/tls/certs/디렉터리에 CA 및 서버 인증서를 저장합니다.# mv <path>/server.example.com.crt.pem /etc/pki/tls/certs/ # mv <path>/ca.crt.pem /etc/pki/tls/certs/MariaDB 서버가 파일을 읽을 수 있도록 하는 CA 및 서버 인증서에 대한 권한을 설정합니다.
# chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem인증서는 보안 연결이 설정되기 전에 통신의 일부이므로 모든 클라이언트는 인증 없이 이를 검색할 수 있습니다. 따라서 CA 및 서버 인증서 파일에 대한 엄격한 권한을 설정할 필요가 없습니다.
서버의 개인 키를
/etc/pki/tls/private/디렉터리에 저장합니다.# mv <path>/server.example.com.key.pem /etc/pki/tls/private/서버의 개인 키에 대한 보안 권한을 설정합니다.
# chmod 640 /etc/pki/tls/private/server.example.com.key.pem # chgrp mysql /etc/pki/tls/private/server.example.com.key.pem권한이 없는 사용자가 개인 키에 액세스할 수 있는 경우 MariaDB 서버에 대한 연결이 더 이상 안전하지 않습니다.
SELinux 컨텍스트를 복원합니다.
# restorecon -Rv /etc/pki/tls/
1.4.2. MariaDB 서버에서 TLS 암호화 구성 링크 복사링크가 클립보드에 복사되었습니다!
기본적으로 MariaDB는 암호화되지 않은 연결을 사용합니다. 보안 연결을 위해 MariaDB 서버에서 TLS(Transport Layer Security) 지원을 활성화하고 암호화된 연결을 설정하도록 클라이언트를 구성할 수 있습니다.
사전 요구 사항
- MariaDB 서버가 설치되어 있어야 합니다.
-
mariadb서비스가 실행 중입니다. Privacy Enhanced mail (PEM) 형식의 다음 파일은 서버에 존재하며
mysql사용자가 읽을 수 있습니다.-
서버의 개인 키:
/etc/pki/tls/private/server.example.com.key.pem -
서버 인증서:
/etc/pki/tls/certs/server.example.com.crt.pem -
CA(인증 기관) 인증서
/etc/pki/tls/certs/ca.crt.pem
-
서버의 개인 키:
- 서버 인증서의 제목 고유 이름(DN) 또는 SAN(주체 대체 이름) 필드는 서버의 호스트 이름과 일치합니다.
- FIPS 모드가 활성화된 경우 클라이언트는 확장 마스터 시크릿(Extended Master Secret) 확장을 지원하거나 TLS 1.3을 사용해야 합니다. TLS 1.2 연결이 없는 경우 실패합니다. 자세한 내용은 RHEL 9.2 이상에 적용된 Red Hat Knowledgebase 솔루션 TLS 확장 "확장 마스터 시크릿"을 참조하십시오.
프로세스
/etc/my.cnf.d/mariadb-server-tls.cnf파일을 만듭니다.다음 콘텐츠를 추가하여 개인 키, 서버 및 CA 인증서에 대한 경로를 구성합니다.
[mariadb] ssl_key = /etc/pki/tls/private/server.example.com.key.pem ssl_cert = /etc/pki/tls/certs/server.example.com.crt.pem ssl_ca = /etc/pki/tls/certs/ca.crt.pemCRL(Certificate Revocation List)이 있는 경우 이를 사용하도록 MariaDB 서버를 구성합니다.
ssl_crl = /etc/pki/tls/certs/example.crl.pem선택 사항: 암호화 없이 연결 시도를 제거합니다. 이 기능을 활성화하려면 다음을 추가합니다.
require_secure_transport = on선택 사항: 서버가 지원해야 하는 TLS 버전을 설정합니다. 예를 들어 TLS 1.2 및 TLS 1.3을 지원하려면 다음을 추가합니다.
tls_version = TLSv1.2,TLSv1.3기본적으로 서버는 TLS 1.1, TLS 1.2 및 TLS 1.3을 지원합니다.
mariadb서비스를 다시 시작합니다.# systemctl restart mariadb
검증
문제 해결을 간소화하려면 TLS 암호화를 사용하도록 로컬 클라이언트를 구성하기 전에 MariaDB 서버에서 다음 단계를 수행합니다.
MariaDB에 TLS 암호화가 활성화되어 있는지 확인합니다.
# mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'have_ssl';" +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | have_ssl | YES | +---------------+-----------------+have_ssl변수가yes로 설정되면 TLS 암호화가 활성화됩니다.특정 TLS 버전만 지원하도록 MariaDB 서비스를 구성한 경우
tls_version변수를 표시합니다.# mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'tls_version';" +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | tls_version | TLSv1.2,TLSv1.3 | +---------------+-----------------+
1.4.3. MariaDB 서버의 특정 사용자 계정에 대해 TLS 암호화 연결 필요 링크 복사링크가 클립보드에 복사되었습니다!
중요한 데이터 전송을 보호하기 위해 TLS 암호화 연결이 필요하도록 특정 MariaDB 사용자 계정을 구성할 수 있습니다.
모든 연결(require_secure_transport = on)에 보안 전송이 필요한 서버에서 구성할 수 없는 경우, TLS 암호화를 요구하도록 개별 사용자 계정을 구성합니다.
사전 요구 사항
- MariaDB 서버에는 TLS 지원이 활성화되어 있습니다.
- 보안 전송을 요구하도록 구성하는 사용자가 있습니다.
프로세스
관리 사용자로 MariaDB 서버에 연결합니다.
# mysql -u root -p -h server.example.com관리 사용자에게 원격으로 서버에 액세스할 수 있는 권한이 없는 경우 MariaDB 서버에서 명령을 수행하고
localhost에 연결합니다.REQUIRE SSL절을 사용하여 사용자가 TLS 암호화 연결을 사용하여 연결해야 합니다.MariaDB [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;
검증
TLS 암호화를 사용하여 서버에
예제사용자로 연결합니다.# mysql -u example -p -h server.example.com --ssl ... MariaDB [(none)]>오류가 표시되지 않고 대화형 MariaDB 콘솔에 액세스할 수 있는 경우 TLS와의 연결에 성공합니다.
TLS가 비활성화된 사용자로 연결을 시도합니다.
# mysql -u example -p -h server.example.com --skip-ssl ERROR 1045 (28000): Access denied for user 'example'@'server.example.com' (using password: YES)이 사용자에게는 TLS가 필요하지만 비활성화됨(
--skip-ssl)이므로 서버에서 로그인 시도를 거부했습니다.
1.5. 기본적으로 TLS 암호화를 사용하도록 MariaDB 클라이언트 구성 링크 복사링크가 클립보드에 복사되었습니다!
RHEL에서 MariaDB 클라이언트가 TLS 암호화를 사용하도록 전역적으로 구성하고 서버 인증서의 CN(일반 이름)이 사용자가 연결하는 호스트 이름과 일치하는지 확인할 수 있습니다. 이렇게 하면 메시지 가로채기(man-in-the-middle) 공격이 방지됩니다.
사전 요구 사항
- MariaDB 서버에는 TLS 지원이 활성화되어 있습니다.
- RHEL에서 서버의 인증서를 발급한 CA(인증 기관)가 RHEL에서 신뢰할 수 없는 경우 CA 인증서가 클라이언트에 복사됩니다.
- FIPS 모드가 활성화된 경우 이 클라이언트는 Extended Master Secret(ECDSA) 확장을 지원하거나 TLS 1.3을 사용합니다. TLS 1.2 연결이 없는 경우 실패합니다. 자세한 내용은 RHEL 9.2 이상에 적용된 Red Hat Knowledgebase 솔루션 TLS 확장 "확장 마스터 시크릿"을 참조하십시오.
프로세스
RHEL이 서버의 인증서를 발급한 CA를 신뢰하지 않는 경우:
CA 인증서를
/etc/pki/ca-trust/source/anchors/디렉터리에 복사합니다.# cp <path>/ca.crt.pem /etc/pki/ca-trust/source/anchors/모든 사용자가 CA 인증서 파일을 읽을 수 있는 권한을 설정합니다.
# chmod 644 /etc/pki/ca-trust/source/anchors/ca.crt.pemCA 신뢰 데이터베이스를 다시 빌드합니다.
# update-ca-trust
다음 콘텐츠를 사용하여
/etc/my.cnf.d/mariadb-client-tls.cnf파일을 만듭니다.[client-mariadb] ssl ssl-verify-server-cert이러한 설정은 MariaDB 클라이언트가 TLS 암호화(
ssl)를 사용하고 클라이언트가 서버 인증서의 CN과 호스트 이름을 비교함을 정의합니다(ssl-verify-server-cert).
검증
호스트 이름을 사용하여 서버에 연결하고 서버 상태를 표시합니다.
# mysql -u root -p -h server.example.com -e status ... SSL: Cipher in use is TLS_AES_256_GCM_SHA384SSL항목에사용 중인 Cipher가 포함된경우 연결이 암호화됩니다.이 명령에서 사용하는 사용자에게는 원격으로 인증할 수 있는 권한이 있습니다.
연결하는 호스트 이름이 서버의 TLS 인증서의 호스트 이름과 일치하지 않으면
ssl-verify-server-cert매개변수로 인해 연결이 실패합니다. 예를 들어localhost에 연결하는 경우 다음을 수행합니다.# mysql -u root -p -h localhost -e status ERROR 2026 (HY000): SSL connection error: Validation of SSL server certificate failed
1.6. 논리 덤프를 사용하여 MariaDB 데이터 백업 및 복원 링크 복사링크가 클립보드에 복사되었습니다!
MariaDB 데이터의 논리적 백업은 데이터를 복원하는 데 필요한 SQL 문으로 구성됩니다. 물리적 백업에 대한 논리적 백업의 장점은 데이터를 다른 하드웨어 구성 및 MariaDB 버전에서 복원할 수 있다는 점입니다.
1.6.1. mariadb-dump를 사용하여 논리 백업 수행 링크 복사링크가 클립보드에 복사되었습니다!
mariadb-dump 유틸리티를 사용하여 MariaDB 서버가 실행되는 동안 데이터베이스를 백업하고 내보낸 데이터를 SQL 파일에 저장할 수 있습니다. 데이터 손실 시나리오에서 복구할 수 있도록 안전한 위치에 백업을 저장합니다.
mariadb-dump 의 빈번한 시나리오는 다음과 같습니다.
- 단일 데이터베이스 백업
- 여러 데이터베이스 백업
- 모든 데이터베이스 백업
mariadb-dump 유틸리티는 해당 출력을 단일 파일에 저장합니다. 여러 데이터베이스를 백업하고 데이터베이스당 하나의 파일이 필요한 경우 각 데이터베이스를 개별적으로 백업하십시오.
mariadb-dump 유틸리티는 데이터베이스만 백업할 수 있습니다. 여기에는 mysql 데이터베이스에 저장된 서버 설정도 포함됩니다. 그러나 유틸리티는 /etc/my.cnf 와 같은 구성 파일을 백업하지 않습니다.
사전 요구 사항
-
mariadb서비스가 실행 중입니다. -
데이터베이스를 백업할 수 있는 권한이 있는 자격 증명(예:
root계정)이 있습니다.
프로세스
MariaDB 데이터베이스의 일관되고 포괄적인 논리적 백업을 생성합니다.
# mariadb-dump -u <username> -p --routines --events --triggers --single-transaction --result-file=backup.sql --databases <database_1> <database_2>다음과 같습니다.
-u <username>- 유틸리티에서 데이터베이스 서버에 연결하는 데 사용하는 사용자 이름을 설정합니다.
-p- 암호를 입력하라는 메시지가 표시됩니다.
--routines- 백업에 저장 프로시저 및 기능이 포함되어 있습니다.
--events- 백업에 예약된 이벤트가 포함됩니다.
--triggers- 백업에 트리거를 포함합니다.
--single-transactionInnoDB와 같은 트랜잭션 스토리지 엔진을 사용하여 일관된 데이터베이스 스냅샷을 시작합니다. 단일 트랜잭션을 사용하면 모든 읽기 작업이 덤프가 시작될 때 데이터베이스 상태를 반영합니다.
MyISAM과 같은 비관계 스토리지 엔진을 계속 사용하는 경우 --
single- Cryostat 대신옵션을 사용하여 일관된 백업을 보장합니다.--lock-tables--result-file=<output_file>-
mariadb-dump에서 출력을 저장하는 파일을 정의합니다. --databases <list_of_databases>백업할 데이터베이스를 정의합니다. 또는 모든 데이터베이스를 한 번에 백업하려면
--all-databases옵션을 사용합니다.중요데이터베이스 백업에는 해당 데이터베이스의 데이터만 포함됩니다. MariaDB 사용자 계정 또는 기타 서버 설정은 포함하지 않습니다. MariaDB는 이러한 필수 보안 및 시스템 정보를 별도의
mysql시스템 데이터베이스에 저장합니다. 따라서 이러한 설정을 유지해야 하는 경우에도mysql을 백업해야 합니다.
검증
- 샌드박스 환경에서 백업을 복원하고 데이터가 올바른지 확인합니다.
1.6.2. SQL 형식의 덤프에서 MariaDB 데이터 복원 링크 복사링크가 클립보드에 복사되었습니다!
하나 이상의 데이터베이스를 SQL 파일에 백업한 경우 이 파일을 사용하여 데이터베이스 구조와 해당 데이터를 다시 만들 수 있습니다.
사전 요구 사항
-
mariadb서비스가 실행 중입니다. -
데이터를 복원할 수 있는 권한이 있는 인증 정보가 있습니다(예:
root계정).
프로세스
복원할 데이터베이스가 이미 존재하고 SQL 파일에
DROP Cryostat IF EXISTS문이 포함되어 있지 않은 경우 테이블 또는 전체 데이터베이스를 수동으로 제거해야 합니다.테이블을 제거하려면 다음을 입력합니다.
# mariadb -u root -p -e "DROP TABLE <database>.<table>;"SQL 파일이 다시 생성될 모든 테이블에 대해 이 명령을 반복합니다.
데이터베이스를 제거하려면 다음을 입력합니다.
# mariadb -u root -p -e "DROP DATABASE <database>;"SQL 파일이 다시 생성될 모든 데이터베이스에 대해 이 명령을 반복합니다.
SQL 파일을 가져옵니다.
# mariadb -u root -p < backup.sql"
검증
MariaDB 데이터베이스에 연결하고 데이터를 쿼리합니다. 예를 들면 다음과 같습니다.
# mariadb -u root -p <database> -e "*SELECT * FROM <table>;"
1.7. 물리적 복사본을 사용하여 MariaDB 데이터 백업 및 복원 링크 복사링크가 클립보드에 복사되었습니다!
MariaDB 데이터의 물리적 백업에는 콘텐츠를 저장하는 파일 및 디렉터리가 포함되어 있습니다. 이 방법은 일반적으로 더 빠르고 크기가 작아집니다.
1.7.1. mariabackup을 사용하여 물리적 온라인 백업 수행 링크 복사링크가 클립보드에 복사되었습니다!
서버가 실행되는 동안 mariabackup 유틸리티를 사용하여 InnoDB, Aria 및 MyISAM 테이블을 백업하여 MariaDB 서버의 물리적 온라인 백업을 생성할 수 있습니다. 유틸리티는 암호화 및 압축 데이터를 포함하는 MariaDB 서버의 전체 백업 기능을 지원합니다.
사전 요구 사항
-
mariadb-backup패키지는 시스템에 설치되어 있습니다. -
mariabackup에 백업이 실행되는 사용자의 자격 증명을 제공해야 합니다. 자격 증명은 명령줄 또는 구성 파일을 통해 제공할 수 있습니다. -
mariabackup사용자는RELOAD,LOCK CryostatS및REPLICATION CLIENT권한이 있어야 합니다.
프로세스
다음 옵션 중 하나를 사용하여 백업을 생성합니다.
명령줄에서 자격 증명을 제공하는 동안 백업을 생성하려면 다음을 입력합니다.
$ mariabackup --backup --target-dir <backup_directory> --user <backup_user> --password <backup_passwd>target-dir옵션은 백업 파일이 저장되는 디렉터리를 정의합니다. 전체 백업을 수행하려면 대상 디렉터리가 비어 있거나 존재하지 않아야 합니다.사용자및암호옵션을 사용하면 사용자 이름과 암호를 구성할 수 있습니다.구성 파일에 인증 정보가 설정된 백업을 생성하려면 다음을 수행합니다.
-
/etc/my.cnf.d/디렉터리에 구성 파일을 만듭니다(예:/etc/my.cnf.d/mariabackup.cnf). 파일에 다음 내용을 추가합니다.
[mysqld] user=<backup_username> password=<password>백업을 수행합니다.
$ mariabackup --backup --target-dir <backup_directory>
-
1.7.2. mariabackup을 사용하여 데이터 복원 링크 복사링크가 클립보드에 복사되었습니다!
mariabackup 유틸리티에서 생성한 MariaDB 백업이 있는 경우 동일한 유틸리티를 사용하여 데이터를 복원할 수 있습니다.
사전 요구 사항
-
mariadb서비스가 중지되었습니다. - data 디렉터리가 비어 있습니다.
-
mariabackup사용자는RELOAD,LOCK CryostatS및REPLICATION CLIENT권한이 있어야 합니다.
프로세스
다음 옵션 중 하나를 사용하여 데이터를 복원합니다.
/var/mariadb/backup/디렉터리의 백업 데이터를 복원하고 원래 백업 파일을 유지하려면 다음을 입력합니다.$ mariabackup --copy-back --target-dir=/var/mariadb/backup//var/mariadb/backup/디렉터리의 백업 데이터를 복원하고 원래 백업 파일을 제거하려면 다음을 입력합니다.$ mariabackup --move-back --target-dir=/var/mariadb/backup/
파일 권한을 수정합니다. 예를 들어 파일의 소유권을
mysql사용자 및 그룹으로 재귀적으로 변경하려면 다음을 입력합니다.# chown -R mysql:mysql /var/lib/mysql/데이터베이스를 복원할 때
mariabackup은 백업의 파일 및 디렉터리 권한을 유지합니다. 그러나mariabackup은 데이터베이스를 복원하는 사용자 및 그룹으로 파일을 디스크에 씁니다. 따라서 백업을 복원한 후 MariaDB 서버의 사용자 및 그룹과 일치하도록 데이터 디렉터리의 소유자를 조정해야 합니다.mariadb서비스를 시작합니다.# systemctl start mariadb.service
1.7.3. MariaDB 서버에서 파일 시스템 백업 수행 링크 복사링크가 클립보드에 복사되었습니다!
파일 시스템 수준 백업은 전체 MariaDB 인스턴스를 백업하는 빠른 방법입니다. 이 방법을 사용하려면 데이터 일관성을 위해 mariadb 서비스를 종료해야 합니다.
파일 시스템 수준 백업은 아키텍처 및 MariaDB 버전에 따라 다릅니다. 이 방법으로 백업한 데이터를 다른 아키텍처 또는 MariaDB 버전에서 복원할 수 없습니다.
프로세스
mariadb서비스를 중지합니다.# systemctl stop mariadb.service백업 디렉터리를 생성합니다. 예를 들면 다음과 같습니다.
# mkdir -p /root/mariadb-backup/{data,config}/데이터 디렉터리를 백업합니다.
# cp -rp /var/lib/mysql/ /root/mariadb-backup/data/구성 파일을 백업합니다.
# cp -rp /etc/my.cnf /etc/my.cnf.d/ /root/mariadb-backup/config/mariadb서비스를 시작합니다.# systemctl start mariadb.service
1.7.4. MariaDB 서버에서 파일 시스템 백업 복원 링크 복사링크가 클립보드에 복사되었습니다!
MariaDB 인스턴스가 손상되어 이전에 데이터 디렉터리 및 구성 파일이 포함된 파일 시스템 백업을 수행한 경우 이 백업에서 인스턴스를 복원할 수 있습니다.
사전 요구 사항
- MariaDB 서버에서 파일 시스템 백업을 수행했습니다.
대상 서버는 백업 소스의 다음 조건을 충족해야 합니다.
- MariaDB 버전은 동일하거나 더 높아야 합니다.
- 시스템 아키텍처는 동일해야 합니다.
프로세스
mariadb서비스를 중지합니다.# systemctl stop mariadb.service현재
/var/lib/mysql/디렉터리를 제거합니다.# rm -rf /var/lib/mysql/백업에서 data 디렉토리를 복원합니다.
# cp -rp /root/mariadb-backup/data/mysql/ /var/lib//var/lib/mysql/디렉터리의 올바른 소유권을 확인합니다.# chown -R mysql:mysql /var/lib/mysql//var/lib/mysql/디렉터리의 SELinux 컨텍스트를 복원합니다.# restorecon -Rv /var/lib/mysql/현재 구성 파일을 제거합니다.
# rm -rf /etc/my.cnf /etc/my.cnf.d/백업에서 구성 파일을 복원합니다.
# cp -rp /root/mariadb-backup/config/my.cnf /root/mariadb-backup/config/my.cnf.d/ /etc/구성 파일의 올바른 소유권을 확인합니다.
# chown -R root:root /etc/my.cnf /etc/my.cnf.d/구성 파일의 SELinux 컨텍스트를 복원합니다.
# restorecon -Rv /etc/my.cnf /etc/my.cnf.d/mariadb서비스를 시작합니다.# systemctl start mariadb.service
검증
MariaDB 데이터베이스에 연결하고 데이터를 쿼리합니다. 예를 들면 다음과 같습니다.
# mariadb -u root -p <database> -e "*SELECT * FROM <table>;"
1.8. Galera를 사용하여 MariaDB 복제 링크 복사링크가 클립보드에 복사되었습니다!
Galera 솔루션을 사용하여 MariaDB 데이터베이스를 복제하여 고가용성 및 데이터 일관성을 위해 동기식 멀티 소스 클러스터를 생성할 수 있습니다.
복제 자체는 충분한 백업 솔루션이 아닙니다. 복제는 하드웨어 장애로부터 소스 서버를 보호하지만 데이터 손실을 방지하지는 않습니다.
1.8.1. MariaDB Galera 클러스터 소개 링크 복사링크가 클립보드에 복사되었습니다!
MariaDB Galera Cluster는 모든 노드를 쓸 수 있고 클러스터 전체에서 데이터 일관성을 보장할 수 있는 동기식 다중 소스 복제를 제공합니다.
Galera 복제와 MariaDB 데이터베이스 간의 인터페이스는 쓰기 세트 복제 API(wsrep API)로 정의됩니다.
MariaDB Galera Cluster의 주요 기능은 다음과 같습니다.
- 동기 복제
- active-active 다중 소스 토폴로지
- 클러스터 노드 읽기 및 쓰기
- 자동 멤버십 제어, 실패한 노드가 클러스터에서 드롭
- 자동 노드 가입
- 행 수준에서 병렬 복제
- 직접 클라이언트 연결: 사용자가 클러스터 노드에 로그온하고 복제를 실행하는 동안 노드에서 직접 작업할 수 있습니다.
동기 복제는 서버가 트랜잭션과 연결된 쓰기 세트를 클러스터의 모든 노드에 브로드캐스트하여 커밋 시 트랜잭션을 복제함을 의미합니다. 클라이언트(사용자 애플리케이션)는 DBMS(데이터베이스 관리 시스템)에 직접 연결하고 기본 MariaDB와 유사한 동작을 경험합니다.
동기 복제를 통해 클러스터의 한 노드에서 발생한 변경이 클러스터의 다른 노드에서 동시에 수행됩니다.
따라서 동기 복제는 비동기 복제에 비해 다음과 같은 이점이 있습니다.
- 특정 클러스터 노드 간 변경 사항 전파 지연 없음
- 모든 클러스터 노드는 항상 일관적입니다.
- 클러스터 노드 중 하나가 충돌하면 최신 변경 사항이 손실되지 않습니다.
- 모든 클러스터 노드의 트랜잭션이 병렬로 실행됩니다.
- 전체 클러스터의 상호 작용
1.8.2. MariaDB Galera 클러스터를 빌드하는 구성 요소 링크 복사링크가 클립보드에 복사되었습니다!
기능적이고 동기적으로 복제된 MariaDB Galera Cluster를 배포하기 전에 먼저 핵심 소프트웨어 구성 요소, 특히 MariaDB 서버, Galera Replication 라이브러리 및 지원 Galera 패키지의 기능을 설치하고 이해해야 합니다.
MariaDB Galera 클러스터를 빌드하려면 시스템에 다음 패키지를 설치해야 합니다.
-
mariadb-server-galera- MariaDB Galera Cluster 에 대한 지원 파일과 스크립트가 포함되어 있습니다. -
mariadb-server- MariaDB 업스트림에서 패치하여 쓰기 세트 복제 API(wsrep API)를 포함합니다. 이 API는 Galera 복제와 MariaDB 간의 인터페이스를 제공합니다. Galera -MariaDB 업스트림에서 패치하여 MariaDB 에 대한 전체 지원을 추가합니다.Galera 패키지에는 다음이 포함됩니다.- Galera Replication Library 는 전체 복제 기능을 제공합니다.
- Galera Arbitrator 유틸리티는 split- Cryostat 시나리오에서 투표하는 클러스터 구성원으로 사용할 수 있습니다. 그러나 Galera Arbitrator 는 실제 복제에 참여할 수 없습니다.
-
Galera Systemd 서비스 및 Galera Arbitrator 유틸리티 배포에 사용되는 Galera 래퍼 스크립트 입니다. RHEL 10에서는
/usr/lib/systemd/system/garbd.service및/usr/sbin/garb-systemd에 있는 이러한 파일의 업스트림 버전을 제공합니다.
1.8.3. MariaDB Galera 클러스터 배포 링크 복사링크가 클립보드에 복사되었습니다!
필수 패키지를 설치하고, 클러스터 설정을 구성하고, 첫 번째 노드를 부트 스트랩하여 새 클러스터를 생성하여 MariaDB Galera 클러스터를 배포할 수 있습니다.
사전 요구 사항
- 클러스터의 모든 노드에는 TLS가 설정되어 있습니다.
모든 노드의 모든 인증서에는
Extended Key Usage필드가 다음과 같이 설정되어 있어야 합니다.TLS Web Server Authentication, TLS Web Client Authentication
프로세스
MariaDB Galera 클러스터 패키지를 설치합니다.
# dnf install mariadb-server-galera결과적으로 다음 패키지가 해당 종속 항목과 함께 설치됩니다.
-
mariadb-server-galera -
mariadb-server galeraMariaDB Galera Cluster를 빌드하는 데 필요한 이러한 패키지에 대한 자세한 내용은 MariaDB 클러스터를 빌드하는 구성 요소를 참조하십시오.
-
시스템을 클러스터에 처음 추가하기 전에 MariaDB 서버 복제 구성을 업데이트합니다. 기본 구성은
/etc/my.cnf.d/galera.cnf파일에 배포됩니다. MariaDB Galera 클러스터를 배포하기 전에 다음 문자열로 시작하도록 모든 노드의/etc/my.cnf.d/galera.cnf파일에서wsrep_cluster_address옵션을 설정합니다.gcomm://초기 노드의 경우
wsrep_cluster_address를 빈 목록으로 설정할 수 있습니다.wsrep_cluster_address="gcomm://"다른 모든 노드의 경우
wsrep_cluster_address를 설정하여 이미 실행 중인 클러스터의 일부인 모든 노드의 주소를 포함합니다. 예를 들면 다음과 같습니다.wsrep_cluster_address="gcomm://10.0.0.10"Galera Cluster 주소를 설정하는 방법에 대한 자세한 내용은 Galera Cluster Address 를 참조하십시오.
-
/etc/my.cnf.d/galera.cnf구성 파일에서옵션을 설정하여 모든 노드에서 wsrep API를 활성화합니다.wsrep_on=1 TLS 키 및 인증서를 사용하여 Galera 구성 파일에
wsrep_provider_options변수를 추가합니다. 예를 들면 다음과 같습니다.wsrep_provider_options="socket.ssl_cert=/etc/pki/tls/certs/source.crt;socket.ssl_key=/etc/pki/tls/private/source.key;socket.ssl_ca=/etc/pki/tls/certs/ca.crt"해당 노드에서 다음 래퍼를 실행하여 새 클러스터의 첫 번째 노드를 부트스트랩합니다.
# galera_new_cluster이 래퍼를 사용하면 MariaDB 서버 데몬(
mariadbd)이--wsrep-new-cluster옵션으로 실행됩니다. 이 옵션은 연결할 기존 클러스터가 없다는 정보를 제공합니다. 따라서 노드는 새 클러스터를 식별하기 위해 새 UUID를 생성합니다.참고mariadb서비스는 여러 MariaDB 서버 프로세스와 상호 작용하는 systemd 방법을 지원합니다. 따라서 실행 중인 여러 MariaDB 서버가 있는 경우 인스턴스 이름을 접미사로 지정하여 특정 인스턴스를 부트스트랩할 수 있습니다.# galera_new_cluster mariadb@node1각 노드에서 다음 명령을 실행하여 다른 노드를 클러스터에 연결합니다.
# systemctl start mariadb결과적으로 노드는 클러스터에 연결하고 클러스터 상태와 자체적으로 동기화됩니다.
검증
- MariaDB Galera 클러스터의 상태 확인을 참조하십시오.
1.8.4. MariaDB Galera 클러스터 상태 확인 링크 복사링크가 클립보드에 복사되었습니다!
MariaDB Galera 클러스터의 상태, 성능 및 동기화를 모니터링하고 확인하는 것이 중요합니다. 이를 위해 각 노드에서 상태 변수를 쿼리하여 노드와 클러스터를 모니터링할 수 있습니다.
MariaDB Galera 클러스터의 상태를 확인하려면 다음 쿼리를 사용할 수 있습니다.
클러스터의 노드 수를 표시합니다.
# mysql -u root -p -e 'show status like "wsrep_cluster_size";' +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 4 | +--------------------+-------+노드의 클러스터 구성 요소 상태를 표시합니다.
# mysql -u root -p -e 'show status like "wsrep_cluster_status";' +----------------------+---------+ | Variable_name | Value | +----------------------+---------+ | wsrep_cluster_status | Primary | +----------------------+---------+wsrep_cluster_status변수 값은 현재 노드가 속한 클러스터 구성 요소의 상태를 나타냅니다. 가능한 값은 다음과 같습니다.-
primary: 클러스터가 정상적으로 작동합니다. 쿼럼이 있습니다. 정상 클러스터에서 모든 노드는기본. -
비 기본사항: 노드가 클러스터의 기본 구성 요소에 대한 연결이 끊어졌으며 더 이상 활성 클러스터의 일부가 아닙니다. 그러나 노드는 여전히 읽기 쿼리를 제공할 수 있지만 쓰기 작업을 처리할 수 없습니다. -
disconnected: 노드가 클러스터 구성 요소에 연결되어 있지 않습니다. 결과적으로 쿼리를 수락할 수 없으며 데이터를 복제하지 않습니다.
-
노드 상태를 표시합니다.
# mysql -u root -p -e 'show status like "wsrep_local_state_comment";' +---------------------------+--------+ | Variable_name | Value | +---------------------------+--------+ | wsrep_local_state_comment | Synced | +---------------------------+--------+다음은
wsrep_local_state_comment변수의 빈번한 값입니다.-
synced: 노드가 클러스터 내에서 완전히 동기화되고 복제에 적극적으로 참여하고 있습니다. -
Desynced: 노드는 여전히 클러스터의 일부이지만 주로 상태 전송에 사용됩니다. -
join: 노드가 클러스터에 가입하는 중입니다. -
join: 노드가 클러스터에 성공적으로 참여했습니다. 클러스터에서 쓰기 세트를 수신하고 적용할 수 있습니다. -
donor: 현재 노드는 가입 노드에 SST(State Snapshot Transfer)를 제공합니다. 새 노드가 결합되고 전체 상태 전송이 필요한 경우 클러스터는 필요한 데이터를 전송하기 위해 기존 노드를 선택합니다.
-
노드에서 클러스터의 쓰기 세트를 수락하는지 확인합니다.
# mysql -u root -p -e 'show status like "wsrep_ready";' +---------------+-------+ | Variable_name | Value | +---------------+-------+ | wsrep_ready | ON | +---------------+-------+wsrep_ready변수가ON이면 노드가 구성 요소를 성공적으로 초기화하고 클러스터에 연결됩니다. 또한 노드가 동기화되거나 쿼리를 제공할 수 있는 상태에 도달했습니다.노드에 다른 호스트와의 네트워크 연결이 있는지 확인합니다.
# mysql -u root -p -e 'show status like "wsrep_connected";' +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | wsrep_connected | ON | +-----------------+-------+ON값은 노드가 클러스터의 하나 이상의 멤버에 연결되어 있음을 의미합니다.마지막 CryostatUSH
STATUS명령 또는 서버가 시작된 이후 쓰기 세트에 대한 로컬 수신 대기열의 평균 크기를 표시합니다.# mysql -u root -p -e 'show status like "wsrep_local_recv_queue_avg";' +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | wsrep_local_recv_queue_avg | 0.012 | +----------------------------+-------+0에 가까운 값은 이상적인 상태이며 노드가 수신 시 쓰기 세트를 계속 적용함을 나타냅니다. 영구적으로 높은 또는 증가하는 값은 디스크 I/O 속도 저하와 같은 성능 병목 현상을 나타내는 지표일 수 있습니다.
흐름 제어 상태를 표시합니다.
# mysql -u root -p -e 'show status like "wsrep_flow_control_paused";' +---------------------------+-------+ | Variable_name | Value | +---------------------------+-------+ | wsrep_flow_control_paused | 0 | +---------------------------+-------+이 변수는 노드가 일시 중지된 시간의 일부를 나타내며 로컬 수신 큐가 너무 많기 때문에 새 들어오는 트랜잭션을 처리할 수 없으므로 흐름 제어를 트리거합니다. 값이 0이면 노드가 복제 워크로드를 효율적으로 계속합니다. 1.0에 도달하는 값은 노드가 쓰기 세트를 적용할 때 문제가 발생하며 클러스터의 병목 현상이 발생할 수 있음을 의미합니다.
노드가 자주 일시 중지되는 경우
/etc/my.cnf.d/galera.cnf파일에서wsrep_slave_threads매개변수를 조정할 수 있습니다.노드가 병렬로 적용할 수 있는 가장 낮은 시퀀스 번호와 가장 높은 시퀀스 번호 사이의 평균 거리를 표시합니다.
# mysql -u root -p -e 'show status like "wsrep_cert_deps_distance";' +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | wsrep_cert_deps_distance | 1 | +--------------------------+-------+값이 클수록 병렬 처리 수준이 더 높습니다.A higher value indicates a greater degree of parallelism.
/etc/my.cnf.d/galera.cnf파일의wsrep_slave_threads매개변수에서 사용할 수 있는 최적의 값입니다.
1.8.5. MariaDB Galera 클러스터에 새 노드 추가 링크 복사링크가 클립보드에 복사되었습니다!
MariaDB Galera 클러스터에 새 노드를 추가하거나 노드의 구성 파일에서 클러스터 주소를 구성하여 기존 노드를 다시 연결할 수 있습니다.
프로세스
특정 노드에서
/etc/my.cnf.d/galera.cnf구성 파일의[mariadb]섹션에서wsrep_cluster_address옵션에 있는 하나 이상의 기존 클러스터 구성원에게 주소를 제공하십시오.[mariadb] wsrep_cluster_address="gcomm://192.168.0.1"새 노드가 기존 클러스터 노드 중 하나에 연결하면 클러스터의 모든 노드를 볼 수 있습니다.
그러나
wsrep_cluster_address에 클러스터의 모든 노드를 나열하는 것이 좋습니다.결과적으로 하나 이상의 클러스터 노드가 다운된 경우에도 다른 클러스터 노드에 연결하여 모든 노드가 클러스터에 참여할 수 있습니다. 모든 멤버가 멤버십에 동의하면 클러스터 상태가 변경됩니다. 새 노드의 상태가 클러스터 상태와 다른 경우 새 노드는 증분 상태 전송(IST) 또는 상태 스냅샷 전송(SST)을 요청하여 다른 노드와의 일관성을 보장합니다.
1.8.6. MariaDB Galera 클러스터 다시 시작 링크 복사링크가 클립보드에 복사되었습니다!
모든 노드를 동시에 종료하면 클러스터를 중지하고 실행 중인 클러스터가 더 이상 존재하지 않습니다. 그러나 클러스터의 데이터는 여전히 존재합니다. 클러스터를 다시 시작하려면 첫 번째 노드를 부트스트랩합니다.
클러스터를 부트스트랩하지 않고 첫 번째 노드의 mariadb 가 systemctl start mariadb 명령으로만 시작되면 노드는 /etc/my.cnf.cnf 파일의 wsrep_cluster_address 옵션에 나열된 노드 중 하나에 연결을 시도합니다. 현재 실행 중인 노드가 없으면 재시작이 실패합니다.
1.9. MariaDB 인스턴스를 이전 RHEL 버전에서 RHEL 10의 MariaDB 10.11로 마이그레이션 링크 복사링크가 클립보드에 복사되었습니다!
RHEL 10은 MariaDB 10.11을 제공합니다. 이전 RHEL 버전에서 MariaDB 인스턴스를 실행하는 경우 새 호스트에서 RHEL 10을 설정하고 인스턴스를 마이그레이션할 수 있습니다.
사전 요구 사항
- 새 호스트에서 RHEL 10을 설정합니다.
- RHEL 8 또는 RHEL 9 호스트에서 MariaDB 인스턴스의 파일 시스템 백업을 수행했습니다.
프로세스
mariadb-server패키지를 설치합니다.# dnf install mariadb-server서비스가 이미 실행 중인 경우 중지하십시오.
# systemctl stop mariadb.service-
이전 호스트의
/var/lib/mysql/디렉터리의 콘텐츠를 RHEL 10 호스트의 동일한 위치로 복사합니다. -
이전 호스트의 구성 파일을
/etc/my.cnf.d/디렉터리에 복사하고 파일에 MariaDB 10.11에 유효한 옵션만 포함되어 있는지 확인합니다. 자세한 내용은 업스트림 문서를 참조하십시오. SELinux 컨텍스트를 복원합니다.
# restorecon -rv /var/lib/mysql/ # restorecon -rv /etc/my.cnf.d//var/lib/mysql/및 해당 하위 디렉터리의 올바른 소유권을 확인합니다.# chown -R mysql:mysql /var/lib/mysql/mariadb서비스를 활성화하고 시작합니다.# systemctl enable --now mariadb.service서비스가 시작되면 MariaDB는 내부 테이블을 자동으로 확인, 복구 및 업데이트합니다.
검증
MariaDB 서버에 대한 연결을 설정합니다.
# mysql -u root -p -h <hostname>
1.10. MariaDB 10.11의 RHEL 10 버전에서 MariaDB 11.8로 업그레이드 링크 복사링크가 클립보드에 복사되었습니다!
MariaDB 데이터베이스를 RHEL 10의 버전 10.11에서 11.8로 업그레이드하여 새로운 기능 및 개선 사항에 액세스할 수 있습니다.
주요 개선 사항 및 변경 사항은 RHEL 10.2 릴리스 노트 문서의 릴리스 노트를 참조하십시오.
특정 위험 및 알려진 문제는 인플레이스 업그레이드와 관련이 있습니다. 예를 들어 일부 쿼리는 업그레이드 전과 다른 순서로 작동하지 않을 수 있습니다. 이러한 위험 및 문제에 대한 자세한 내용과 인플레이스 업그레이드에 대한 일반적인 정보는 MariaDB 11.8 릴리스 노트 를 참조하십시오.
사전 요구 사항
- MariaDB 데이터베이스 및 구성 파일의 백업을 생성했습니다.
프로세스
MariaDB 서버를 중지합니다.
# systemctl stop mariadb.serviceMariaDB 11.8로 전환합니다.
# dnf install --allowerasing mariadb11.8-server중요진행하기 전에 제안된
dnf트랜잭션을 주의 깊게 검토하십시오. 이전 버전의 각 패키지가 새 버전과 동일한 패키지로 교체되는지 확인합니다.--allowerasing옵션은 설치 목록이 불완전하면 의도하지 않은 패키지 제거로 이어질 수 있으며 설치보다 많은 소프트웨어를 제거할 수 있습니다.-
/etc/my.cnf.d/디렉터리에 있는 옵션 파일에 MariaDB 11.8에 유효한 옵션만 포함되도록 구성을 조정합니다. 자세한 내용은 MariaDB 11.4 및 MariaDB 11.8 에 대한 업스트림 문서를 참조하십시오. MariaDB 서버를 시작합니다.
Galera 클러스터에서 기본 노드를 업그레이드하는 경우 다음을 입력합니다.
# galera_new_clustermariadb서비스가 자동으로 시작됩니다.독립 실행형 또는 Galera 클러스터에서 복제본을 실행하는 데이터베이스를 업그레이드하는 경우 다음을 입력합니다.
# systemctl start mariadb.service
mariadb-upgrade유틸리티를 실행하여 내부 테이블을 확인하고 복구합니다.Galera 클러스터 노드를 업그레이드하는 경우:
# mariadb-upgrade --skip-write-binlog독립 실행형을 실행하는 데이터베이스를 업그레이드하는 경우:
# mariadb-upgrade
2장. Using MySQL 링크 복사링크가 클립보드에 복사되었습니다!
MySQL 서버는 고성능 오픈 소스 RDBMS(관계형 데이터베이스 관리 시스템)입니다. 데이터 액세스를 위한 SQL 인터페이스를 제공하며 여러 스토리지 엔진에 대한 지원과 같은 고급 기능을 포함합니다.
RHEL 시스템에 MySQL을 설치하고 구성하는 방법, MySQL 데이터를 백업하는 방법, 이전 MySQL 버전에서 마이그레이션하는 방법, MySQL 데이터베이스를 복제하는 방법을 알아봅니다.
2.1. Installing MySQL 링크 복사링크가 클립보드에 복사되었습니다!
RHEL 10에서는 MySQL 8.4를 Application Stream의 초기 버전으로 제공합니다. RPM 패키지로 설치할 수 있습니다. 추가 MySQL 버전은 RHEL 10의 마이너 릴리스에서 라이프 사이클이 짧은 애플리케이션 스트림으로 제공됩니다.
설계에서는 동일한 애플리케이션 스트림의 하나의 버전(스트림)만 설치할 수 있으며, 충돌하는 RPM 패키지 때문에 동일한 호스트에 MariaDB 및 MySQL을 설치할 수 없습니다. 또는 컨테이너에서 데이터베이스 서버 서비스를 실행할 수 있습니다. 단일 호스트에서 여러 MariaDB 및 MySQL 인스턴스를 실행하려면 컨테이너 사용을 참조하십시오.
프로세스
MySQL 서버 패키지를 설치합니다.
# dnf install mysql8.4-servermysqld서비스를 활성화하고 시작합니다.# systemctl enable --now mysqld.service설치 후 보안을 개선합니다.
$ mysql_secure_installation명령은 완전히 대화형 스크립트를 시작하여 프로세스의 각 단계를 입력하라는 메시지를 표시합니다. 이 스크립트를 사용하면 다음과 같은 방법으로 보안을 개선할 수 있습니다.
- root 계정의 암호 설정
- 익명 사용자 제거
- 원격 루트 로그인 허용(로컬 호스트 외부)
2.2. 컨테이너를 사용하여 단일 호스트에서 여러 MariaDB 및 MySQL 인스턴스 실행 링크 복사링크가 클립보드에 복사되었습니다!
패키지에서 MariaDB 또는 MySQL을 설치하는 경우 이러한 서비스 중 하나만 실행하고 동일한 호스트에서 단일 버전만 실행할 수 있습니다. 또는 컨테이너에서 서비스를 실행할 수 있습니다.
다음 시나리오를 구성할 수 있습니다.
- 동일한 호스트에서 MariaDB 또는 MySQL의 여러 인스턴스를 실행하려고 합니다.
- 동일한 호스트에서 MariaDB 및 MySQL을 모두 실행하려고 합니다.
데이터베이스 서버의 컨테이너 이름과 호스트 포트는 달라야 합니다.
사전 요구 사항
-
podman패키지가 설치되어 있습니다.
프로세스
Red Hat Customer Portal 계정을 사용하여
registry.redhat.io레지스트리에 인증합니다.# podman login registry.redhat.io컨테이너 레지스트리에 이미 로그인한 경우 이 단계를 건너뜁니다.
사용할 컨테이너를 시작합니다.
MariaDB 10.11:
$ podman run -d --name <container_name_1> -e MARIADB_ROOT_PASSWORD=<password> -p <host_port_1>:3306 rhel10/mariadb-1011이 컨테이너 이미지 사용에 대한 자세한 내용은 Red Hat Ecosystem Catalog 를 참조하십시오.
MariaDB 11.8:
$ podman run -d --name <container_name_2> -e MARIADB_ROOT_PASSWORD=<password> -p <host_port_2>:3306 rhel10/mariadb-118이 컨테이너 이미지 사용에 대한 자세한 내용은 Red Hat Ecosystem Catalog 를 참조하십시오.
MySQL 8.4:
$ podman run -d --name <container_name_3> -e MYSQL_ROOT_PASSWORD=<password> -p <host_port_3>:3306 rhel10/mysql-84이 컨테이너 이미지 사용에 대한 자세한 내용은 Red Hat Ecosystem Catalog 를 참조하십시오.
클라이언트가 네트워크의 데이터베이스 서버에 액세스할 수 있도록 하려면 방화벽에서 호스트 포트를 엽니다.
# firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,...} # firewall-cmd --reload
검증
데이터베이스 서버에 연결하고 root로 로그인합니다.
# mysql -u root -p -h localhost -P <host_port> --protocol tcp선택 사항: 실행 중인 컨테이너에 대한 정보를 표시합니다.
$ podman ps
2.3. MySQL에 대한 네트워크 액세스 구성 링크 복사링크가 클립보드에 복사되었습니다!
데이터베이스 서버에 대한 원격 클라이언트 액세스를 허용하려면 네트워크 인터페이스에서 수신 대기하고 방화벽 포트를 열도록 MySQL을 구성해야 합니다.
프로세스
/etc/my.cnf.d/mysql-server.cnf파일의mysqld섹션을 편집합니다. 다음 구성 지시문을 설정할 수 있습니다.bind-address- 서버가 수신 대기하는 주소입니다. 가능한 옵션은 다음과 같습니다.- 호스트 이름
- IPv4 주소
- IPv6 주소
skip-networking- 서버가 TCP/IP 연결을 수신 대기하는지 여부를 제어합니다. 가능한 값은 다음과 같습니다.- 0 - 모든 클라이언트를 청취
- 1 - 로컬 고객만 청취
-
port- MySQL이 TCP/IP 연결을 수신 대기하는 포트입니다.
클라이언트가 네트워크의 데이터베이스 서버에 액세스할 수 있도록 하려면 방화벽에서 포트를 엽니다.
# firewall-cmd --permanent --add-service=mysql # firewall-cmd --reloadmysqld서비스를 다시 시작합니다.# systemctl restart mysqld.service
2.4. MySQL 서버에서 TLS 암호화 설정 링크 복사링크가 클립보드에 복사되었습니다!
기본적으로 MySQL은 암호화되지 않은 연결을 사용합니다. 보안 연결의 경우 MySQL 서버에서 TLS 지원을 활성화하고 암호화된 연결을 설정하도록 클라이언트를 구성합니다.
2.4.1. MySQL 서버에 CA 인증서, 서버 인증서 및 개인 키 배치 링크 복사링크가 클립보드에 복사되었습니다!
MySQL 서버에서 TLS 암호화를 활성화하려면 먼저 CA(인증 기관) 인증서, 서버 인증서 및 MySQL 서버에 개인 키를 저장합니다.
사전 요구 사항
Privacy Enhanced mail (PEM) 형식의 다음 파일이 서버에 복사되었습니다.
-
서버의 개인 키:
server.example.com.key.pem -
서버 인증서:
server.example.com.crt.pem -
CA(인증 기관) 인증서:
ca.crt.pem
개인 키 및 CSR(인증서 서명 요청) 생성 및 CA에서 인증서를 요청하는 방법에 대한 자세한 내용은 CA 설명서를 참조하십시오.
-
서버의 개인 키:
프로세스
/etc/pki/tls/certs/디렉터리에 CA 및 서버 인증서를 저장합니다.# mv <path>/server.example.com.crt.pem /etc/pki/tls/certs/ # mv <path>/ca.crt.pem /etc/pki/tls/certs/MySQL 서버가 파일을 읽을 수 있도록 하는 CA 및 서버 인증서에 대한 권한을 설정합니다.
# chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem인증서는 보안 연결이 설정되기 전에 통신의 일부이므로 모든 클라이언트는 인증 없이 이를 검색할 수 있습니다. 따라서 CA 및 서버 인증서 파일에 대한 엄격한 권한을 설정할 필요가 없습니다.
서버의 개인 키를
/etc/pki/tls/private/디렉터리에 저장합니다.# mv <path>/server.example.com.key.pem /etc/pki/tls/private/서버의 개인 키에 대한 보안 권한을 설정합니다.
# chmod 640 /etc/pki/tls/private/server.example.com.key.pem # chgrp mysql /etc/pki/tls/private/server.example.com.key.pem권한이 없는 사용자가 개인 키에 액세스할 수 있는 경우 MySQL 서버에 대한 연결이 더 이상 안전하지 않습니다.
SELinux 컨텍스트를 복원합니다.
# restorecon -Rv /etc/pki/tls/
2.4.2. MySQL 서버에서 TLS 암호화 구성 링크 복사링크가 클립보드에 복사되었습니다!
기본적으로 MySQL은 암호화되지 않은 연결을 사용합니다. 보안 연결을 위해 MySQL 서버에서 TLS(Transport Layer Security) 지원을 활성화하고 암호화된 연결을 설정하도록 클라이언트를 구성할 수 있습니다.
사전 요구 사항
- MySQL 서버를 설치했습니다.
-
mysqld서비스가 실행 중입니다. Privacy Enhanced mail (PEM) 형식의 다음 파일은 서버에 존재하며
mysql사용자가 읽을 수 있습니다.-
서버의 개인 키:
/etc/pki/tls/private/server.example.com.key.pem -
서버 인증서:
/etc/pki/tls/certs/server.example.com.crt.pem -
CA(인증 기관) 인증서
/etc/pki/tls/certs/ca.crt.pem
-
서버의 개인 키:
- 서버 인증서의 제목 고유 이름(DN) 또는 SAN(주체 대체 이름) 필드는 서버의 호스트 이름과 일치합니다.
프로세스
/etc/my.cnf.d/mysql-server-tls.cnf파일을 만듭니다.다음 콘텐츠를 추가하여 개인 키, 서버 및 CA 인증서에 대한 경로를 구성합니다.
[mysqld] ssl_key = /etc/pki/tls/private/server.example.com.key.pem ssl_cert = /etc/pki/tls/certs/server.example.com.crt.pem ssl_ca = /etc/pki/tls/certs/ca.crt.pemCRL(Certificate Revocation List)이 있는 경우 이를 사용하도록 MySQL 서버를 구성합니다.
ssl_crl = /etc/pki/tls/certs/example.crl.pem선택 사항: 암호화 없이 연결 시도를 제거합니다. 이 기능을 활성화하려면 다음을 추가합니다.
require_secure_transport = on선택 사항: 서버가 지원해야 하는 TLS 버전을 설정합니다. 예를 들어 TLS 1.3만 지원하려면 다음을 추가합니다.
tls_version = TLSv1.3기본적으로 서버는 TLS 1.2 및 TLS 1.3을 지원합니다.
mysqld서비스를 다시 시작합니다.# systemctl restart mysqld
검증
문제 해결을 간소화하려면 TLS 암호화를 사용하도록 로컬 클라이언트를 구성하기 전에 MySQL 서버에서 다음 단계를 수행합니다.
이제 MySQL에 TLS 암호화가 활성화되어 있는지 확인합니다.
# mysql -u root -p -h <MySQL_server_hostname> -e "SHOW session status LIKE 'Ssl_cipher';" +---------------+------------------------+ | Variable_name | Value | +---------------+------------------------+ | Ssl_cipher | TLS_AES_256_GCM_SHA384 | +---------------+------------------------+특정 TLS 버전만 지원하도록 MySQL 서버를 구성한 경우
tls_version변수를 표시합니다.# mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'tls_version';" +---------------+---------+ | Variable_name | Value | +---------------+---------+ | tls_version | TLSv1.3 | +---------------+---------+서버가 올바른 CA 인증서, 서버 인증서 및 개인 키 파일을 사용하는지 확인합니다.
# mysql -u root -e "SHOW GLOBAL VARIABLES WHERE Variable_name REGEXP '{caret}ssl_ca|{caret}ssl_cert|{caret}ssl_key';" +-----------------+-------------------------------------------------+ | Variable_name | Value | +-----------------+-------------------------------------------------+ | ssl_ca | /etc/pki/tls/certs/ca.crt.pem | | ssl_capath | | | ssl_cert | /etc/pki/tls/certs/server.example.com.crt.pem | | ssl_key | /etc/pki/tls/private/server.example.com.key.pem | +-----------------+-------------------------------------------------+
2.4.3. MySQL 서버의 특정 사용자 계정에 대해 TLS 암호화 연결 필요 링크 복사링크가 클립보드에 복사되었습니다!
중요한 데이터 전송을 보호하기 위해 TLS 암호화 연결을 필요로 하는 특정 MySQL 사용자 계정을 구성할 수 있습니다.
모든 연결(require_secure_transport = on)에 보안 전송이 필요한 서버에서 구성할 수 없는 경우, TLS 암호화를 요구하도록 개별 사용자 계정을 구성합니다.
사전 요구 사항
- MySQL 서버에는 TLS 지원이 활성화되어 있습니다.
- 보안 전송을 요구하도록 구성하는 사용자가 있습니다.
- CA 인증서는 클라이언트에 저장됩니다.
프로세스
관리 사용자로 MySQL 서버에 연결합니다.
# mysql -u root -p -h server.example.com관리 사용자에게 원격으로 서버에 액세스할 수 있는 권한이 없는 경우 MySQL 서버에서 명령을 수행하고
localhost에 연결합니다.REQUIRE SSL절을 사용하여 사용자가 TLS 암호화 연결을 사용하여 연결해야 합니다.MySQL [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;
검증
TLS 암호화를 사용하여 서버에
예제사용자로 연결합니다.# mysql -u example -p -h server.example.com ... MySQL [(none)]>오류가 표시되지 않고 대화형 MySQL 콘솔에 액세스할 수 있는 경우 TLS와의 연결에 성공합니다.
기본적으로 클라이언트는 서버에서 제공하는 경우 TLS 암호화를 자동으로 사용합니다. 따라서
--ssl-ca=ca.crt.pem및--ssl-mode=VERIFY_IDENTITY옵션은 필요하지 않지만 이러한 옵션을 사용하여 클라이언트는 서버 ID를 확인하므로 보안을 개선합니다.TLS가 비활성화된 사용자로 연결을 시도합니다.
# mysql -u example -p -h server.example.com --ssl-mode=DISABLED ERROR 1045 (28000): Access denied for user 'example'@'server.example.com' (using password: YES)이 사용자에게는 TLS가 필요하지만 비활성화됨(
--ssl-mode=DISABLED)이므로 서버에서 로그인 시도를 거부했습니다.
2.5. 기본적으로 TLS 암호화를 사용하도록 MySQL 클라이언트 구성 링크 복사링크가 클립보드에 복사되었습니다!
RHEL에서 MySQL 클라이언트가 TLS 암호화를 사용하도록 전역적으로 구성하고 서버 인증서의 CN(일반 이름)이 사용자가 연결하는 호스트 이름과 일치하는지 확인할 수 있습니다. 이렇게 하면 메시지 가로채기(man-in-the-middle) 공격이 방지됩니다.
사전 요구 사항
- MySQL 서버에는 TLS 지원이 활성화되어 있습니다.
-
CA 인증서는 클라이언트의
/etc/pki/tls/certs/ca.crt.pem파일에 저장됩니다.
프로세스
다음 콘텐츠를 사용하여
/etc/my.cnf.d/mysql-client-tls.cnf파일을 만듭니다.[client] ssl-mode=VERIFY_IDENTITY ssl-ca=/etc/pki/tls/certs/ca.crt.pem이러한 설정은 MySQL 클라이언트가 TLS 암호화를 사용하고 클라이언트가 서버 인증서의 CN(
ssl-mode=VERIFY_IDENTITY)과 호스트 이름을 비교함을 정의합니다. 또한 CA 인증서의 경로를 지정합니다(ssl-ca).
검증
호스트 이름을 사용하여 서버에 연결하고 서버 상태를 표시합니다.
# mysql -u root -p -h server.example.com -e status ... SSL: Cipher in use is TLS_AES_256_GCM_SHA384SSL항목에사용 중인 Cipher가 포함된경우 연결이 암호화됩니다.이 명령에서 사용하는 사용자에게는 원격으로 인증할 수 있는 권한이 있습니다.
연결하는 호스트 이름이 서버의 TLS 인증서의 호스트 이름과 일치하지 않으면
ssl-mode=VERIFY_IDENTITY매개변수로 인해 연결이 실패합니다. 예를 들어localhost에 연결하는 경우 다음을 수행합니다.# mysql -u root -p -h localhost -e status ERROR 2026 (HY000): SSL connection error: error:0A000086:SSL routines::certificate verify failed
2.6. 논리 덤프를 사용하여 MySQL 데이터 백업 및 복원 링크 복사링크가 클립보드에 복사되었습니다!
MySQL 데이터의 논리적 백업은 데이터를 복원하는 데 필요한 SQL 문으로 구성됩니다. 물리적 백업에 대한 논리 백업의 장점은 데이터를 다른 하드웨어 구성 및 MySQL 버전에서 복원할 수 있다는 점입니다.
2.6.1. mysqldump를 사용하여 논리 백업 수행 링크 복사링크가 클립보드에 복사되었습니다!
mysqldump 유틸리티는 하나 이상의 데이터베이스를 내보낼 수 있는 백업 유틸리티입니다. mysqldump 의 출력은 일반적으로 서버 테이블 구조를 다시 생성하거나 데이터 또는 둘 다로 채우는 SQL 문으로 구성됩니다.
mysqldump 백업을 수행하려면 다음 옵션 중 하나를 사용할 수 있습니다.
- 하나 이상의 선택된 데이터베이스 백업
- 모든 데이터베이스 백업
- 하나의 데이터베이스에서 테이블 하위 집합 백업
프로세스
단일 데이터베이스를 덤프하려면 다음을 실행합니다.
# mysqldump [options] --databases db_name > backup-file.sql여러 데이터베이스를 한 번에 덤프하려면 다음을 실행합니다.
# mysqldump [options] --databases db_name1 [db_name2 ...] > backup-file.sql모든 데이터베이스를 덤프하려면 다음을 실행합니다.
# mysqldump [options] --all-databases > backup-file.sql덤프된 하나 이상의 전체 데이터베이스를 서버로 다시 로드하려면 다음을 실행합니다.
# mysql < backup-file.sql데이터베이스를 원격 MySQL 서버에 로드하려면 다음을 실행합니다.
# mysql --host=remote_host < backup-file.sql하나의 데이터베이스에서 테이블 서브 세트를 덤프하려면
mysqldump명령 끝에 선택한 테이블 목록을 추가합니다.# mysqldump [options] db_name [tbl_name ...] > backup-file.sql하나의 데이터베이스에서 덤프된 테이블의 하위 집합을 로드하려면 다음을 실행합니다.
# mysql db_name < backup-file.sql참고db_name 데이터베이스는 이 시점에 있어야 합니다.
mysqldump에서 지원하는 옵션 목록을 보려면 다음을 실행합니다.$ mysqldump --help
2.6.2. SQL 형식의 덤프에서 MySQL 데이터 복원 링크 복사링크가 클립보드에 복사되었습니다!
하나 이상의 데이터베이스를 SQL 파일에 백업한 경우 이 파일을 사용하여 데이터베이스 구조와 해당 데이터를 다시 만들 수 있습니다.
사전 요구 사항
-
mysqld서비스가 실행 중입니다. -
데이터를 복원할 수 있는 권한이 있는 인증 정보가 있습니다(예:
root계정).
프로세스
복원할 데이터베이스가 이미 존재하고 SQL 파일에
DROP Cryostat IF EXISTS문이 포함되어 있지 않은 경우 테이블 또는 전체 데이터베이스를 수동으로 제거해야 합니다.테이블을 제거하려면 다음을 입력합니다.
# mysql -u root -p -e "DROP TABLE <database>.<table>;"SQL 파일이 다시 생성될 모든 테이블에 대해 이 명령을 반복합니다.
데이터베이스를 제거하려면 다음을 입력합니다.
# mysql -u root -p -e "DROP DATABASE <database>;"SQL 파일이 다시 생성될 모든 데이터베이스에 대해 이 명령을 반복합니다.
SQL 파일을 가져옵니다.
# mysql -u root -p < backup.sql"
검증
MySQL 데이터베이스에 연결하고 데이터를 쿼리합니다. 예를 들면 다음과 같습니다.
# mysql -u root -p <database> -e "*SELECT * FROM <table>;"
2.7. 물리적 복사본을 사용하여 MySQL 데이터 백업 및 복원 링크 복사링크가 클립보드에 복사되었습니다!
MySQL 데이터의 물리적 백업에는 콘텐츠를 저장하는 파일 및 디렉터리가 포함되어 있습니다. 이 방법은 일반적으로 더 빠르고 크기가 작아집니다.
2.7.1. MySQL 서버에서 파일 시스템 백업 수행 링크 복사링크가 클립보드에 복사되었습니다!
파일 시스템 수준 백업은 전체 MySQL 인스턴스를 백업하는 빠른 방법입니다. 이 방법을 사용하려면 데이터 일관성을 위해 mysqld 서비스를 종료해야 합니다.
파일 시스템 수준 백업은 아키텍처 및 MySQL 버전에 따라 다릅니다. 이 메서드에서 지원하는 데이터를 다른 아키텍처 또는 MySQL 버전에서 복원할 수 없습니다.
프로세스
mysqld서비스를 중지합니다.# systemctl stop mysqld.service백업 디렉터리를 생성합니다. 예를 들면 다음과 같습니다.
# mkdir -p /root/mysqld-backup/{data,config}/데이터 디렉터리를 백업합니다.
# cp -rp /var/lib/mysql/ /root/mysqld-backup/data/구성 파일을 백업합니다.
# cp -rp /etc/my.cnf /etc/my.cnf.d/ /root/mysqld-backup/config/mysqld서비스를 시작합니다.# systemctl start mysqld.service
2.7.2. MySQL 서버에서 파일 시스템 백업 복원 링크 복사링크가 클립보드에 복사되었습니다!
MySQL 인스턴스가 손상되었으며 이전에 데이터 디렉터리 및 구성 파일을 포함하는 파일 시스템 백업을 수행한 경우 이 백업에서 인스턴스를 복원할 수 있습니다.
사전 요구 사항
- MySQL 서버에서 파일 시스템 백업을 수행했습니다.
대상 서버는 백업 소스의 다음 조건을 충족해야 합니다.
- MySQL 버전은 동일하거나 더 높아야 합니다.
- 시스템 아키텍처는 동일해야 합니다.
프로세스
mysqld서비스를 중지합니다.# systemctl stop mysqld.service현재
/var/lib/mysql/디렉터리를 제거합니다.# rm -rf /var/lib/mysql/백업에서 data 디렉토리를 복원합니다.
# cp -rp /root/mysqld-backup/data/mysql/ /var/lib//var/lib/mysql/디렉터리의 올바른 소유권을 확인합니다.# chown -R mysql:mysql /var/lib/mysql//var/lib/mysql/디렉터리의 SELinux 컨텍스트를 복원합니다.# restorecon -Rv /var/lib/mysql/현재 구성 파일을 제거합니다.
# rm -rf /etc/my.cnf /etc/my.cnf.d/백업에서 구성 파일을 복원합니다.
# cp -rp /root/mysqld-backup/config/my.cnf /root/mysqld-backup/config/my.cnf.d/ /etc/구성 파일의 올바른 소유권을 확인합니다.
# chown -R root:root /etc/my.cnf /etc/my.cnf.d/구성 파일의 SELinux 컨텍스트를 복원합니다.
# restorecon -Rv /etc/my.cnf /etc/my.cnf.d/mysqld서비스를 시작합니다.# systemctl start mysqld.service
검증
MySQL 데이터베이스에 연결하고 데이터를 쿼리합니다. 예를 들면 다음과 같습니다.
# mysql -u root -p <database> -e "*SELECT * FROM <table>;"
2.8. TLS 암호화를 사용하여 MySQL 복제 링크 복사링크가 클립보드에 복사되었습니다!
TLS 암호화를 사용하여 MySQL 복제를 설정하여 소스와 복제본 서버 간에 보안 데이터 복제를 생성할 수 있습니다.
복제 자체는 충분한 백업 솔루션이 아닙니다. 복제는 하드웨어 장애로부터 소스 서버를 보호하지만 데이터 손실을 방지하지는 않습니다.
2.8.1. MySQL 소스 서버 구성 링크 복사링크가 클립보드에 복사되었습니다!
MySQL 소스 서버에 필요한 구성 옵션을 설정하여 TLS 프로토콜을 통해 데이터베이스 서버에서 수행된 모든 변경 사항을 올바르게 실행하고 복제할 수 있습니다.
사전 요구 사항
- 소스 서버가 설치되어 있어야 합니다.
소스 서버에는 TLS가 설정되어 있습니다.
중요소스 및 복제본 인증서는 동일한 인증 기관에서 서명해야 합니다.
프로세스
[mysqld]섹션의/etc/my.cnf.d/mysql-server.cnf파일에 다음 옵션을 포함합니다.bind-address=source_ip_adress이 옵션은 복제본에서 소스로 만든 연결에 필요합니다.
server-id=idID 는 고유해야 합니다.
log_bin=path_to_source_server_log이 옵션은 MySQL 소스 서버의 바이너리 로그 파일의 경로를 정의합니다. 예:
log_bin=/var/log/mysql/mysql-bin.log.gtid_mode=ON이 옵션은 서버에서 GTID(글로벌 트랜잭션 식별자)를 활성화합니다.
enforce-gtid-consistency=ON서버는 GTID를 사용하여 안전하게 로깅할 수 있는 명령만 실행하여 GTID 일관성을 적용합니다.
Optional:
binlog_do_db=db_name선택한 데이터베이스만 복제하려면 이 옵션을 사용합니다. 두 개 이상의 선택한 데이터베이스를 복제하려면 각 데이터베이스를 별도로 지정합니다.
binlog_do_db=db_name1 binlog_do_db=db_name2 binlog_do_db=db_name3Optional:
binlog_ignore_db=db_name복제에서 특정 데이터베이스를 제외하려면 이 옵션을 사용합니다.
mysqld서비스를 다시 시작합니다.# systemctl restart mysqld.service
2.8.2. MySQL 복제본 서버 구성 링크 복사링크가 클립보드에 복사되었습니다!
MySQL 복제본 서버에 필요한 구성 옵션을 설정하여 복제를 성공적으로 수행할 수 있습니다.
사전 요구 사항
- 복제본 서버가 설치되어 있어야 합니다.
복제본 서버에는 TLS가 설정되어 있습니다.
중요소스 및 복제본 인증서는 동일한 인증 기관에서 서명해야 합니다.
프로세스
[mysqld]섹션의/etc/my.cnf.d/mysql-server.cnf파일에 다음 옵션을 포함합니다.server-id=idID 는 고유해야 합니다.
relay-log=path_to_replica_server_logrelay 로그는 복제 중에 MySQL 복제본 서버에서 생성한 로그 파일 집합입니다.
log_bin=path_to_replica_sever_log이 옵션은 MySQL 복제본 서버의 바이너리 로그 파일의 경로를 정의합니다. 예:
log_bin=/var/log/mysql/mysql-bin.log.이 옵션은 복제본에 필요하지 않지만 강력하게 권장됩니다.
gtid_mode=ON이 옵션은 서버에서 GTID(글로벌 트랜잭션 식별자)를 활성화합니다.
enforce-gtid-consistency=ON서버는 GTID를 사용하여 안전하게 로깅할 수 있는 명령만 실행하여 GTID 일관성을 적용합니다.
log-replica-updates=ON이 옵션을 사용하면 소스 서버에서 수신된 업데이트가 복제본의 바이너리 로그에 기록됩니다.
skip-replica-start=ON이 옵션을 사용하면 복제본 서버가 시작될 때 복제 스레드가 시작되지 않습니다.
Optional:
binlog_do_db=db_name특정 데이터베이스만 복제하려면 이 옵션을 사용합니다. 둘 이상의 데이터베이스를 복제하려면 각 데이터베이스를 별도로 지정합니다.
binlog_do_db=db_name1 binlog_do_db=db_name2 binlog_do_db=db_name3Optional:
binlog_ignore_db=db_name복제에서 특정 데이터베이스를 제외하려면 이 옵션을 사용합니다.
mysqld서비스를 다시 시작합니다.# systemctl restart mysqld.service
2.8.3. MySQL 소스 서버에서 복제 사용자 생성 링크 복사링크가 클립보드에 복사되었습니다!
복제본 서버가 데이터 변경 사항을 연결하고 수신할 수 있도록 MySQL 소스 서버에 대한 적절한 권한이 있는 복제 사용자를 생성해야 합니다.
사전 요구 사항
- 소스 서버는 MySQL 소스 서버 구성에 설명된 대로 설치 및 구성됩니다.
프로세스
복제 사용자를 생성합니다.
mysql> CREATE USER 'replication_user'@'replica_server_hostname' IDENTIFIED WITH mysql_native_password BY 'password';사용자에게 복제 권한을 부여합니다.
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'replica_server_hostname';*MySQL 데이터베이스에서 권한 부여 테이블을 다시 로드합니다.
mysql> FLUSH PRIVILEGES;소스 서버를 읽기 전용 상태로 설정합니다.
mysql> SET @@GLOBAL.read_only = ON;
2.8.4. MySQL 복제본 서버를 소스 서버에 연결 링크 복사링크가 클립보드에 복사되었습니다!
소스 서버 자격 증명을 사용하여 복제본 서버를 구성하고 복제를 시작하여 MySQL 복제본과 소스 서버 간 연결을 설정해야 합니다.
사전 요구 사항
- 소스 서버는 MySQL 소스 서버 구성에 설명된 대로 설치 및 구성됩니다.
- 복제본 서버는 MySQL 복제본 서버 구성에 설명된 대로 설치 및 구성됩니다.
- 복제 사용자를 생성했습니다. MySQL 소스 서버에서 복제 사용자 생성을 참조하십시오.
프로세스
복제본 서버를 읽기 전용 상태로 설정합니다.
mysql> SET @@GLOBAL.read_only = ON;복제 소스를 구성합니다.
mysql> CHANGE REPLICATION SOURCE TO SOURCE_HOST='source_hostname', SOURCE_USER='replication_user', SOURCE_PASSWORD='password', SOURCE_AUTO_POSITION=1, SOURCE_SSL=1, SOURCE_SSL_CA='path_to_ca_on_source', SOURCE_SSL_CAPATH='path_to_directory_with_certificates', SOURCE_SSL_CERT='path_to_source_certificate', SOURCE_SSL_KEY='path_to_source_key';MySQL 복제본 서버에서 복제본 스레드를 시작합니다.
mysql> START REPLICA;소스 및 복제본 서버에서 모두 읽기 전용 상태를 설정 해제합니다.
mysql> SET @@GLOBAL.read_only = OFF;선택 사항: 디버깅을 위해 복제본 서버의 상태를 검사합니다.
mysql> SHOW REPLICA STATUS\G;참고복제본 서버가 시작 또는 연결에 실패하면
SHOW MASTER STATUS명령의 출력에 표시된 바이너리 로그 파일 위치에 따라 특정 수의 이벤트를 건너뛸 수 있습니다. 예를 들어 정의된 위치에서 첫 번째 이벤트를 건너뜁니다.mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;그런 다음 복제본 서버를 다시 시작합니다.
선택 사항: 복제본 서버에서 복제본 스레드를 중지합니다.
mysql> STOP REPLICA;
2.8.5. MySQL 서버에서 복제 확인 링크 복사링크가 클립보드에 복사되었습니다!
테스트 데이터베이스를 생성하고 소스 및 복제본 서버에서 복제 상태를 확인하여 MySQL 복제가 올바르게 작동하는지 확인할 수 있습니다.
프로세스
소스 서버에서 예제 데이터베이스를 생성합니다.
mysql> CREATE DATABASE test_db_name;-
test_db_name데이터베이스가 복제본 서버에서 복제되는지 확인합니다. 소스 또는 복제본 서버 중 하나에서 다음 명령을 실행하여 MySQL 서버의 바이너리 로그 파일에 대한 상태 정보를 표시합니다.
mysql> SHOW MASTER STATUS;소스에서 실행되는 트랜잭션에 대한 GTID 집합을 표시하는
Executed_Gtid_Set열은 비워 둘 수 없습니다.참고복제본 서버에서
SHOW REPLICA STATUS를 사용할 때Executed_Gtid_Set행에 동일한 GTIDs 세트가 표시됩니다.
2.9. RHEL 10의 이전 RHEL 버전에서 MySQL 8.4로 MySQL 인스턴스를 마이그레이션 링크 복사링크가 클립보드에 복사되었습니다!
RHEL 10에서는 MySQL 8.4를 제공합니다. 이전 RHEL 버전에서 MySQL 인스턴스를 실행하는 경우 새 호스트에서 RHEL 10을 설정하고 인스턴스를 마이그레이션할 수 있습니다.
사전 요구 사항
- 새 호스트에서 RHEL 10을 설정합니다.
- RHEL 8 또는 RHEL 9 호스트에서 MySQL 인스턴스의 파일 시스템 백업을 수행했습니다.
프로세스
mysql8.4-server패키지를 설치합니다.# dnf install mysql8.4-server서비스가 이미 실행 중인 경우 중지하십시오.
# systemctl stop mysqld.service-
이전 호스트의
/var/lib/mysql/디렉터리의 콘텐츠를 RHEL 10 호스트의 동일한 위치로 복사합니다. -
이전 호스트의 구성 파일을
/etc/my.cnf.d/디렉터리에 복사하고 파일에 MySQL 8.4에 유효한 옵션만 포함되어 있는지 확인합니다. 자세한 내용은 업스트림 문서를 참조하십시오. SELinux 컨텍스트를 복원합니다.
# restorecon -rv /var/lib/mysql/ # restorecon -rv /etc/my.cnf.d//var/lib/mysql/및 해당 하위 디렉터리의 올바른 소유권을 확인합니다.# chown -R mysql:mysql /var/lib/mysql/mysqld서비스를 활성화하고 시작합니다.# systemctl enable --now mysqld.service서비스가 시작되면 MySQL은 내부 테이블을 자동으로 확인, 복구 및 업데이트합니다.
검증
MySQL 서버에 대한 연결을 설정합니다.
# mysql -u root -p -h <hostname>
3장. Using PostgreSQL 링크 복사링크가 클립보드에 복사되었습니다!
PostgreSQL 서버는 SQL 언어를 기반으로 하는 오픈 소스 강력하고 고도로 확장 가능한 데이터베이스 서버입니다. PostgreSQL 서버는 광범위한 데이터 세트 및 다수의 동시 사용자를 관리할 수 있는 개체 관계형 데이터베이스 시스템을 제공합니다.
PostgreSQL 서버에는 데이터 무결성을 보장하기 위한 기능이 포함되어 있어 내결함성 환경 및 애플리케이션을 구축할 수 있습니다. PostgreSQL 서버를 사용하면 데이터베이스를 다시 컴파일하지 않고도 자체 데이터 유형, 사용자 지정 함수 또는 다른 프로그래밍 언어의 코드를 사용하여 데이터베이스를 확장할 수 있습니다.
RHEL 시스템에 PostgreSQL을 설치하고 구성하는 방법, PostgreSQL 데이터를 백업하는 방법 및 이전 PostgreSQL 버전에서 마이그레이션하는 방법을 알아봅니다.
3.1. PostgreSQL 설치 링크 복사링크가 클립보드에 복사되었습니다!
RHEL 10에서는 PostgreSQL 16을 Application Stream의 초기 버전으로 제공하며 RPM 패키지로 설치할 수 있습니다. 추가 PostgreSQL 버전은 RHEL 10의 마이너 릴리스에서 라이프 사이클이 짧은 대체 버전으로 제공됩니다.
RHEL 10에서는 다음 버전에서 PostgreSQL 서버를 사용할 수 있습니다.
- PostgreSQL 16
- RHEL 10.2 이후 PostgreSQL 18 사용 가능
설계에서는 동일한 애플리케이션 스트림의 하나의 버전(스트림)만 설치할 수 있으며 충돌하는 RPM 패키지 때문에 동일한 호스트에 여러 PostgreSQL 인스턴스를 설치할 수 없습니다. 또는 컨테이너에서 데이터베이스 서버 서비스를 실행할 수 있습니다. 단일 호스트에서 여러 PostgreSQL 인스턴스를 실행하려면 컨테이너 사용을 참조하십시오.
프로세스
PostgreSQL 서버 패키지를 설치합니다.
PostgreSQL 16의 경우 다음을 입력합니다.
# dnf install postgresql-serverPostgreSQL 18의 경우 다음을 입력합니다.
# dnf install postgresql18-server
postgres슈퍼유저가 자동으로 생성됩니다.데이터베이스 클러스터를 초기화합니다.
# postgresql-setup --initdb데이터를 기본
/var/lib/pgsql/data디렉터리에 저장합니다.postgresql서비스를 활성화하고 시작합니다.# systemctl enable --now postgresql.service
3.2. 컨테이너를 사용하여 단일 호스트에서 여러 PostgreSQL 인스턴스 실행 링크 복사링크가 클립보드에 복사되었습니다!
패키지에서 PostgreSQL을 설치하는 경우 동일한 호스트에서 단일 버전만 실행할 수 있습니다. Tu는 여러 인스턴스 또는 다른 버전의 PostgreSQL을 실행하여 컨테이너에서 서비스를 실행할 수 있습니다.
사전 요구 사항
-
podman패키지가 설치되어 있습니다.
프로세스
Red Hat Customer Portal 계정을 사용하여
registry.redhat.io레지스트리에 인증합니다.# podman login registry.redhat.io컨테이너 레지스트리에 이미 로그인한 경우 이 단계를 건너뜁니다.
사용하려는 컨테이너를 시작합니다.
PostgreSQL 16의 경우 다음을 입력합니다.
$ podman run -d --name <container_name> -e POSTGRESQL_USER=<user_name> -e POSTGRESQL_PASSWORD=<password> -p <host_port_1>:5432 rhel10/postgresql-16이 컨테이너 이미지 사용에 대한 자세한 내용은 Red Hat Ecosystem Catalog 를 참조하십시오.
PostgreSQL 18의 경우 다음을 입력합니다.
$ podman run -d --name <container_name> -e POSTGRESQL_USER=<user_name> -e POSTGRESQL_PASSWORD=<password> -p <host_port_2>:5432 rhel10/postgresql-18이 컨테이너 이미지 사용에 대한 자세한 내용은 Red Hat Ecosystem Catalog 를 참조하십시오.
중요두 데이터베이스 서버의 컨테이너 이름과 호스트 포트는 달라야 합니다.
클라이언트가 네트워크의 데이터베이스 서버에 액세스할 수 있도록 하려면 방화벽에서 호스트 포트를 엽니다.
# firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,...} # firewall-cmd --reload
검증
데이터베이스 서버에 연결하고 root로 로그인합니다.
# psql -u postgres -p -h localhost -P <host_port> --protocol tcp실행 중인 컨테이너에 대한 정보를 표시합니다.
$ podman ps
3.3. PostgreSQL 사용자 생성 링크 복사링크가 클립보드에 복사되었습니다!
특정 권한이 있는 PostgreSQL 사용자를 생성하여 데이터베이스 액세스 권한을 관리하고 데이터베이스 관리를 위해 사용자 권한을 제어할 수 있습니다.
PostgreSQL 사용자는 다음 유형입니다.
-
postgresLinux 시스템 사용자:pg_dump와 같은 PostgreSQL 서버 및 클라이언트 애플리케이션을 실행하는 데만 사용합니다. 데이터베이스 생성 및 사용자 관리와 같은 PostgreSQL 관리에 대한 대화형 작업에는postgres시스템 사용자를 사용하지 마십시오. -
데이터베이스 슈퍼유저: 기본
postgresPostgreSQL 슈퍼유저는postgres시스템 사용자와 관련이 없습니다./var/lib/pgsql/data/pg_hba.conf파일에서postgres슈퍼유저의 액세스를 제한할 수 있습니다. 그렇지 않으면 다른 권한 제한이 없습니다. 다른 데이터베이스 슈퍼유저도 생성할 수 있습니다. 특정 데이터베이스 액세스 권한이 있는 역할:
- 데이터베이스 사용자: 기본적으로 로그인할 수 있는 권한이 있습니다.
- 사용자 그룹: 그룹 전체에 대한 관리 권한을 활성화합니다.
역할은 데이터베이스 개체(예: 테이블 및 함수)를 소유할 수 있으며 SQL 명령을 사용하여 다른 역할에 오브젝트 권한을 할당할 수 있습니다.
표준 데이터베이스 관리 권한에는 SELECT, Cryostat,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER,CREATE,CONNECT,TEMPORARY,EXECUTE, USAGE 가 포함됩니다.
역할 속성은 LOGIN,SUPERUSER,CREATEDB 및 CREATEROLE 과 같은 특수 권한입니다.
슈퍼유저가 아닌 역할로 대부분의 작업을 수행합니다. 일반적인 방법은 CREATEDB 및 CREATEROLE 권한이 있는 역할을 생성하고 데이터베이스 및 역할의 일상적인 관리에 이 역할을 사용하는 것입니다.
사전 요구 사항
- PostgreSQL 서버가 설치되어 있어야 합니다.
- 데이터베이스 클러스터가 초기화됩니다.
-
/var/lib/pgsql/data/postgresql.conf파일의password_encryption매개변수는scram-sha-256로 설정됩니다. -
/var/lib/pgsql/data/pg_hba.conf파일의 항목은scram-sha-256해시 알고리즘을 인증 방법으로 사용합니다.
프로세스
postgres시스템 사용자로 로그인하거나 이 사용자로 전환합니다.# su - postgresPostgreSQL 대화형 터미널을 시작합니다.
$ psql psql (16.4) Type "help" for help. postgres=#선택 사항: 현재 데이터베이스 연결에 대한 정보를 가져옵니다.
postgres=# \conninfo You are connected to database "postgres" as user "postgres" via socket in "/var/run/postgresql" at port "5432".mydbuser라는 사용자를 만들고 암호를 설정한 다음CREATEROLE및CREATEDB권한을 사용자에게 할당합니다.postgres=# CREATE USER mydbuser WITH PASSWORD '<password>' CREATEROLE CREATEDB; CREATE ROLE이제
mydbuser사용자는 일상적인 데이터베이스 관리 작업을 수행할 수 있습니다: 데이터베이스를 생성하고 사용자 인덱스를 관리합니다.\qmeta 명령을 사용하여 대화형 터미널에서 로그아웃합니다.postgres=# \q
검증
PostgreSQL 터미널에
mydbuser로 로그인하고 호스트 이름을 지정하고 초기화 중에 생성된 기본postgres데이터베이스에 연결합니다.# psql -U mydbuser -h 127.0.0.1 -d postgres Password for user mydbuser: Type the password. psql (16.4) Type "help" for help. postgres=>데이터베이스를 생성합니다.
postgres=> CREATE DATABASE <db_name>;세션에서 로그아웃합니다.
postgres=# \q새 데이터베이스에
mydbuser로 연결합니다.# psql -U mydbuser -h 127.0.0.1 -d <db_name> Password for user mydbuser: psql (16.4) Type "help" for help. mydatabase=>
3.4. Configuring PostgreSQL 링크 복사링크가 클립보드에 복사되었습니다!
데이터베이스 클러스터 디렉터리에서 구성 파일을 편집하여 데이터베이스 매개 변수, 인증 및 클라이언트 액세스를 설정하여 PostgreSQL을 구성할 수 있습니다. 기본적으로 PostgreSQL은 /var/lib/pgsql/data/ 디렉터리를 사용합니다.
-
/var/lib/pgsql/data/postgresql.conf- 데이터베이스 클러스터 매개변수를 설정하는 데 사용됩니다. -
/var/lib/pgsql/data/postgresql.auto.conf-postgresql.conf와 같은 기본 PostgreSQL 설정을 보유합니다. 그러나 이 파일은 서버 제어 아래에 있습니다.SYSTEM쿼리는 편집되며 수동으로 편집할 수 없습니다. -
/var/lib/pgsql/data/pg_ident.conf- 외부 인증 메커니즘의 사용자 ID를 PostgreSQL 사용자 ID로 매핑하는 데 사용됩니다. -
/var/lib/pgsql/data/pg_hba.conf- PostgreSQL 데이터베이스에 대한 클라이언트 인증을 구성하는 데 사용됩니다.
프로세스
/var/lib/pgsql/data/postgresql.conf파일을 편집하고 데이터베이스 클러스터 매개변수의 기본 설정을 구성합니다. 예를 들면 다음과 같습니다.log_connections = yes log_destination = 'syslog' search_path = '"$user", public' shared_buffers = 128MB password_encryption = scram-sha-256/var/lib/pgsql/data/pg_hba.conf파일을 편집하고 클라이언트 인증을 구성합니다. 예를 들면 다음과 같습니다.# TYPE DATABASE USER ADDRESS METHOD local all all trust host postgres all 192.168.93.0/24 ident host all all .example.com scram-sha-256변경 사항이 적용되도록
postgresql서비스를 다시 시작하십시오.# systemctl restart postgresql.service
3.5. PostgreSQL 서버에서 TLS 암호화 구성 링크 복사링크가 클립보드에 복사되었습니다!
기본적으로 PostgreSQL은 암호화되지 않은 연결을 사용합니다. 보안 연결을 위해 PostgreSQL 서버에서 TLS(Transport Layer Security) 지원을 활성화하고 암호화된 연결을 설정하도록 클라이언트를 구성할 수 있습니다.
사전 요구 사항
- TLS 개인 키를 생성하고 CA(인증 기관)에서 PostgreSQL 서버의 서버 인증서를 발급했습니다.
- PostgreSQL 서버가 설치되어 있어야 합니다.
- 데이터베이스 클러스터가 초기화됩니다.
- FIPS 모드가 활성화된 경우 클라이언트는 확장 마스터 시크릿(Extended Master Secret) 확장을 지원하거나 TLS 1.3을 사용해야 합니다. TLS 1.2 연결이 없는 경우 실패합니다. 자세한 내용은 RHEL 9.2 이상에 적용된 Red Hat Knowledgebase 솔루션 TLS 확장 "확장 마스터 시크릿"을 참조하십시오.
프로세스
개인 키와 서버 인증서를
/var/lib/pgsql/data/디렉터리에 저장합니다.# cp server.{key,crt} /var/lib/pgsql/data/개인 키 및 인증서의 소유권을 설정합니다.
# chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}PostgreSQL 서버만 파일을 읽을 수 있도록 하는 서버 인증서에 대한 권한을 설정합니다.
# chmod 0400 /var/lib/pgsql/data/server.key인증서는 보안 연결이 설정되기 전에 통신의 일부이므로 모든 클라이언트는 인증 없이 이를 검색할 수 있습니다. 따라서 서버 인증서 파일에 대한 엄격한 권한을 설정할 필요가 없습니다.
/var/lib/pgsql/data/postgresql.conf파일을 편집하고 다음과 같이 변경합니다.scram-sha-256해시 알고리즘을 설정합니다.password_encryption = scram-sha-256TLS 암호화를 활성화합니다.
ssl = on시스템 암호화 프로필을 따르도록 TLS 암호를 구성합니다.
기본적으로 PostgreSQL은 시스템 전체 암호화 정책과 일치하지 않을 수 있는 고정 OpenSSL 암호화 목록인
ssl_ciphers를HIGH:MEDIUM:+3DES:!aNULL로 설정합니다. PostgreSQL에서 시스템 프로필이 허용하지 않는 TLS 암호화 제품군을 제공하지 않도록 이 값을PROFILE=SYSTEM로 바꿉니다.ssl_ciphers = 'PROFILE=SYSTEM'
/var/lib/pgsql/data/pg_hba.conf파일을 편집하고 TLS 암호화 및scram-sha-256해시 알고리즘을 사용하도록 인증 항목을 업데이트합니다. 예를 들어호스트항목을hostssl으로 변경하여 TLS 암호화를 활성화하고 마지막 열에서scram-sha-256해시 알고리즘을 설정합니다.hostssl all all 192.0.2.0/24 scram-sha-256postgresql서비스를 다시 시작합니다.# systemctl restart postgresql.service
검증
postgres슈퍼 사용자를 사용하여 PostgreSQL 서버에 연결하고\conninfometa 명령을 실행합니다.# psql "postgresql://postgres@localhost:5432" -c '\conninfo' Password for user postgres: You are connected to database "postgres" as user "postgres" on host "192.0.2.1" at port "5432". SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
3.6. 논리 덤프를 사용하여 PostgreSQL 데이터 백업 및 복원 링크 복사링크가 클립보드에 복사되었습니다!
PostgreSQL 데이터의 논리적 백업은 데이터를 복원하는 데 필요한 SQL 문으로 구성됩니다. 물리적 백업에 대한 논리 백업의 장점은 데이터를 다른 하드웨어 구성 및 PostgreSQL 버전에서 복원할 수 있다는 점입니다.
SQL 덤프 방법은 SQL 명령을 사용하여 덤프 파일을 생성하는 방법을 기반으로 합니다. 덤프가 데이터베이스 서버에 다시 업로드되면 덤프 당시와 동일한 상태로 데이터베이스를 다시 생성합니다.
SQL 덤프는 다음 PostgreSQL 클라이언트 애플리케이션에 의해 보장됩니다.
-
pg_dump는 역할 또는 테이블 공간에 대한 클러스터 전체 정보가 없는 단일 데이터베이스를 덤프합니다. -
pg_dumpall은 지정된 클러스터의 각 데이터베이스를 덤프하고 역할 및 테이블 공간 정의와 같은 클러스터 전체 데이터를 유지합니다.
기본적으로 pg_dump 및 pg_dumpall 명령은 결과를 표준 출력에 작성합니다. 덤프를 파일에 저장하려면 출력을 SQL 파일로 리디렉션합니다. 결과 SQL 파일은 텍스트 형식 또는 병렬 처리를 허용하는 다른 형식 및 개체 복원에 대한 보다 자세한 제어가 될 수 있습니다.
데이터베이스에 액세스할 수 있는 원격 호스트에서 SQL 덤프를 수행할 수 있습니다.
3.6.1. SQL 덤프의 이점 및 단점 링크 복사링크가 클립보드에 복사되었습니다!
SQL 덤프는 SQL 문의 형태로 데이터베이스의 구조와 데이터를 포함하는 텍스트 파일입니다.
이점:
-
SQL 덤프는 서버 버전에 한정되지 않은 유일한 PostgreSQL 백업 방법입니다.
pg_dump유틸리티의 출력은 이후 버전의 PostgreSQL으로 다시 로드할 수 있으며 이는 파일 시스템 수준 백업 또는 연속 보관에서는 불가능합니다. - SQL 덤프는 32비트에서 64비트 서버로 이동하는 것과 같이 데이터베이스를 다른 시스템 아키텍처로 전송할 때 작동하는 유일한 방법입니다.
-
SQL 덤프는 내부적으로 일관성 있는 덤프를 제공합니다. 덤프는
pg_dump가 실행될 때 데이터베이스의 스냅샷을 나타냅니다. -
pg_dump유틸리티는 실행 중일 때 데이터베이스에서 다른 작업을 차단하지 않습니다.
단점:
- SQL 덤프는 파일 시스템 수준 백업에 비해 시간이 더 걸립니다.
3.6.2. pg_dump를 사용하여 단일 PostgreSQL 데이터베이스 백업 링크 복사링크가 클립보드에 복사되었습니다!
pg_dump 유틸리티를 사용하여 데이터베이스 구조와 데이터를 파일로 내보내 단일 PostgreSQL 데이터베이스의 백업을 생성할 수 있습니다.
사전 요구 사항
-
postgres슈퍼유저 또는 데이터베이스 관리자 권한이 있는 사용자로 로그인했습니다.
프로세스
클러스터 전체 정보 없이 데이터베이스를 덤프합니다.
$ pg_dump <db_name> > <dump_file>연결할 데이터베이스 서버
pg_dump를 지정하려면 다음 명령줄 옵션을 사용합니다.호스트를 정의하는
-h옵션입니다.기본 호스트는 로컬 호스트이거나
PGHOST환경 변수에 의해 지정된 항목입니다.포트를 정의하는
-p옵션입니다.기본 포트는
PGPORT환경 변수 또는 컴파일된 상태로 표시됩니다.
3.6.3. pg_dump를 사용하여 단일 PostgreSQL 데이터베이스 복원 링크 복사링크가 클립보드에 복사되었습니다!
pg_restore 유틸리티를 사용하여 데이터베이스 구조와 데이터를 다시 생성하여 SQL 덤프 파일에서 PostgreSQL 데이터베이스를 복원할 수 있습니다.
사전 요구 사항
-
postgres슈퍼유저 또는 데이터베이스 관리자 권한이 있는 사용자로 로그인했습니다.
프로세스
새 데이터베이스를 생성합니다.
$ createdb <db_name>- 개체를 소유하거나 덤프된 데이터베이스의 오브젝트에 대한 권한이 부여된 모든 사용자가 이미 있는지 확인합니다. 이러한 사용자가 존재하지 않는 경우 복원에서 원래 소유권 및 권한으로 오브젝트를 다시 생성하지 못합니다.
psql유틸리티를 실행하여pg_dump유틸리티로 생성된 텍스트 파일 덤프를 복원합니다.$ psql <db_name> < <dump_file>여기서
<dump_file>은pg_dump명령의 출력입니다. 비 텍스트 파일 덤프를 복원하려면 대신pg_restore유틸리티를 사용합니다.$ pg_restore <non-plain_text_file>
3.6.4. pg_dumpall을 사용하여 PostgreSQL 서버에서 모든 데이터베이스 백업 링크 복사링크가 클립보드에 복사되었습니다!
pg_dumpall 유틸리티를 사용하여 모든 데이터베이스 및 클러스터 전체 데이터를 단일 파일로 내보내 PostgreSQL 서버에서 모든 데이터베이스의 백업을 생성할 수 있습니다.
사전 요구 사항
-
postgres슈퍼유저 또는 데이터베이스 관리자 권한이 있는 사용자로 로그인했습니다.
프로세스
데이터베이스 클러스터에서 모든 데이터베이스를 덤프하고 클러스터 전체 데이터를 유지합니다.
$ pg_dumpall > <dump_file>연결할 데이터베이스 서버 pg_dumpall 을 지정하려면 다음 명령줄 옵션을 사용합니다.
호스트를 정의하는
-h옵션입니다.기본 호스트는 로컬 호스트이거나
PGHOST환경 변수에 의해 지정된 항목입니다.포트를 정의하는
-p옵션입니다.기본 포트는
PGPORT환경 변수 또는 컴파일된 상태로 표시됩니다.기본 데이터베이스를 정의하는
-l옵션입니다.이 옵션을 사용하면 초기화 중에 자동으로 생성된
postgres데이터베이스와 다른 기본 데이터베이스를 선택할 수 있습니다.
3.6.5. pg_dumpall을 사용하여 PostgreSQL 서버에서 모든 데이터베이스 복원 링크 복사링크가 클립보드에 복사되었습니다!
psql 유틸리티를 사용하여 전체 데이터베이스 클러스터를 다시 생성하여 pg_dumpall 파일에서 PostgreSQL 서버의 모든 데이터베이스를 복원할 수 있습니다.
사전 요구 사항
-
postgres슈퍼유저 또는 데이터베이스 관리자 권한이 있는 사용자로 로그인했습니다.
프로세스
- 개체를 소유하거나 덤프된 데이터베이스의 개체에 대한 권한이 부여된 모든 사용자가 있는지 확인합니다. 이러한 사용자가 존재하지 않는 경우 복원에서 원래 소유권 및 권한으로 오브젝트를 다시 생성하지 못합니다.
psql유틸리티를 실행하여pg_dumpall유틸리티에서 생성한 텍스트 파일 덤프를 복원합니다.$ psql < <dump_file>여기서
<dump_file>은pg_dumpall명령의 출력입니다.
3.6.6. 복원 중 SQL 오류 처리 링크 복사링크가 클립보드에 복사되었습니다!
기본적으로 psql 유틸리티는 SQL 오류가 발생하면 계속 실행되므로 데이터베이스가 부분적으로만 복원됩니다. 또는 데이터 무결성을 보장하기 위해 오류 발생을 중지하도록 psql 을 구성할 수 있습니다.
사전 요구 사항
-
postgres슈퍼유저 또는 데이터베이스 관리자 권한이 있는 사용자로 로그인했습니다.
프로세스
ON_ERROR_STOP변수를 설정하여 SQL 오류가 발생하면 종료 상태 3을 사용하여psql을 종료합니다.$ psql --set ON_ERROR_STOP=on <db_name> < <dump_file>복원이 완전히 완료되거나 취소되도록 전체 덤프가 단일 트랜잭션으로 복원되도록 지정합니다.
psql유틸리티를 사용하여 텍스트 파일 덤프를 복원하는 경우:$ psql -1pg_restore유틸리티를 사용하여 텍스트가 아닌 파일 덤프를 복원하는 경우:$ pg_restore -e
이 방법을 사용하면 약간의 오류라도 이미 여러 시간 동안 실행된 복원 작업을 취소할 수 있습니다.
3.7. 물리적 복사본을 사용하여 PostgreSQL 데이터 백업 및 복원 링크 복사링크가 클립보드에 복사되었습니다!
PostgreSQL 데이터의 물리적 백업에는 콘텐츠를 저장하는 파일과 디렉터리가 포함되어 있습니다. 이 방법은 일반적으로 더 빠르고 크기가 작아집니다.
3.7.1. PostgreSQL 서버에서 파일 시스템 백업 수행 링크 복사링크가 클립보드에 복사되었습니다!
파일 시스템 수준 백업은 전체 PostgreSQL 인스턴스를 백업하는 빠른 방법입니다. 이 방법을 사용하려면 데이터 일관성을 위해 postgresql 서비스를 종료해야 합니다.
PostgreSQL 파일 시스템 수준 백업은 아키텍처 및 RHEL 주요 버전에 따라 다릅니다. 이 방법으로 백업된 데이터를 다른 아키텍처 또는 RHEL 주요 버전에서 복원할 수 없습니다.
프로세스
postgresql서비스를 중지합니다.# systemctl stop postgresql.service백업 디렉터리를 생성합니다. 예를 들면 다음과 같습니다.
# mkdir -p /root/postgresql-backup//var/lib/pgsql/디렉터리를 백업합니다.# cp -rp /var/lib/pgsql/ /root/postgresql-backup//var/lib/pgsql/에는 구성 파일, 데이터 파일, 로그를 포함하여 PostgreSQL 데이터베이스 서버의 모든 필수 파일이 포함되어 있습니다.postgresql서비스를 시작합니다.# systemctl start postgresql.service
3.7.2. PostgreSQL 서버에서 파일 시스템 백업 복원 링크 복사링크가 클립보드에 복사되었습니다!
PostgreSQL 인스턴스가 손상되어 이전에 데이터 디렉터리가 포함된 파일 시스템 백업을 수행한 경우 이 백업에서 인스턴스를 복원할 수 있습니다.
사전 요구 사항
- PostgreSQL 서버에서 파일 시스템 백업을 수행했습니다.
대상 서버는 백업 소스의 다음 조건을 충족해야 합니다.
- PostgreSQL 버전은 동일해야 합니다.
- 시스템 아키텍처는 동일해야 합니다.
프로세스
postgresql서비스를 중지합니다.# systemctl stop postgresql.service현재
/var/lib/pgsql/디렉터리를 제거합니다.# rm -rf /var/lib/pgsql/백업에서 data 디렉토리를 복원합니다.
# cp -rp /root/postgresql-backup/pgsql/ /var/lib//var/lib/pgsql/디렉터리의 올바른 소유권을 확인합니다.# chown -R postgres:postgres /var/lib/pgsql//var/lib/pgsql/디렉터리의 SELinux 컨텍스트를 복원합니다.# restorecon -Rv /var/lib/pgsql/postgresql서비스를 시작합니다.# systemctl start postgresql.service
검증
-
postgres사용자로 로그인합니다. 데이터베이스에 연결합니다.
$ psql <database>데이터베이스의 데이터에 액세스합니다.
<database>=# SELECT * FROM <table>;PostgreSQL 서비스에서 연결을 끊습니다.
<database>=# \q
3.8. 연속 보관을 사용하여 PostgreSQL 데이터 백업 및 복원 링크 복사링크가 클립보드에 복사되었습니다!
연속 보관을 사용하여 지정 시간 복구 및 고가용성을 위해 WAL 파일을 기본 백업과 결합하여 강력한 PostgreSQL 백업을 만들 수 있습니다.
PostgreSQL은 데이터베이스의 데이터 파일에 대한 모든 변경 사항을 클러스터의 데이터 디렉터리의 pg_wal/ 하위 디렉터리에서 사용할 수 있는 WAL(Write-ahead log) 파일에 기록합니다. 이 로그는 주로 충돌 복구를 위한 것입니다. 충돌 후 마지막 체크포인트 이후의 로그 항목을 사용하여 데이터베이스를 일관된 상태로 복원할 수 있습니다.
온라인 백업이라고도 하는 연속 보관 방법은 WAL 파일을 실행 중인 서버 또는 파일 시스템 수준 백업에서 수행되는 기본 백업의 형태로 데이터베이스 클러스터 복사본과 결합합니다.
데이터베이스 복구가 필요한 경우 데이터베이스 클러스터 복사본에서 데이터베이스를 복원한 다음 백업된 WAL 파일에서 로그를 재생하여 시스템을 현재 상태로 전환할 수 있습니다.
연속 보관 방법을 사용하면 최소 마지막 기본 백업의 시작 시간으로 확장되는 모든 보관된 WAL 파일의 연속 시퀀스를 유지해야 합니다. 따라서 기본 백업의 이상적인 빈도는 다음에 따라 다릅니다.
- 보관된 WAL 파일에 사용할 수 있는 스토리지 볼륨입니다.
- 복구가 필요한 경우 가능한 최대 데이터 복구 기간입니다. 마지막 백업 이후 오랜 기간이 있는 경우 시스템은 더 많은 WAL 세그먼트를 재생하므로 복구에 더 많은 시간이 걸립니다.
pg_dump 및 pg_dumpall SQL 덤프를 연속 보관 백업 솔루션의 일부로 사용할 수 없습니다. SQL 덤프는 논리 백업을 생성하고 WAL 재생에서 사용할 수 있는 충분한 정보를 포함하지 않습니다.
3.8.1. 연속 보관의 이점 및 단점 링크 복사링크가 클립보드에 복사되었습니다!
연속 보관은 데이터베이스의 트랜잭션 로그 파일을 지속적으로 저장하여 데이터 백업, 고가용성 및 point-in-time 복구(PITR)에 대한 강력한 전략을 제공하는 기능입니다.
이점:
- 연속 백업 방법을 사용하면 로그 재생을 통해 백업의 내부 불일치가 수정되므로 완전히 일관성이 없는 기본 백업을 사용할 수 있습니다. 따라서 실행 중인 PostgreSQL 서버에서 기본 백업을 수행할 수 있습니다.
-
파일 시스템 스냅샷이 필요하지 않습니다.
tar또는 유사한 아카이브 유틸리티로 충분합니다. - 로그 재생에 대한 WAL 파일의 순서가 무기한 길 수 있기 때문에 WAL 파일을 계속 보관하여 연속 백업을 수행할 수 있습니다. 이는 대규모 데이터베이스에 특히 중요합니다.
- 연속 백업은 지정 시간 복구를 지원합니다. WAL 항목을 끝에 재생할 필요는 없습니다. 재생은 언제든지 중지할 수 있으며 기본 백업이 수행된 이후 언제든지 데이터베이스를 해당 상태로 복원할 수 있습니다.
- 동일한 기본 백업 파일로 로드된 다른 머신에서 일련의 WAL 파일을 지속적으로 사용할 수 있는 경우 언제든지 데이터베이스 복사본이 거의 최신인 다른 시스템을 복원할 수 있습니다.
단점:
- 연속 백업 방법은 하위 집합이 아닌 전체 데이터베이스 클러스터의 복원만 지원합니다.
- 연속 백업에는 광범위한 아카이브 스토리지가 필요합니다.
3.8.2. WAL 아카이브 설정 링크 복사링크가 클립보드에 복사되었습니다!
PostgreSQL 서버에서 쓰기 로그(WAL) 보관을 활성화하여 백업 및 특정 시점 복구를 위해 WAL 세그먼트 파일을 캡처하고 저장할 수 있습니다.
실행 중인 PostgreSQL 서버는 일련의 WAL 레코드를 생성합니다. 서버는 이 시퀀스를 WAL 세그먼트 파일로 물리적으로 나눕니다. 이 파일은 WAL 시퀀스에서 해당 위치를 반영하는 숫자 이름이 지정됩니다. WAL 보관이 없으면 세그먼트 파일이 재사용되고 더 높은 세그먼트 번호로 이름이 변경됩니다.
WAL 데이터를 저장할 때 각 세그먼트 파일의 내용이 캡처되고 세그먼트 파일을 재사용하기 전에 새 위치에 저장됩니다. NFS 마운트 디렉토리(예: 다른 머신, 보관 드라이브 또는 CD)와 같은 콘텐츠를 저장할 수 있는 여러 옵션이 있습니다.
WAL 레코드에는 구성 파일에 대한 변경 사항이 포함되어 있지 않습니다.
프로세스
/var/lib/pgsql/data/postgresql.conf파일에서 다음을 수행합니다.-
wal_level구성 매개 변수를replica이상으로 설정합니다. -
archive_mode매개변수를 의로설정합니다. archive_command구성 매개변수에서 shell 명령을 지정합니다.cp명령, 다른 명령 또는 쉘 스크립트를 사용할 수 있습니다.예를 들면 다음과 같습니다.
archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'여기서
%p매개변수는 아카이브할 파일의 상대 경로로 교체되고%f매개변수는 파일 이름으로 교체됩니다.이 명령은 아카이브 가능한 WAL 세그먼트를
/mnt/server/archivedir/디렉터리에 복사합니다.%p및%f매개변수를 교체한 후 실행된 명령은 다음과 같습니다.test ! -f /mnt/server/archivedir/00000001000000A900000065 && cp pg_wal/00000001000000A900000065 /mnt/server/archivedir/00000001000000A900000065보관된 각 새 파일에 대해 유사한 명령이 생성됩니다.
참고archive 명령은 완료된 WAL 세그먼트에서만 실행됩니다. WAL 트래픽을 거의 생성하는 서버는 트랜잭션 완료와 아카이브 스토리지에 안전한 기록 사이에 상당한 지연이 발생할 수 있습니다. 보관되지 않은 오래된 데이터를 저장할 수 있는 방법을 제한하려면 다음을 수행할 수 있습니다.
-
archive_timeout매개변수를 설정하여 지정된 빈도로 서버가 새 WAL 세그먼트 파일로 전환하도록 합니다. -
pg_switch_wal매개 변수를 사용하여 세그먼트 스위치가 완료된 직후 트랜잭션이 보관되도록 강제 적용합니다.
-
-
postgresql서비스를 다시 시작하여 변경 사항을 활성화합니다.# systemctl restart postgresql.service- archive 명령을 테스트하고 기존 파일을 덮어쓰지 않고 실패하는 경우 0이 아닌 종료 상태를 반환하는지 확인합니다.
- 데이터를 보호하려면 세그먼트 파일이 그룹 또는 세계 읽기 액세스 권한이 없는 디렉터리에 보관되어야 합니다.
3.8.3. 기본 백업 만들기 링크 복사링크가 클립보드에 복사되었습니다!
pg_basebackup 유틸리티를 사용하여 백업 및 복구를 위해 데이터베이스의 일관된 스냅샷을 캡처하여 PostgreSQL 기본 백업을 생성할 수 있습니다.
기본 백업 프로세스는 WAL 아카이브 영역에 저장되는 백업 기록 파일을 생성하고 기본 백업에 필요한 첫 번째 WAL 세그먼트 파일 뒤에 이름이 지정됩니다.
백업 기록 파일은 시작 및 종료 시간이 포함된 작은 텍스트 파일이며 백업의 WAL 세그먼트입니다. 레이블 문자열을 사용하여 연결된 덤프 파일을 식별하는 경우 백업 기록 파일을 사용하여 복원할 덤프 파일을 결정할 수 있습니다.
데이터를 복구할 수 있도록 여러 백업 세트를 유지하는 것이 좋습니다.
사전 요구 사항
-
postgres슈퍼유저, 데이터베이스 관리자 권한이 있는 사용자 또는 최소REPLICATION권한이 있는 사용자로 로그인했습니다. - 기본 백업 중 및 이후에 생성된 모든 WAL 세그먼트 파일을 보관해야 합니다.
프로세스
pg_basebackup유틸리티를 사용하여 기본 백업을 수행합니다.개별 파일로 기본 백업을 생성하려면 다음을 수행합니다.
$ pg_basebackup -D <backup_directory> -Fpbackup_directory 를 선택한 백업 위치로 바꿉니다.
tablespaces를 사용하고 서버와 동일한 호스트에서 기본 백업을 수행하는 경우
--tablespace-mapping옵션도 사용해야 합니다. 그렇지 않으면 백업을 동일한 위치에 작성하려고 할 때 백업이 실패합니다.기본 백업을
tar아카이브(tar및 압축 형식)로 만들려면 다음을 수행합니다.$ pg_basebackup -D <backup_directory> -Ft -zbackup_directory 를 선택한 백업 위치로 바꿉니다.
이러한 데이터를 복원하려면 올바른 위치에 파일을 수동으로 추출해야 합니다.
연결할 데이터베이스 서버 pg_basebackup 을 지정하려면 다음 명령줄 옵션을 사용합니다.
호스트를 정의하는
-h옵션입니다.기본 호스트는 로컬 호스트 또는
PGHOST환경 변수에 의해 지정된 호스트입니다.포트를 정의하는
-p옵션입니다.기본 포트는
PGPORT환경 변수 또는 컴파일된 상태로 표시됩니다.
- 기본 백업 프로세스가 완료되면 백업 기록 파일에 지정된 백업 중에 사용되는 데이터베이스 클러스터 및 WAL 세그먼트 파일의 복사본을 안전하게 보관합니다.
- 기본 백업보다 오래되고 복원에 더 이상 필요하지 않기 때문에 기본 백업에 사용되는 WAL 세그먼트 파일보다 숫자적으로 낮은 WAL 세그먼트를 삭제합니다.
3.8.4. 연속 아카이브 백업을 사용하여 데이터베이스 복원 링크 복사링크가 클립보드에 복사되었습니다!
기본 백업을 복원하고 특정 시점 복구를 위해 아카이브된 WAL 파일을 적용하여 PostgreSQL 데이터베이스를 복원할 수 있습니다.
프로세스
서버를 중지합니다.
# systemctl stop postgresql.service필요한 데이터를 임시 위치에 복사합니다.
전체 클러스터 데이터 디렉터리 및 모든 테이블 공간을 복사하는 것이 좋습니다. 이를 위해서는 시스템에 기존 데이터베이스의 두 복사본을 저장할 수 있는 충분한 여유 공간이 필요합니다.
공간이 충분하지 않은 경우 시스템이 중단되기 전에 보관되지 않은 로그를 포함할 수 있는 클러스터의
pg_wal디렉터리의 내용을 저장합니다.- 클러스터 데이터 디렉터리 및 사용 중인 테이블 공간의 루트 디렉터리 아래에 있는 기존 파일 및 하위 디렉터리를 모두 제거합니다.
기본 백업에서 데이터베이스 파일을 복원합니다.
다음을 확인하십시오.
-
파일이 올바른 소유권(
root가 아닌 데이터베이스 시스템 사용자)으로 복원됩니다. - 파일이 올바른 권한으로 복원됩니다.
-
pg_tblspc/하위 디렉터리의 심볼릭 링크가 올바르게 복원됩니다.
-
파일이 올바른 소유권(
pg_wal/하위 디렉터리에 있는 모든 파일을 제거합니다.이러한 파일은 기본 백업에서 생성되었으므로 사용되지 않습니다.
pg_wal/를 보관하지 않은 경우 적절한 권한으로 다시 생성합니다.-
2단계에서 저장한 모든 보관되지 않은 WAL 세그먼트 파일을
pg_wal/로 복사합니다. 클러스터 데이터 디렉터리에
recovery.conf복구 명령 파일을 생성하고restore_command구성 매개 변수에 shell 명령을 지정합니다.cp명령, 다른 명령 또는 쉘 스크립트를 사용할 수 있습니다. 예를 들면 다음과 같습니다.restore_command = 'cp /mnt/server/archivedir/%f "%p"'서버를 시작합니다.
# systemctl start postgresql.service서버는 복구 모드로 전환되고 필요한 아카이브된 WAL 파일을 통해 읽습니다.
외부 오류로 인해 복구가 종료되면 서버를 다시 시작할 수 있으며 복구를 계속합니다. 복구 프로세스가 완료되면 서버는
recovery.conf의 이름을recovery.done로 바꿉니다. 이렇게 하면 일반 데이터베이스 작업이 시작된 후 서버가 실수로 복구 모드로 다시 입력되지 않습니다.데이터베이스 내용을 확인하여 데이터베이스가 필요한 상태로 복구되었는지 확인합니다.
데이터베이스가 required 상태로 복구되지 않은 경우 1 단계로 돌아갑니다. 데이터베이스가 필수 상태로 복구된 경우
pg_hba.conf파일에서 클라이언트 인증 구성을 복원하여 사용자가 연결할 수 있도록 합니다.
3.9. 한 서버에서 다른 서버로 PostgreSQL 데이터베이스 직접 전송 링크 복사링크가 클립보드에 복사되었습니다!
pg_dump 및 psql 유틸리티를 사용하여 PostgreSQL 데이터베이스를 백업하고 다른 PostgreSQL 서버에서 직접 복원할 수 있습니다. 이 방법을 사용하면 중간 파일 없이 단일 단계로 데이터베이스를 전송할 수 있습니다.
사전 요구 사항
-
postgres사용자로 로그인했습니다.
프로세스
원본 서버에서 대상 서버로 데이터베이스를 전송합니다.
$ pg_dump -h <source_server> <db_name> | psql -h <destination_server> <db_name>
3.10. RHEL 10의 이전 RHEL 버전에서 PostgreSQL으로 PostgreSQL 인스턴스 마이그레이션 링크 복사링크가 클립보드에 복사되었습니다!
RHEL 9에서 PostgreSQL을 이미 실행하고 데이터베이스 소프트웨어를 RHEL 10을 실행하는 호스트로 이동하려는 경우 데이터베이스를 마이그레이션할 수 있습니다.
다음 마이그레이션 방법을 사용할 수 있습니다.
- 백업 및 복원 업그레이드 - 이 방법은 더 많은 시간이 필요할 수 있지만 대부분의 시나리오에서 작동합니다.
-
pg_upgrade유틸리티를 사용하여 빠른 업그레이드 - 이 방법은 더 빠르지만 PostgreSQL 13에서 16으로 마이그레이션하고 하드웨어 아키텍처가 동일하게 유지되는 경우에만 작동합니다.
PostgreSQL 마이그레이션 전에 소스 호스트의 /var/lib/pgsql/data/ 디렉터리를 항상 백업합니다.
3.10.1. 백업 및 복원 방법을 사용하여 RHEL 10에서 PostgreSQL으로 마이그레이션 링크 복사링크가 클립보드에 복사되었습니다!
백업 및 복원 방법을 사용하여 RHEL 8 또는 RHEL 9 버전의 PostgreSQL에서 RHEL 10의 PostgreSQL으로 데이터를 마이그레이션할 수 있습니다.
사전 요구 사항
- 기존 데이터베이스 서버는 RHEL 8 또는 RHEL 9에서 실행되며 RHEL 리포지토리에서 설치한 PostgreSQL 버전을 사용합니다.
-
두 호스트의 로케일 설정은 동일합니다. 이를 확인하려면 두 호스트 모두에서
echo $LANG명령의 출력을 비교합니다.
프로세스
마이그레이션할 기존 PostgreSQL 인스턴스가 있는 호스트에서 다음을 수행합니다.
모든 데이터베이스를
/var/lib/pgsql/pgdump_file.sql파일로 내보냅니다.# su - postgres -c "pg_dumpall > /var/lib/pgsql/pgdump_file.sql"내보낸 파일을 확인합니다.
# su - postgres -c 'less "/var/lib/pgsql/pgdump_file.sql"'이전 단계에서 생성한 데이터베이스 덤프와 PostgreSQL 구성 파일을 RHEL 10 호스트에 복사합니다. 예를 들면 다음과 같습니다.
# scp /var/lib/pgsql/pgdump_file.sql \ /var/lib/pgsql/data/pg_hba.conf \ /var/lib/pgsql/data/pg_ident.conf \ /var/lib/pgsql/data/postgresql.conf \ <user>@<rhel_10_host>:/tmp/
RHEL 10 호스트에서 다음을 수행합니다.
postgresql-server패키지를 설치합니다.# dnf install postgresql-server/var/lib/pgsql/data/디렉터리를 초기화합니다.# postgresql-setup --initdb복사한 구성 파일을
/var/lib/pgsql/data/디렉터리로 이동합니다.# mv /tmp/pg_hba.conf \ /tmp/pg_ident.conf \ /tmp/postgresql.conf \ /var/lib/pgsql/data//var/lib/pgsql/data/ 디렉터리에있는 콘텐츠의 올바른 소유권을 확인하십시오.# chown -R postgres:postgres /var/lib/pgsql/data//var/lib/pgsql/data/:에 SELinux 컨텍스트를 복원합니다.# restorecon -Rv /var/lib/pgsql/data/postgresql서비스를 활성화하고 시작합니다.# systemctl enable --now postgresql.servicepostgres사용자로 데이터를 가져옵니다.# su - postgres -c 'psql -f /tmp/pgdump_file.sql postgres'- 데이터베이스를 확인하고 PostgreSQL 서버를 사용하는 애플리케이션이 예상대로 작동하는지 확인합니다.
3.10.2. pg_update를 사용하여 PostgreSQL 13을 이전 RHEL 버전에서 RHEL 10의 PostgreSQL 16으로 마이그레이션 링크 복사링크가 클립보드에 복사되었습니다!
이전 RHEL 버전에서 RHEL 10의 PostgreSQL 16으로 PostgreSQL 13 인스턴스를 마이그레이션하려면 빠른 업그레이드 방법을 사용할 수 있습니다. 이 방법을 사용하면 /var/lib/pgsql/data/ 디렉터리의 콘텐츠를 RHEL 10 호스트에 복사하고 pg_update 유틸리티는 데이터베이스를 변환합니다.
이 방법은 기존 PostgreSQL 인스턴스가 버전 13이고 하드웨어 아키텍처가 소스 및 대상 호스트에서 동일한 경우에만 작동합니다. 다른 경우에는 backup 및 restore 방법을 사용하십시오.
사전 요구 사항
- 기존 데이터베이스 서버는 PostgreSQL 13을 사용합니다.
- 현재 및 향후 서버의 하드웨어 아키텍처는 동일합니다.
RHEL 10 호스트의
/var/lib/pgsql/디렉터리를 보유하는 디스크에 사용 가능한 공간이 충분히 있습니다.예를 들어, PostgreSQL 서버의 디렉터리 크기가 10GiB인 경우 마이그레이션 중에 RHEL 10 호스트에 최소 20GiB의 여유 디스크 공간이 필요합니다.
-
두 호스트의 로케일 설정은 동일합니다. 이를 확인하려면 두 호스트 모두에서
echo $LANG명령의 출력을 비교합니다.
프로세스
마이그레이션할 기존 PostgreSQL 인스턴스가 있는 호스트에서 다음을 수행합니다.
postgresql서비스를 중지합니다.# systemctl stop postgresql.service/var/lib/pgsql/디렉터리로 변경하고data하위 디렉터리를 백업합니다.# cd /var/lib/pgsql/ # tar -zcf ~/pgdata.bak.tar.gz data/~/pgdata.bak.tar.gz아카이브를 RHEL 10 호스트에 복사합니다. 예를 들면 다음과 같습니다.# scp ~/pgdata.bak.tar.gz <user>@<rhel_10_host>:/tmp/
RHEL 10 호스트에서 다음을 수행합니다.
필수 패키지를 설치합니다.
# dnf install postgresql-server postgresql-upgradepostgresql-upgrade패키지는 마이그레이션 중에 필요한 PostgreSQL 13 서버를 제공합니다.-
타사 PostgreSQL 서버 모듈을 사용하는 경우
postgresql-devel및postgresql-upgrade-devel패키지에 대해 빌드하고 설치합니다. postgresql서비스가 중지되었는지 확인합니다.# systemctl stop postgresql.service/var/lib/pgsql/디렉터리로 변경하고 이전 호스트에서 백업된 데이터 디렉토리를 추출합니다.# cd /var/lib/pgsql/ # tar -zxf /tmp/pgdata.bak.tar.gz선택 사항:
/tmp/pgdata.bak.tar.gz아카이브를 제거하십시오.# rm /tmp/pgdata.bak.tar.gz업그레이드 프로세스를 수행합니다.
# postgresql-setup --upgradepostgresql-setup쉘 스크립트는/var/lib/pgsql/data/디렉터리의 이름을/var/lib/pgsql/data-old/로 변경하고pg_upgrade유틸리티를 사용하여 데이터베이스를 다시 생성한/var/lib/pgsql/data/디렉터리로 마이그레이션합니다.중요pg_upgrade유틸리티는 구성 파일이 아닌 데이터베이스만 마이그레이션합니다. 마이그레이션 후/var/lib/pgsql/data/에는 기본.conf파일만 포함됩니다. 이전에 사용자 지정 구성 파일이 있는 경우/var/lib/pgsql/data-old/디렉터리에서 복사하여 새 PostgreSQL 버전과 호환되는지 확인합니다.postgresql서비스를 활성화하고 시작합니다.# systemctl enable --now postgresql.service모든 데이터베이스를 정리하고 분석합니다.
# su postgres -c 'vacuumdb --all --analyze-in-stages'- 데이터베이스를 확인하고 PostgreSQL 서버를 사용하는 애플리케이션이 예상대로 작동하는지 확인합니다.
선택 사항: 마이그레이션 전의 데이터베이스 및 구성 파일이 포함된
/var/lib/pgsql/data-old/디렉터리를 제거합니다.# rm -r /var/lib/pgsql/data-old/선택 사항:
postgresql-upgrade패키지를 제거합니다.# dnf remove postgresql-upgrade
3.11. RHEL 10 버전의 PostgreSQL 16에서 PostgreSQL 18으로 업그레이드 링크 복사링크가 클립보드에 복사되었습니다!
PostgreSQL 데이터베이스 서버를 RHEL 10의 버전 16에서 18로 업그레이드하여 새로운 기능 및 개선 사항에 액세스할 수 있습니다.
주요 개선 사항 및 변경 사항은 RHEL 10.2 릴리스 노트 문서의 릴리스 노트를 참조하십시오.
사전 요구 사항
- 기존 데이터베이스 서버는 RHEL 10에서 PostgreSQL 16을 사용합니다.
호스트에는
/var/lib/pgsql/디렉터리가 있는 디스크에 충분한 여유 공간이 있습니다.예를 들어 디렉터리 크기가 10GiB인 경우 사용 가능한 디스크 공간이 최소 10GiB 이상 필요합니다.
프로세스
현재 데이터 페이지 체크섬 상태를 표시합니다.
# pg_controldata /var/lib/pgsql/data | grep "Data page checksum"Data page checksum version: 0명령에서
0을 반환하면 데이터 페이지 체크섬이 비활성화됩니다.postgresql서비스를 중지합니다.# systemctl stop postgresql데이터 페이지 체크섬을 비활성화한 경우 전략을 확인합니다.
데이터 무결성을 개선하기 위해 업그레이드하기 전에 데이터 페이지 체크섬을 활성화하려면 다음을 수행합니다.
데이터 페이지 체크섬을 활성화합니다.
# pg_checksums --enable -D /var/lib/pgsql/data/데이터베이스 크기에 따라 이 작업은 상당한 시간이 걸릴 수 있습니다.
활성화를 확인합니다.
# pg_controldata /var/lib/pgsql/data | grep "Data page checksum"Data page checksum version: 1
데이터 페이지 체크섬을 비활성화된 상태로 유지하려면
PGSETUP_INITDB_OPTIONS환경 옵션을--no-data-checksums로 설정합니다.# export PGSETUP_INITDB_OPTIONS="--no-data-checksums"
Switch to PostgreSQL 18:
# dnf install --allowerasing postgresql18-server중요진행하기 전에 제안된
dnf트랜잭션을 주의 깊게 검토하십시오. 이전 버전의 각 패키지가 새 버전과 동일한 패키지로 교체되는지 확인합니다.--allowerasing옵션은 설치 목록이 불완전하면 의도하지 않은 패키지 제거로 이어질 수 있으며 설치보다 많은 소프트웨어를 제거할 수 있습니다.postgresql18-upgrade패키지를 설치합니다.# dnf install postgresql18-upgrade업그레이드 프로세스를 수행합니다.
# postgresql-setup --upgradepostgresql-setup쉘 스크립트는/var/lib/pgsql/data/디렉터리의 이름을/var/lib/pgsql/data-old/로 변경하고pg_upgrade유틸리티를 사용하여 데이터베이스를 다시 생성한/var/lib/pgsql/data/디렉터리로 마이그레이션합니다.중요pg_upgrade유틸리티는 구성 파일이 아닌 데이터베이스만 마이그레이션합니다. 마이그레이션 후/var/lib/pgsql/data/에는 기본.conf파일만 포함됩니다. 이전에 사용자 지정 구성 파일이 있는 경우/var/lib/pgsql/data-old/디렉터리에서 복사하여 새 PostgreSQL 버전과 호환되는지 확인합니다.postgresql서비스를 시작합니다.# systemctl start postgresql모든 데이터베이스를 정리하고 분석합니다.
# su postgres -c 'vacuumdb --all --analyze-in-stages'- 데이터베이스를 확인하고 PostgreSQL 서버를 사용하는 애플리케이션이 예상대로 작동하는지 확인합니다.
선택 사항: 마이그레이션 전의 데이터베이스 및 구성 파일이 포함된
/var/lib/pgsql/data-old/디렉터리를 제거합니다.# rm -r /var/lib/pgsql/data-old/선택 사항:
postgresql18-upgrade패키지를 제거합니다.# dnf remove postgresql18-upgrade