データベースサーバーの設定および使用
データベースサーバーでのデータのインストール、設定、バックアップ、および移行
概要
Red Hat ドキュメントへのフィードバック (英語のみ) リンクのコピーリンクがクリップボードにコピーされました!
Red Hat ドキュメントに関するご意見やご感想をお寄せください。また、改善点があればお知らせください。
Jira からのフィードバック送信 (アカウントが必要)
- Jira の Web サイトにログインします。
- 上部のナビゲーションバーで Create をクリックします。
- Summary フィールドにわかりやすいタイトルを入力します。
- Description フィールドに、ドキュメントの改善に関するご意見を記入してください。ドキュメントの該当部分へのリンクも追加してください。
- ダイアログの下部にある Create をクリックします。
第1章 MariaDB の使用 リンクのコピーリンクがクリップボードにコピーされました!
MariaDB サーバーは、高性能なオープンソースのリレーショナルデータベース管理システム (RDBMS) です。MySQL テクノロジーを基盤に構築されており、データアクセス用の強力な SQL インターフェイスと、複数のストレージエンジンのサポートなどの高度な機能を備えています。
RHEL システムに MariaDB をインストールして設定する方法、MariaDB データをバックアップする方法、MariaDB の以前のバージョンから移行する方法、および MariaDB Galera Cluster を使用してデータベースをレプリケートする方法を説明します。
1.1. MariaDB のインストール リンクのコピーリンクがクリップボードにコピーされました!
RHEL 10 では、Application Stream の初期バージョンとして MariaDB 10.11 が提供されます。これは、RPM パッケージとしてインストールできます。追加の MariaDB バージョンは、RHEL 10 のマイナーリリースで、ライフサイクルが短いモジュールとして提供されます。
設計上、同じモジュールの 1 つのバージョン (ストリーム) のみをインストールでき、RPM パッケージが競合するため、MariaDB と MySQL を同じホストにインストールすることはできません。代わりに、コンテナー内でデータベースサーバーサービスを実行することもできます。コンテナーを使用して、単一のホスト上で複数の MariaDB および MySQL インスタンスを実行する を参照してください。
手順
MariaDB サーバーパッケージをインストールします。
dnf install mariadb-server
# dnf install mariadb-serverCopy to Clipboard Copied! Toggle word wrap Toggle overflow mariadbサービスを有効にして起動します。systemctl enable --now mariadb.service
# systemctl enable --now mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.2. コンテナーを使用して、単一のホスト上で複数の MariaDB および MySQL インスタンスを実行する リンクのコピーリンクがクリップボードにコピーされました!
パッケージから MariaDB または MySQL をインストールする場合、同じホスト上でこれらのサービスのうち 1 つのみ、かつその 1 つのバージョンのみを実行できます。代わりに、コンテナー内でサービスを実行することもできます。
次のような環境を構成できます。
- 同じホスト上で MariaDB または MySQL の複数のインスタンスを実行したい。
- MariaDB と MySQL の両方を同じホストで実行したい。
前提条件
-
podmanパッケージがインストールされている。
手順
Red Hat カスタマーポータルアカウントを使用して、
registry.redhat.ioレジストリーに対して認証します。podman login registry.redhat.io
# podman login registry.redhat.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow すでにコンテナーレジストリーにログインしている場合は、このステップをスキップしてください。
使用するコンテナーを起動します。
MariaDB 10.11:
podman run -d --name <container_name_1> -e MYSQL_ROOT_PASSWORD=<password> -p <host_port_1>:3306 rhel10/mariadb-1011
$ podman run -d --name <container_name_1> -e MYSQL_ROOT_PASSWORD=<password> -p <host_port_1>:3306 rhel10/mariadb-1011Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコンテナーイメージを使用する方法の詳細は、Red Hat Ecosystem Catalog を参照してください。
MySQL 8.4:
podman run -d --name <container_name_2> -e MYSQL_ROOT_PASSWORD=<password> -p <host_port_2>:3306 rhel10/mysql-84
$ podman run -d --name <container_name_2> -e MYSQL_ROOT_PASSWORD=<password> -p <host_port_2>:3306 rhel10/mysql-84Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコンテナーイメージを使用する方法の詳細は、Red Hat Ecosystem Catalog を参照してください。
重要2 つのデータベースサーバーのコンテナー名とホストポートが異なっている必要があります。
クライアントがネットワーク上のデータベースサーバーにアクセスできるように、ファイアウォールでホストポートを開きます。
firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,...} firewall-cmd --reload# firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,...} # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
データベースサーバーに接続し、root としてログインします。
mysql -u root -p -h localhost -P <host_port> --protocol tcp
# mysql -u root -p -h localhost -P <host_port> --protocol tcpCopy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: 実行中のコンテナーに関する情報を表示します。
podman ps
$ podman psCopy to Clipboard Copied! Toggle word wrap Toggle overflow
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 --reload
# firewall-cmd --permanent --add-service=mysql # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow mariadbサービスを再起動します。systemctl restart mariadb.service
# systemctl restart mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
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 のドキュメントを参照してください。
-
サーバーの秘密鍵:
手順
CA およびサーバー証明書を
/etc/pki/tls/certs/ディレクトリーに保存します。mv <path>/server.example.com.crt.pem /etc/pki/tls/certs/ mv <path>/ca.crt.pem /etc/pki/tls/certs/
# mv <path>/server.example.com.crt.pem /etc/pki/tls/certs/ # mv <path>/ca.crt.pem /etc/pki/tls/certs/Copy to Clipboard Copied! Toggle word wrap Toggle overflow MariaDB サーバーがファイルを読み込めるように、CA およびサーバー証明書にパーミッションを設定します。
chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem
# chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 証明書は、セキュアな接続が確立される前は通信の一部であるため、任意のクライアントは認証なしで証明書を取得できます。そのため、CA およびサーバーの証明書ファイルに厳密なパーミッションを設定する必要はありません。
サーバーの秘密鍵を
/etc/pki/tls/private/ディレクトリーに保存します。mv <path>/server.example.com.key.pem /etc/pki/tls/private/
# mv <path>/server.example.com.key.pem /etc/pki/tls/private/Copy to Clipboard Copied! Toggle word wrap Toggle overflow サーバーの秘密鍵にセキュアなパーミッションを設定します。
chmod 640 /etc/pki/tls/private/server.example.com.key.pem chgrp mysql /etc/pki/tls/private/server.example.com.key.pem
# chmod 640 /etc/pki/tls/private/server.example.com.key.pem # chgrp mysql /etc/pki/tls/private/server.example.com.key.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 承認されていないユーザーが秘密鍵にアクセスできる場合は、MariaDB サーバーへの接続は安全ではなくなります。
SELinux コンテキストを復元します。
restorecon -Rv /etc/pki/tls/
# restorecon -Rv /etc/pki/tls/Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.4.2. MariaDB サーバーでの TLS 暗号化の設定 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、MariaDB は暗号化されていない接続を使用します。よりセキュアな接続のために、MariaDB サーバーで Transport Layer Security (TLS) サポートを有効にし、暗号化された接続を確立するようにクライアントを設定できます。
前提条件
- 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 (EMS) 拡張機能をサポートしているか、TLS 1.3 を使用している。EMS を使用しない TLS 1.2 接続は失敗します。詳細は、Red Hat ナレッジベースソリューション TLS extension "Extended Master Secret" enforced on RHEL 9.2 and later を参照してください。
手順
/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.pem
[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.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 証明書失効リスト (CRL) がある場合は、MariaDB サーバーがそれを使用するように設定します。
ssl_crl = /etc/pki/tls/certs/example.crl.pem
ssl_crl = /etc/pki/tls/certs/example.crl.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: 暗号化なしの接続試行を拒否します。この機能を有効にするには、以下を追加します。
require_secure_transport = on
require_secure_transport = onCopy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: サーバーがサポートする必要がある TLS バージョンを設定します。たとえば、TLS 1.2 および TLS 1.3 をサポートするには、以下を追加します。
tls_version = TLSv1.2,TLSv1.3
tls_version = TLSv1.2,TLSv1.3Copy to Clipboard Copied! Toggle word wrap Toggle overflow デフォルトでは、サーバーは TLS 1.1、TLS 1.2、および TLS 1.3 をサポートします。
mariadbサービスを再起動します。systemctl restart mariadb
# systemctl restart mariadbCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
トラブルシューティングを簡素化するには、ローカルクライアントが TLS 暗号化を使用するように設定する前に、MariaDB サーバーで以下の手順を実行します。
MariaDB で TLS 暗号化が有効になっていることを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow have_ssl変数がyesに設定されている場合、TLS 暗号化が有効になります。MariaDB サービスが特定の TLS バージョンのみをサポートするように設定している場合は、
tls_version変数を表示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.4.3. MariaDB サーバー上の特定のユーザーアカウントに対して TLS 暗号化接続を必須とする リンクのコピーリンクがクリップボードにコピーされました!
機密データの転送を保護するために、特定の MariaDB ユーザーアカウントに対して TLS 暗号化接続を必須とするように設定できます。
サーバー側ですべての接続に対してセキュアな転送を必須とするように設定 (require_secure_transport = on) できない場合は、個々のユーザーアカウントに対して TLS 暗号化を必須とするように設定してください。
前提条件
- MariaDB サーバーで TLS サポートが有効になっている。
- セキュアなトランスポートを必要とするように設定するユーザーが存在する。
手順
管理ユーザーとして MariaDB サーバーに接続します。
mysql -u root -p -h server.example.com
# mysql -u root -p -h server.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 管理ユーザーがリモートでサーバーにアクセスするパーミッションを持たない場合は、MariaDB サーバーでコマンドを実行し、
localhostに接続します。REQUIRE SSL句を使用して、ユーザーが TLS 暗号化接続を使用して接続する必要があるよう強制します。MariaDB [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;
MariaDB [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
TLS 暗号化を使用して、
exampleユーザーとしてサーバーに接続します。mysql -u example -p -h server.example.com --ssl ... MariaDB [(none)]>
# mysql -u example -p -h server.example.com --ssl ... MariaDB [(none)]>Copy to Clipboard Copied! Toggle word wrap Toggle overflow エラーが表示されず、インタラクティブな MariaDB コンソールにアクセスできる場合は、TLS との接続は成功します。
TLS を無効にして、
exampleユーザーとして接続を試みます。mysql -u example -p -h server.example.com --skip-ssl ERROR 1045 (28000): Access denied for user 'example'@'server.example.com' (using password: YES)
# mysql -u example -p -h server.example.com --skip-ssl ERROR 1045 (28000): Access denied for user 'example'@'server.example.com' (using password: YES)Copy to Clipboard Copied! Toggle word wrap Toggle overflow このユーザーに TLS が必要だが無効になっているため、サーバーはログインの試行を拒否しました (
--skip-ssl)。
1.5. デフォルトで TLS 暗号化を使用するように MariaDB クライアントを設定する リンクのコピーリンクがクリップボードにコピーされました!
RHEL では、MariaDB クライアントが TLS 暗号化を使用するようにグローバルに設定でき、サーバー証明書の Common Name(CN) がユーザーが接続するホスト名と一致することを検証できます。これにより、man-in-the-middle 攻撃 (中間者攻撃) を防ぎます。
前提条件
- MariaDB サーバーの TLS サポートが有効になっている。
- サーバー証明書を発行した認証局 (CA) が RHEL で信頼されていない場合は、CA 証明書がクライアントにコピーされています。
- FIPS モードが有効になっている場合、このクライアントは Extended Master Secret (EMS) 拡張機能をサポートするか、TLS 1.3 を使用します。EMS を使用しない TLS 1.2 接続は失敗します。詳細は、Red Hat ナレッジベースソリューション TLS extension "Extended Master Secret" enforced on RHEL 9.2 and later を参照してください。
手順
RHEL が、サーバー証明書を発行した CA を信頼しない場合は、以下を行います。
CA 証明書を
/etc/pki/ca-trust/source/anchors/ディレクトリーにコピーします。cp <path>/ca.crt.pem /etc/pki/ca-trust/source/anchors/
# cp <path>/ca.crt.pem /etc/pki/ca-trust/source/anchors/Copy to Clipboard Copied! Toggle word wrap Toggle overflow すべてのユーザーが CA 証明書ファイルを読み取りできるようにするパーミッションを設定します。
chmod 644 /etc/pki/ca-trust/source/anchors/ca.crt.pem
# chmod 644 /etc/pki/ca-trust/source/anchors/ca.crt.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow CA 信頼データベースを再構築します。
update-ca-trust
# update-ca-trustCopy to Clipboard Copied! Toggle word wrap Toggle overflow
以下の内容で
/etc/my.cnf.d/mariadb-client-tls.cnfファイルを作成します。[client-mariadb] ssl ssl-verify-server-cert
[client-mariadb] ssl ssl-verify-server-certCopy to Clipboard Copied! Toggle word wrap Toggle overflow これらの設定は、MariaDB クライアントが TLS 暗号化 (
ssl) を使用し、クライアントがホスト名をサーバー証明書 (ssl-verify-server-cert) の CN と比較することを定義します。
検証
ホスト名を使用してサーバーに接続し、サーバーの状態を表示します。
mysql -u root -p -h server.example.com -e status ... SSL: Cipher in use is TLS_AES_256_GCM_SHA384
# mysql -u root -p -h server.example.com -e status ... SSL: Cipher in use is TLS_AES_256_GCM_SHA384Copy to Clipboard Copied! Toggle word wrap Toggle overflow SSLエントリーにCipher in use is…が含まれている場合、接続は暗号化されています。このコマンドで使用するユーザーには、リモートで認証するパーミッションがあることに注意してください。
接続するホスト名がサーバーの 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
# mysql -u root -p -h localhost -e status ERROR 2026 (HY000): SSL connection error: Validation of SSL server certificate failedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.6. 論理ダンプを使用した MariaDB データのバックアップと復元 リンクのコピーリンクがクリップボードにコピーされました!
MariaDB データの論理バックアップは、データの復元に必要な SQL ステートメントで構成されます。物理バックアップに対する論理バックアップの利点は、異なるハードウェア構成や MariaDB バージョンでもデータを復元できることです。
1.6.1. mariadb-dump を使用した論理バックアップの実行 リンクのコピーリンクがクリップボードにコピーされました!
mariadb-dump ユーティリティーを使用すると、MariaDB サーバーの実行中にデータベースをバックアップし、エクスポートしたデータを SQL ファイルに保存できます。データが失われた場合に回復できるように、バックアップをセキュアな場所に保存してください。
mariadb-dump がよく使用される場面としては、以下のものがあります。
- 単一のデータベースのバックアップ
- 複数のデータベースのバックアップ
- すべてのデータベースのバックアップ
mariadb-dump ユーティリティーは、出力を 1 つのファイルに保存します。複数のデータベースをバックアップする際に、データベースごとに 1 つのファイルが必要な場合は、各データベースを個別にバックアップしてください。
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>
# mariadb-dump -u <username> -p --routines --events --triggers --single-transaction --result-file=backup.sql --databases <database_1> <database_2>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 各項目の説明:
-u <username>- ユーティリティーがデータベースサーバーに接続するために使用するユーザー名を設定します。
-p- パスワードの入力を求めます。
--routines- バックアップにストアドプロシージャーと関数を含めます。
--events- スケジュールされたイベントをバックアップに含めます。
--triggers- バックアップにトリガーを含めます。
--single-transactionInnoDB などのトランザクションストレージエンジンを使用するデータベースに対して、整合性の取れたスナップショットの作成を開始します。単一のトランザクションを使用すると、すべての読み取り操作が、ダンプ開始時点のデータベースの状態を反映したものになります。
MyISAM などの非トランザクションストレージエンジンをまだ使用している場合は、整合性のあるバックアップを確保するために、
--single-transactionではなく--lock-tablesオプションを使用してください。--result-file=<output_file>-
mariadb-dumpが出力を保存するファイルを定義します。 --databases <list_of_databases>バックアップするデータベースを定義します。または、すべてのデータベースを一度にバックアップするには、
--all-databasesオプションを使用します。重要データベースのバックアップには、そのデータベースのデータのみが含まれます。MariaDB ユーザーアカウントやその他のサーバー設定は含まれません。MariaDB は、この重要なセキュリティー情報やシステム情報を、別の
mysqlシステムデータベースに保存しています。したがって、これらの設定を保持する必要がある場合は、mysqlもバックアップする必要があります。
検証
- サンドボックス環境でバックアップを復元し、データが正しいことを確認します。
1.6.2. SQL 形式のダンプから MariaDB のデータを復元する リンクのコピーリンクがクリップボードにコピーされました!
1 つまたは複数のデータベースを SQL ファイルにバックアップした場合は、このファイルを使用してデータベース構造とそのデータを再作成できます。
前提条件
-
mariadbサービスが実行中である。 -
rootアカウントなど、データを復元する権限を持つ認証情報を持っている。
手順
復元するデータベースがすでに存在し、SQL ファイルに
DROP TABLE IF EXISTSステートメントが含まれていない場合は、テーブルまたはデータベース全体を手動で削除する必要があります。テーブルを削除するには、次のように入力します。
mariadb -u root -p -e "DROP TABLE <database>.<table>;"
# mariadb -u root -p -e "DROP TABLE <database>.<table>;"Copy to Clipboard Copied! Toggle word wrap Toggle overflow SQL ファイルによって再作成されるすべてのテーブルに対してこのコマンドを繰り返します。
データベースを削除するには、次のように入力します。
mariadb -u root -p -e "DROP DATABASE <database>;"
# mariadb -u root -p -e "DROP DATABASE <database>;"Copy to Clipboard Copied! Toggle word wrap Toggle overflow SQL ファイルによって再作成されるすべてのデータベースに対してこのコマンドを繰り返します。
SQL ファイルをインポートします。
mariadb -u root -p < backup.sql"
# mariadb -u root -p < backup.sql"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
MariaDB データベースに接続してデータを照会します。次に例を示します。
mariadb -u root -p <database> -e "*SELECT * FROM <table>;"
# mariadb -u root -p <database> -e "*SELECT * FROM <table>;"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.7. 物理コピーを使用した MariaDB データのバックアップと復元 リンクのコピーリンクがクリップボードにコピーされました!
MariaDB データの物理バックアップには、コンテンツを格納しているファイルとディレクトリーが含まれます。通常、この方法はより高速で、サイズが小さくなります。
1.7.1. mariabackup を使用した物理的なオンラインバックアップの実行 リンクのコピーリンクがクリップボードにコピーされました!
サーバーの実行中に、mariabackup ユーティリティーを使用して InnoDB、Aria、および MyISAM テーブルをバックアップすることにより、MariaDB サーバーの物理的なオンラインバックアップを作成できます。このユーティリティーは、暗号化および圧縮されたデータを含む MariaDB サーバーの完全バックアップ機能をサポートします。
前提条件
-
mariadb-backupパッケージがシステムにインストールされている。 -
バックアップを実行するユーザーの認証情報を
mariabackupに提供する必要がある。認証情報はコマンドラインまたは設定ファイルで指定できます。 -
mariabackupのユーザーには、RELOAD、LOCK TABLES、およびREPLICATION CLIENT特権が必要です。
手順
バックアップを作成するには、次のいずれかのオプションを使用します。
コマンドラインで認証情報を提供しながらバックアップを作成するには、次のように入力します。
mariabackup --backup --target-dir <backup_directory> --user <backup_user> --password <backup_passwd>
$ mariabackup --backup --target-dir <backup_directory> --user <backup_user> --password <backup_passwd>Copy to Clipboard Copied! Toggle word wrap Toggle overflow target-dirオプションは、バックアップファイルを格納するディレクトリーを定義します。完全バックアップを実行する場合は、ターゲットディレクトリーが空であるか、存在しない必要があります。userおよびpasswordオプションにより、ユーザー名とパスワードを設定できます。設定ファイルに認証情報を設定してバックアップを作成するには、次のコマンドを実行します。
-
/etc/my.cnf.d/ディレクトリーに設定ファイルを作成します (例:/etc/my.cnf.d/mariabackup.cnf)。 以下の内容をファイルに追加します。
[mysqld] user=<backup_username> password=<password>
[mysqld] user=<backup_username> password=<password>Copy to Clipboard Copied! Toggle word wrap Toggle overflow バックアップを実行します。
mariabackup --backup --target-dir <backup_directory>
$ mariabackup --backup --target-dir <backup_directory>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
1.7.2. mariabackup を使用したデータの復元 リンクのコピーリンクがクリップボードにコピーされました!
mariabackup ユーティリティーによって作成された MariaDB バックアップがある場合は、同じユーティリティーを使用してデータを復元できます。
前提条件
-
mariadbサービスが停止しています。 - データディレクトリーが空です。
-
mariabackupのユーザーには、RELOAD、LOCK TABLES、およびREPLICATION CLIENT特権が必要です。
手順
データを復元するには、次のいずれかのオプションを使用します。
/var/mariadb/backup/ディレクトリー内のバックアップからデータを復元し、元のバックアップファイルを保持するには、次のように入力します。mariabackup --copy-back --target-dir=/var/mariadb/backup/
$ mariabackup --copy-back --target-dir=/var/mariadb/backup/Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/mariadb/backup/ディレクトリー内のバックアップからデータを復元し、元のバックアップファイルを削除するには、次のように入力します。mariabackup --move-back --target-dir=/var/mariadb/backup/
$ mariabackup --move-back --target-dir=/var/mariadb/backup/Copy to Clipboard Copied! Toggle word wrap Toggle overflow
ファイルのパーミッションを修正します。たとえば、ファイルの所有権を
mysqlユーザーおよびグループに再帰的に変更するには、次のコマンドを実行します。chown -R mysql:mysql /var/lib/mysql/
# chown -R mysql:mysql /var/lib/mysql/Copy to Clipboard Copied! Toggle word wrap Toggle overflow データベースを復元する際、
mariabackupは、バックアップのファイルおよびディレクトリー特権を保持します。ただし、mariabackupは、ユーザーおよびグループがデータベースを復元する際にファイルをディスクに書き込みます。したがって、バックアップを復元した後、MariaDB サーバーのユーザーとグループに合わせてデータディレクトリーの所有者を調整する必要があります。mariadbサービスを起動します。systemctl start mariadb.service
# systemctl start mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.7.3. MariaDB サーバーでのファイルシステムバックアップの実行 リンクのコピーリンクがクリップボードにコピーされました!
ファイルシステムレベルのバックアップは、MariaDB インスタンス全体をバックアップする高速な方法です。この方法では、データの整合性を保つために mariadb サービスをシャットダウンする必要があります。
ファイルシステムレベルのバックアップは、アーキテクチャーと MariaDB バージョンに固有のものです。この方法でバックアップしたデータを、異なるアーキテクチャーまたは MariaDB バージョンで復元することはできません。
手順
mariadbサービスを停止します。systemctl stop mariadb.service
# systemctl stop mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow バックアップディレクトリーを作成します。次に例を示します。
mkdir -p /root/mariadb-backup/{data,config}/# mkdir -p /root/mariadb-backup/{data,config}/Copy to Clipboard Copied! Toggle word wrap Toggle overflow データディレクトリーをバックアップします。
cp -rp /var/lib/mysql/ /root/mariadb-backup/data/
# cp -rp /var/lib/mysql/ /root/mariadb-backup/data/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 設定ファイルをバックアップします。
cp -rp /etc/my.cnf /etc/my.cnf.d/ /root/mariadb-backup/config/
# cp -rp /etc/my.cnf /etc/my.cnf.d/ /root/mariadb-backup/config/Copy to Clipboard Copied! Toggle word wrap Toggle overflow mariadbサービスを起動します。systemctl start mariadb.service
# systemctl start mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.7.4. MariaDB サーバーでのファイルシステムバックアップの復元 リンクのコピーリンクがクリップボードにコピーされました!
MariaDB インスタンスが破損した場合は、以前にデータディレクトリーと設定ファイルを含むファイルシステムバックアップを実行済みであれば、このバックアップからインスタンスを復元できます。
前提条件
- MariaDB サーバーでファイルシステムバックアップを実行した。
ターゲットサーバーが、以下に示すバックアップソースの条件を満たしている必要があります。
- MariaDB のバージョンが同じかそれ以降である必要があります。
- システムアーキテクチャーが同じである必要があります。
手順
mariadbサービスを停止します。systemctl stop mariadb.service
# systemctl stop mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 現在の
/var/lib/mysql/ディレクトリーを削除します。rm -rf /var/lib/mysql/
# rm -rf /var/lib/mysql/Copy to Clipboard Copied! Toggle word wrap Toggle overflow バックアップからデータディレクトリーを復元します。
cp -rp /root/mariadb-backup/data/mysql/ /var/lib/
# cp -rp /root/mariadb-backup/data/mysql/ /var/lib/Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/lib/mysql/ディレクトリーの所有権を正しく設定します。chown -R mysql:mysql /var/lib/mysql/
# chown -R mysql:mysql /var/lib/mysql/Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/lib/mysql/ディレクトリーの SELinux コンテキストを復元します。restorecon -Rv /var/lib/mysql/
# restorecon -Rv /var/lib/mysql/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 現在の設定ファイルを削除します。
rm -rf /etc/my.cnf /etc/my.cnf.d/
# rm -rf /etc/my.cnf /etc/my.cnf.d/Copy to Clipboard Copied! Toggle word wrap Toggle overflow バックアップから設定ファイルを復元します。
cp -rp /root/mariadb-backup/config/my.cnf /root/mariadb-backup/config/my.cnf.d/ /etc/
# cp -rp /root/mariadb-backup/config/my.cnf /root/mariadb-backup/config/my.cnf.d/ /etc/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 設定ファイルの所有権を正しく設定します。
chown -R root:root /etc/my.cnf /etc/my.cnf.d/
# chown -R root:root /etc/my.cnf /etc/my.cnf.d/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 設定ファイルの SELinux コンテキストを復元します。
restorecon -Rv /etc/my.cnf /etc/my.cnf.d/
# restorecon -Rv /etc/my.cnf /etc/my.cnf.d/Copy to Clipboard Copied! Toggle word wrap Toggle overflow mariadbサービスを起動します。systemctl start mariadb.service
# systemctl start mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
MariaDB データベースに接続してデータを照会します。次に例を示します。
mariadb -u root -p <database> -e "*SELECT * FROM <table>;"
# mariadb -u root -p <database> -e "*SELECT * FROM <table>;"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.8. Galera で MariaDB を複製する リンクのコピーリンクがクリップボードにコピーされました!
Galera ソリューションを使用して MariaDB データベースをレプリケートすることで、高可用性とデータの整合性を実現する同期型のマルチソースクラスターを作成できます。
レプリケーション自体は、バックアップソリューションとしては十分ではありません。レプリケーションは、ハードウェア障害からソースサーバーを保護しますが、データ損失に対する保護は保証していません。
1.8.1. MariaDB Galera Cluster の概要 リンクのコピーリンクがクリップボードにコピーされました!
MariaDB Galera Cluster は、すべてのノードへの書き込みを可能にして、クラスター全体のデータの整合性を確保する同期型のマルチソースレプリケーションを提供します。
Galera レプリケーションと MariaDB データベースとの間のインターフェイスは、書き込みセットレプリケーション API (wsrep API) で定義されます。
MariaDB Galera Cluster の主な機能は以下のとおりです。
- 同期のレプリケーション
- アクティブ/アクティブのマルチソーストポロジー
- クラスターノードへの読み取りおよび書き込み
- 自動メンバーシップ制御、失敗したノードのクラスターからの削除
- 自動ノードの参加
- 行レベルの並列レプリケーション
- ダイレクトクライアント接続: ユーザーはクラスターノードにログインし、レプリケーションの実行中にノードを直接操作できます。
同期レプリケーションとは、サーバーがトランザクションに関連付けられた書き込みセットをクラスター内のすべてのノードにブロードキャストすることで、コミット時にトランザクションをレプリケートすることを意味します。クライアント (ユーザーアプリケーション) は、データベース管理システム (DBMS) に直接接続し、ネイティブの MariaDB と同様の動作が発生します。
同期レプリケーションは、クラスター内の 1 つのノードで発生した変更が、クラスター内の他のノードで同時に発生することを保証します。
そのため、同期レプリケーションには、非同期のレプリケーションと比べて次のような利点があります。
- 特定のクラスターノード間の変更の伝播に遅延がない
- すべてのクラスターノードには常に一貫性がある
- いずれかのクラスターノードがクラッシュしても、最新の変更は失われない
- すべてのクラスターノードのトランザクションが並列に実行する
- クラスター全体にわたる因果関係
1.8.2. MariaDB Galera Cluster を構築するためのコンポーネント リンクのコピーリンクがクリップボードにコピーされました!
正常に動作し、同期レプリケーションを行う MariaDB Galera Cluster をデプロイする前に、中核となるソフトウェアコンポーネントをインストールし、その機能を理解する必要があります。そのコンポーネントとは、具体的には MariaDB サーバー、Galera Replication ライブラリー、および補助的な Galera パッケージです。
MariaDB Galera Cluster を構築するには、システムに以下のパッケージをインストールする必要があります。
-
mariadb-server-galera: MariaDB Galera Cluster のサポートファイルとスクリプトが含まれます。 -
mariadb-server: MariaDB アップストリームがパッチを適用し、書き込みセットレプリケーション API (wsrep API) を組み込みます。この API は、Galera レプリケーションと MariaDB との間のインターフェイスを提供します。 galera: MariaDB アップストリームがパッチを適用し、MariaDB の完全サポートを追加します。galeraパッケージには、以下の内容が含まれます。- Galera Replication Library は、レプリケーション機能全体を提供します。
- Galera Arbitrator ユーティリティーは、スプリットブレインのシナリオで投票に参加するクラスターメンバーとして使用できます。ただし、Galera Arbitrator は実際のレプリケーションには参加できません。
-
Galera Arbitrator ユーティリティーのデプロイに使用される Galera Systemd service および Galera wrapper script。RHEL 10 は、
/usr/lib/systemd/system/garbd.serviceおよび/usr/sbin/garb-systemdにあるこれらのファイルのアップストリームバージョンを提供します。
1.8.3. MariaDB Galera Cluster のデプロイメント リンクのコピーリンクがクリップボードにコピーされました!
必要なパッケージをインストールし、クラスターの設定を行い、最初のノードをブートストラップして新しいクラスターを作成することにより、MariaDB Galera Cluster をデプロイできます。
前提条件
- クラスター内のすべてのノードに TLS がセットアップ されている。
すべてのノード上のすべての証明書の
Extended Key Usageフィールドが次のように設定されている。TLS Web Server Authentication, TLS Web Client Authentication
TLS Web Server Authentication, TLS Web Client AuthenticationCopy to Clipboard Copied! Toggle word wrap Toggle overflow
手順
MariaDB Galera Cluster パッケージをインストールします。
dnf install mariadb-server-galera
# dnf install mariadb-server-galeraCopy to Clipboard Copied! Toggle word wrap Toggle overflow その結果、次のパッケージが依存関係とともにインストールされます。
-
mariadb-server-galera -
mariadb-server galeraMariaDB Galera Cluster の構築に必要なこれらのパッケージの詳細は、MariaDB クラスターをビルドするためのコンポーネント を参照してください。
-
システムを初めてクラスターに追加する前に、MariaDB サーバーのレプリケーション設定を更新します。デフォルト設定は、
/etc/my.cnf.d/galera.cnfファイルに含まれています。MariaDB Galera Cluster をデプロイする前に、以下の文字列で開始するように、すべてのノードの/etc/my.cnf.d/galera.cnfファイルにwsrep_cluster_addressオプションを設定します。gcomm://
gcomm://Copy to Clipboard Copied! Toggle word wrap Toggle overflow 初期ノードでは、
wsrep_cluster_addressを空のリストとして設定できます。wsrep_cluster_address="gcomm://"
wsrep_cluster_address="gcomm://"Copy to Clipboard Copied! Toggle word wrap Toggle overflow その他のすべてのノードでは、
wsrep_cluster_addressを設定して、実行中のクラスターに属するノードへのアドレスを追加します。以下に例を示します。wsrep_cluster_address="gcomm://10.0.0.10"
wsrep_cluster_address="gcomm://10.0.0.10"Copy to Clipboard Copied! Toggle word wrap Toggle overflow Galera Cluster アドレスの設定方法は、Galera Cluster Address を参照してください。
-
/etc/my.cnf.d/galera.cnf設定ファイルでwsrep_on=1オプションを設定して、すべてのノードでwsrepAPI を有効にします。 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"
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"Copy to Clipboard Copied! Toggle word wrap Toggle overflow ノードで以下のラッパーを実行して、新規クラスターの最初のノードをブートストラップします。
galera_new_cluster
# galera_new_clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow このラッパーにより、MariaDB サーバーデーモン (
mariadbd) に--wsrep-new-clusterオプションが指定されて実行されるようになります。このオプションは、接続する既存クラスターがないという情報を提供します。したがって、ノードは新規 UUID を作成し、新しいクラスターを特定します。注記mariadbサービスは、複数の MariaDB サーバープロセスと対話する systemd メソッドをサポートします。したがって、複数の MariaDB サーバーが実行中の場合は、インスタンス名を接尾辞として指定することで、特定のインスタンスをブートストラップできます。galera_new_cluster mariadb@node1
# galera_new_cluster mariadb@node1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 各ノードで次のコマンドを実行して、その他のノードをクラスターに接続します。
systemctl start mariadb
# systemctl start mariadbCopy to Clipboard Copied! Toggle word wrap Toggle overflow その結果、ノードはクラスターに接続し、それ自体をクラスターの状態と同期します。
検証
- MariaDB Galera クラスターのステータスを確認する を参照してください。
1.8.4. MariaDB Galera クラスターのステータスの確認 リンクのコピーリンクがクリップボードにコピーされました!
MariaDB Galera クラスターの健全性、パフォーマンス、同期を監視し、確保することが重要です。そのためには、各ノードのステータス変数をクエリーして、ノードとクラスターを監視できます。
MariaDB Galera クラスターのステータスを確認するには、次のクエリーを使用します。
クラスター内のノードの数を表示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ノードのクラスターコンポーネントのステータスを表示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow wsrep_cluster_status変数の値は、現在のノードが属するクラスターコンポーネントのステータスを示します。可能な値は次のとおりです。-
Primary: クラスターは正常に機能しています。定足数が満たされています。正常なクラスターでは、すべてのノードがPrimaryを報告します。 -
Non-primary: ノードはクラスターのプライマリーコンポーネントへの接続を失い、アクティブクラスターの一部ではなくなりました。ただし、ノードは引き続き読み取りクエリーを処理できますが、書き込み操作を処理することはできません。 -
Disconnected: ノードはどのクラスターコンポーネントにも接続されていません。その結果、クエリーを受け入れることができず、データはレプリケートされません。
-
ノードのステータスを表示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow wsrep_local_state_comment変数の頻繁に使用される値は次のとおりです。-
Synced: ノードはクラスター内で完全に同期されており、レプリケーションにアクティブに参加しています。 -
Desynced: ノードは引き続きクラスターの一部ですが、状態の遷移で主にビジー状態です。 -
Joining: ノードはクラスターへの参加処理中です。 -
Joined: ノードはクラスターに正常に参加しました。クラスターから書き込みセットを受信して適用できます。 -
Donor: ノードは現在、State Snapshot Transfer (SST) を提供しています。新しいノードが参加して完全な状態の遷移が必要な場合、クラスターは既存のノードを選択して必要なデータを送信します。
-
ノードがクラスターからの書き込みセットを受け入れるかどうかを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow wsrep_ready変数がONの場合、ノードはコンポーネントを正常に初期化し、クラスターに接続されています。さらに、ノードは同期されているか、クエリーを処理できる状態に達しています。ノードが他のホストとネットワーク接続されているか確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ON値は、ノードがクラスター内の少なくとも 1 つのメンバーに接続されていることを意味します。最後の
FLUSH STATUSコマンド以降、またはサーバーの起動以降の書き込みセットのローカル受信キューの平均サイズを表示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 0 に近い値は理想的な状態であり、ノードが書き込みセットを受信するとそれを適用し続けることを示します。値が継続的に高い、または増加している場合は、ディスク I/O が遅いなどのパフォーマンスのボトルネックが発生している可能性があります。
フロー制御ステータスを表示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この変数は、ローカル受信キューがいっぱいでフロー制御がトリガーされたために、ノードが一時停止され、新しい着信トランザクションを処理できない時間の割合を表します。値が 0 に近い場合、ノードはレプリケーションワークロードを効率的に継続していることを示します。値が 1.0 に近づくと、ノードが書き込みセットの適用で頻繁または継続的に問題に遭遇し、クラスターのボトルネックになる可能性があることを意味します。
ノードが頻繁に一時停止する場合は、
/etc/my.cnf.d/galera.cnfファイルのwsrep_slave_threadsパラメーターを調整できます。ノードが並列に適用できる最小シーケンス番号と最大シーケンス番号間の平均距離を表示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 値が大きいほど、並列度が高くなります。これは、
/etc/my.cnf.d/galera.cnfファイルのwsrep_slave_threadsパラメーターで使用できる最適な値です。
1.8.5. MariaDB Galera Cluster への新しいノードの追加 リンクのコピーリンクがクリップボードにコピーされました!
ノードの設定ファイルでクラスターアドレスを設定することにより、MariaDB Galera Cluster に新しいノードを追加したり、既存のノードに再接続したりできます。
手順
特定のノードで、
/etc/my.cnf.d/galera.cnf設定ファイルの[mariadb]セクション内にあるwsrep_cluster_addressオプションで、1 つ以上の既存クラスターメンバーにアドレスを指定します。[mariadb] wsrep_cluster_address="gcomm://192.168.0.1"
[mariadb] wsrep_cluster_address="gcomm://192.168.0.1"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 新規ノードを既存クラスターノードのいずれかに接続すると、クラスター内のすべてのノードを表示できるようになります。
ただし、
wsrep_cluster_addressにクラスターのすべてのノードをリスト表示することを推奨します。したがって、1 つ以上のクラスターノードがダウンしても、その他のクラスターノードに接続することでノードがクラスターに参加できます。すべてのメンバーがメンバーシップに同意すると、クラスターの状態が変更します。新規ノードの状態がクラスターの状態と異なる場合、新しいノードは Incremental State Transfer (IST) または State Snapshot Transfer (SST) のいずれかを要求し、他のノードとの一貫性を確保します。
1.8.6. MariaDB Galera Cluster の再起動 リンクのコピーリンクがクリップボードにコピーされました!
すべてのノードを同時にシャットダウンすると、クラスターが終了し、実行中のクラスターは存在しなくなります。ただし、クラスターのデータは引き続き存在します。
クラスターを再起動するには、MariaDB Galera Cluster のデプロイ の説明に従って、最初のノードをブートストラップします。
クラスターがブートストラップされておらず、最初のノードの mariadb が systemctl start mariadb コマンドのみで起動された場合、ノードは /etc/my.cnf.d/galera.cnf ファイルの wsrep_cluster_address オプションにリスト表示されているノードの 1 つ以上に接続しようとします。現在実行中のノードがない場合、再起動は失敗します。
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
# dnf install mariadb-serverCopy to Clipboard Copied! Toggle word wrap Toggle overflow サービスがすでに実行されている場合は停止します。
systemctl stop mariadb.service
# systemctl stop mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
以前のホストの
/var/lib/mysql/ディレクトリーの内容を、RHEL 10 ホストの同じ場所にコピーします。 -
以前のホストから
/etc/my.cnf.d/ディレクトリーに設定ファイルをコピーし、ファイルに MariaDB 10.11 に有効なオプションのみが含まれていることを確認します。詳細は、アップストリームのドキュメント を参照してください。 SELinux コンテキストを復元します。
restorecon -rv /var/lib/mysql/ restorecon -rv /etc/my.cnf.d/
# restorecon -rv /var/lib/mysql/ # restorecon -rv /etc/my.cnf.d/Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/lib/mysql/とそのサブディレクトリーの正しい所有権を確認します。chown -R mysql:mysql /var/lib/mysql/
# chown -R mysql:mysql /var/lib/mysql/Copy to Clipboard Copied! Toggle word wrap Toggle overflow mariadbサービスを有効にして起動します。systemctl enable --now mariadb.service
# systemctl enable --now mariadb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow サービスが開始されると、MariaDB は内部テーブルを自動的にチェック、修復、更新します。
検証
MariaDB サーバーへの接続を確立します。
mysql -u root -p -h <hostname>
# mysql -u root -p -h <hostname>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第2章 MySQL の使用 リンクのコピーリンクがクリップボードにコピーされました!
MySQL サーバーは、高性能なオープンソースのリレーショナルデータベース管理システム (RDBMS) です。データアクセス用の SQL インターフェイスと、複数のストレージエンジンのサポートなどの高度な機能を備えています。
RHEL システムに MySQL をインストールして設定する方法、MySQL データをバックアップする方法、以前の MySQL バージョンから移行する方法、および MySQL データベースをレプリケートする方法を説明します。
2.1. MySQL のインストール リンクのコピーリンクがクリップボードにコピーされました!
RHEL 10 では、Application Stream の初期バージョンとして MySQL 8.4 が提供されます。これは、RPM パッケージとしてインストールできます。追加の MySQL バージョンは、RHEL 10 のマイナーリリースで、ライフサイクルが短いモジュールとして提供されます。
設計上、同じモジュールの 1 つのバージョン (ストリーム) のみをインストールでき、RPM パッケージが競合するため、MariaDB と MySQL を同じホストにインストールすることはできません。代わりに、コンテナー内でデータベースサーバーサービスを実行することもできます。コンテナーを使用して、単一のホスト上で複数の MariaDB および MySQL インスタンスを実行する を参照してください。
手順
MySQL サーバーパッケージをインストールします。
dnf install mysql8.4-server
# dnf install mysql8.4-serverCopy to Clipboard Copied! Toggle word wrap Toggle overflow mysqldサービスを有効にして起動します。systemctl enable --now mysqld.service
# systemctl enable --now mysqld.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow インストール後のセキュリティーを強化します。
mysql_secure_installation
$ mysql_secure_installationCopy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドは、完全にインタラクティブなスクリプトを起動して、プロセスの各ステップのプロンプトを表示します。このスクリプトを使用すると、次の方法でセキュリティーを改善できます。
- root アカウントのパスワードの設定
- 匿名ユーザーの削除
- リモート root ログインの拒否 (ローカルホスト外)
2.2. コンテナーを使用して、単一のホスト上で複数の MariaDB および MySQL インスタンスを実行する リンクのコピーリンクがクリップボードにコピーされました!
パッケージから MariaDB または MySQL をインストールする場合、同じホスト上でこれらのサービスのうち 1 つのみ、かつその 1 つのバージョンのみを実行できます。代わりに、コンテナー内でサービスを実行することもできます。
次のような環境を構成できます。
- 同じホスト上で MariaDB または MySQL の複数のインスタンスを実行したい。
- MariaDB と MySQL の両方を同じホストで実行したい。
前提条件
-
podmanパッケージがインストールされている。
手順
Red Hat カスタマーポータルアカウントを使用して、
registry.redhat.ioレジストリーに対して認証します。podman login registry.redhat.io
# podman login registry.redhat.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow すでにコンテナーレジストリーにログインしている場合は、このステップをスキップしてください。
使用するコンテナーを起動します。
MariaDB 10.11:
podman run -d --name <container_name_1> -e MYSQL_ROOT_PASSWORD=<password> -p <host_port_1>:3306 rhel10/mariadb-1011
$ podman run -d --name <container_name_1> -e MYSQL_ROOT_PASSWORD=<password> -p <host_port_1>:3306 rhel10/mariadb-1011Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコンテナーイメージを使用する方法の詳細は、Red Hat Ecosystem Catalog を参照してください。
MySQL 8.4:
podman run -d --name <container_name_2> -e MYSQL_ROOT_PASSWORD=<password> -p <host_port_2>:3306 rhel10/mysql-84
$ podman run -d --name <container_name_2> -e MYSQL_ROOT_PASSWORD=<password> -p <host_port_2>:3306 rhel10/mysql-84Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコンテナーイメージを使用する方法の詳細は、Red Hat Ecosystem Catalog を参照してください。
重要2 つのデータベースサーバーのコンテナー名とホストポートが異なっている必要があります。
クライアントがネットワーク上のデータベースサーバーにアクセスできるように、ファイアウォールでホストポートを開きます。
firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,...} firewall-cmd --reload# firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,...} # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
データベースサーバーに接続し、root としてログインします。
mysql -u root -p -h localhost -P <host_port> --protocol tcp
# mysql -u root -p -h localhost -P <host_port> --protocol tcpCopy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: 実行中のコンテナーに関する情報を表示します。
podman ps
$ podman psCopy to Clipboard Copied! Toggle word wrap Toggle overflow
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 --reload
# firewall-cmd --permanent --add-service=mysql # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow mysqldサービスを再起動します。systemctl restart mysqld.service
# systemctl restart mysqld.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
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 のドキュメントを参照してください。
-
サーバーの秘密鍵:
手順
CA およびサーバー証明書を
/etc/pki/tls/certs/ディレクトリーに保存します。mv <path>/server.example.com.crt.pem /etc/pki/tls/certs/ mv <path>/ca.crt.pem /etc/pki/tls/certs/
# mv <path>/server.example.com.crt.pem /etc/pki/tls/certs/ # mv <path>/ca.crt.pem /etc/pki/tls/certs/Copy to Clipboard Copied! Toggle word wrap Toggle overflow MySQL サーバーがファイルを読み取れるように、CA とサーバー証明書のパーミッションを設定します。
chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem
# chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 証明書は、セキュアな接続が確立される前は通信の一部であるため、任意のクライアントは認証なしで証明書を取得できます。そのため、CA およびサーバーの証明書ファイルに厳密なパーミッションを設定する必要はありません。
サーバーの秘密鍵を
/etc/pki/tls/private/ディレクトリーに保存します。mv <path>/server.example.com.key.pem /etc/pki/tls/private/
# mv <path>/server.example.com.key.pem /etc/pki/tls/private/Copy to Clipboard Copied! Toggle word wrap Toggle overflow サーバーの秘密鍵にセキュアなパーミッションを設定します。
chmod 640 /etc/pki/tls/private/server.example.com.key.pem chgrp mysql /etc/pki/tls/private/server.example.com.key.pem
# chmod 640 /etc/pki/tls/private/server.example.com.key.pem # chgrp mysql /etc/pki/tls/private/server.example.com.key.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 承認されていないユーザーが秘密鍵にアクセスできる場合、MySQL サーバーへの接続は安全ではなくなります。
SELinux コンテキストを復元します。
restorecon -Rv /etc/pki/tls/
# restorecon -Rv /etc/pki/tls/Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.4.2. MySQL サーバーでの TLS 暗号化の設定 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、MySQL は暗号化されていない接続を使用します。よりセキュアな接続のために、MySQL サーバーで Transport Layer Security (TLS) サポートを有効にし、暗号化された接続を確立するようにクライアントを設定できます。
前提条件
- 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.pem
[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.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 証明書失効リスト (CRL) がある場合は、それを使用するように MySQL サーバーを設定します。
ssl_crl = /etc/pki/tls/certs/example.crl.pem
ssl_crl = /etc/pki/tls/certs/example.crl.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: 暗号化なしの接続試行を拒否します。この機能を有効にするには、以下を追加します。
require_secure_transport = on
require_secure_transport = onCopy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: サーバーがサポートする必要がある TLS バージョンを設定します。たとえば、TLS 1.3 のみをサポートするには、次を追加します。
tls_version = TLSv1.3
tls_version = TLSv1.3Copy to Clipboard Copied! Toggle word wrap Toggle overflow デフォルトでは、サーバーは TLS 1.2 と TLS 1.3 をサポートします。
mysqldサービスを再起動します。systemctl restart mysqld
# systemctl restart mysqldCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
トラブルシューティングを簡素化するには、ローカルクライアントが TLS 暗号化を使用するように設定する前に、MySQL サーバーで以下の手順を実行します。
MySQL で TLS 暗号化が有効になっていることを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow MySQL サーバーが特定の TLS バージョンのみをサポートするように設定している場合は、
tls_version変数を表示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow サーバーが正しい CA 証明書、サーバー証明書、および秘密鍵ファイルを使用していることを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.4.3. MySQL サーバー上の特定のユーザーアカウントに対して TLS 暗号化接続を必須とする リンクのコピーリンクがクリップボードにコピーされました!
機密データの転送を保護するために、特定の MySQL ユーザーアカウントに対して TLS 暗号化接続を必須とするように設定できます。
サーバー側ですべての接続に対してセキュアな転送を必須とするように設定 (require_secure_transport = on) できない場合は、個々のユーザーアカウントに対して TLS 暗号化を必須とするように設定してください。
前提条件
- MySQL サーバーで TLS サポートが有効になっている。
- セキュアなトランスポートを必要とするように設定するユーザーが存在する。
- CA 証明書がクライアントに保存されている。
手順
管理ユーザーとして MySQL サーバーに接続します。
mysql -u root -p -h server.example.com
# mysql -u root -p -h server.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 管理ユーザーがリモートでサーバーにアクセスするパーミッションを持たない場合は、MySQL サーバーでコマンドを実行し、
localhostに接続します。REQUIRE SSL句を使用して、ユーザーが TLS 暗号化接続を使用して接続する必要があるよう強制します。MySQL [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;
MySQL [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
TLS 暗号化を使用して、
exampleユーザーとしてサーバーに接続します。mysql -u example -p -h server.example.com ... MySQL [(none)]>
# mysql -u example -p -h server.example.com ... MySQL [(none)]>Copy to Clipboard Copied! Toggle word wrap Toggle overflow エラーが表示されず、インタラクティブな MySQL コンソールにアクセスできる場合は、TLS による接続は成功しています。
デフォルトでは、サーバーが TLS 暗号化を提供している場合、クライアントは自動的にその TLS 暗号化を使用します。したがって、
--ssl-ca=ca.crt.pemおよび--ssl-mode=VERIFY_IDENTITYオプションは必須ではありません。ただし、これらのオプションを使用するとクライアントはサーバーの ID を検証するため、セキュリティーが向上します。TLS を無効にして、
exampleユーザーとして接続を試みます。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)
# 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)Copy to Clipboard Copied! Toggle word wrap Toggle overflow このユーザーには TLS が必要なのにもかかわらず無効になっているため、サーバーはログインの試行を拒否しました (
--ssl-mode=DISABLED)。
2.5. デフォルトで TLS 暗号化を使用するように MySQL クライアントを設定する リンクのコピーリンクがクリップボードにコピーされました!
RHEL では、MySQL クライアントが TLS 暗号化を使用するようにグローバルに設定でき、サーバー証明書の Common Name (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
[client] ssl-mode=VERIFY_IDENTITY ssl-ca=/etc/pki/tls/certs/ca.crt.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow これらの設定は、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_SHA384
# mysql -u root -p -h server.example.com -e status ... SSL: Cipher in use is TLS_AES_256_GCM_SHA384Copy to Clipboard Copied! Toggle word wrap Toggle overflow SSLエントリーにCipher in use is…が含まれている場合、接続は暗号化されています。このコマンドで使用するユーザーには、リモートで認証するパーミッションがあることに注意してください。
接続するホスト名がサーバーの 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
# mysql -u root -p -h localhost -e status ERROR 2026 (HY000): SSL connection error: error:0A000086:SSL routines::certificate verify failedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
2.6. 論理ダンプを使用した MySQL データのバックアップと復元 リンクのコピーリンクがクリップボードにコピーされました!
MySQL データの論理バックアップは、データの復元に必要な SQL ステートメントで構成されます。物理バックアップに対する論理バックアップの利点は、異なるハードウェア構成や MySQL バージョンでもデータを復元できることです。
2.6.1. mysqldump を使用した論理バックアップの実行 リンクのコピーリンクがクリップボードにコピーされました!
mysqldump ユーティリティーは、1 つ以上のデータベースをエクスポートできるバックアップユーティリティーです。mysqldump の出力は通常、サーバーテーブル構造を再作成したり、そこにデータを入力したり、またはその両方を行う SQL ステートメントで構成されます。
mysqldump バックアップを実行するには、以下のいずれかのオプションを使用できます。
- 選択したデータベースを 1 つまたは複数バックアップ
- すべてのデータベースをバックアップする。
- あるデータベースのテーブルのサブセットのバックアップを作成する。
手順
単一のデータベースをダンプするには、以下を実行します。
mysqldump [options] --databases db_name > backup-file.sql
# mysqldump [options] --databases db_name > backup-file.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 複数のデータベースを一度にダンプするには、次のコマンドを実行します。
mysqldump [options] --databases db_name1 [db_name2 ...] > backup-file.sql
# mysqldump [options] --databases db_name1 [db_name2 ...] > backup-file.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow すべてのデータベースをダンプするには、以下を実行します。
mysqldump [options] --all-databases > backup-file.sql
# mysqldump [options] --all-databases > backup-file.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 1 つ以上のダンプされたフルデータベースをサーバーにロードし直すには、以下を実行します。
mysql < backup-file.sql
# mysql < backup-file.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow データベースをリモート MySQL サーバーにロードするには、以下を実行します。
mysql --host=remote_host < backup-file.sql
# mysql --host=remote_host < backup-file.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 1 つのデータベースからテーブルのサブセットをダンプするには、
mysqldumpコマンドの末尾に、選択したテーブルのリストを追加します。mysqldump [options] db_name [tbl_name ...] > backup-file.sql
# mysqldump [options] db_name [tbl_name ...] > backup-file.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 1 つのデータベースからダンプされたテーブルのサブセットをロードするには、以下を実行します。
mysql db_name < backup-file.sql
# mysql db_name < backup-file.sqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記この時点で、db_name データベースが存在している必要があります。
mysqldumpがサポートするオプションのリストを表示するには、以下を実行します。mysqldump --help
$ mysqldump --helpCopy to Clipboard Copied! Toggle word wrap Toggle overflow
2.6.2. SQL 形式のダンプから MySQL のデータを復元する リンクのコピーリンクがクリップボードにコピーされました!
1 つまたは複数のデータベースを SQL ファイルにバックアップした場合は、このファイルを使用してデータベース構造とそのデータを再作成できます。
前提条件
-
mysqldサービスが実行されている。 -
rootアカウントなど、データを復元する権限を持つ認証情報を持っている。
手順
復元するデータベースがすでに存在し、SQL ファイルに
DROP TABLE IF EXISTSステートメントが含まれていない場合は、テーブルまたはデータベース全体を手動で削除する必要があります。テーブルを削除するには、次のように入力します。
mysql -u root -p -e "DROP TABLE <database>.<table>;"
# mysql -u root -p -e "DROP TABLE <database>.<table>;"Copy to Clipboard Copied! Toggle word wrap Toggle overflow SQL ファイルによって再作成されるすべてのテーブルに対してこのコマンドを繰り返します。
データベースを削除するには、次のように入力します。
mysql -u root -p -e "DROP DATABASE <database>;"
# mysql -u root -p -e "DROP DATABASE <database>;"Copy to Clipboard Copied! Toggle word wrap Toggle overflow SQL ファイルによって再作成されるすべてのデータベースに対してこのコマンドを繰り返します。
SQL ファイルをインポートします。
mysql -u root -p < backup.sql"
# mysql -u root -p < backup.sql"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
MySQL データベースに接続してデータを照会します。次に例を示します。
mysql -u root -p <database> -e "*SELECT * FROM <table>;"
# mysql -u root -p <database> -e "*SELECT * FROM <table>;"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.7. 物理コピーを使用した MySQL データのバックアップと復元 リンクのコピーリンクがクリップボードにコピーされました!
MySQL データの物理バックアップには、コンテンツを格納しているファイルとディレクトリーが含まれます。通常、この方法はより高速で、サイズが小さくなります。
2.7.1. MySQL サーバーでのファイルシステムバックアップの実行 リンクのコピーリンクがクリップボードにコピーされました!
ファイルシステムレベルのバックアップは、MySQL インスタンス全体をバックアップする高速な方法です。この方法では、データの整合性を保つために mysqld サービスをシャットダウンする必要があります。
ファイルシステムレベルのバックアップは、アーキテクチャーと MySQL バージョンに固有のものです。この方法でバックアップしたデータを、異なるアーキテクチャーまたは MySQL バージョンで復元することはできません。
手順
mysqldサービスを停止します。systemctl stop mysqld.service
# systemctl stop mysqld.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow バックアップディレクトリーを作成します。次に例を示します。
mkdir -p /root/mysqld-backup/{data,config}/# mkdir -p /root/mysqld-backup/{data,config}/Copy to Clipboard Copied! Toggle word wrap Toggle overflow データディレクトリーをバックアップします。
cp -rp /var/lib/mysql/ /root/mysqld-backup/data/
# cp -rp /var/lib/mysql/ /root/mysqld-backup/data/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 設定ファイルをバックアップします。
cp -rp /etc/my.cnf /etc/my.cnf.d/ /root/mysqld-backup/config/
# cp -rp /etc/my.cnf /etc/my.cnf.d/ /root/mysqld-backup/config/Copy to Clipboard Copied! Toggle word wrap Toggle overflow mysqldサービスを開始します。systemctl start mysqld.service
# systemctl start mysqld.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
2.7.2. MySQL サーバーでのファイルシステムバックアップの復元 リンクのコピーリンクがクリップボードにコピーされました!
MySQL インスタンスが破損した場合は、以前にデータディレクトリーと設定ファイルを含むファイルシステムバックアップを実行済みであれば、このバックアップからインスタンスを復元できます。
前提条件
- MySQL サーバーでファイルシステムバックアップを実行した。
ターゲットサーバーが、以下に示すバックアップソースの条件を満たしている必要があります。
- MySQL のバージョンが同じかそれ以降である必要があります。
- システムアーキテクチャーが同じである必要があります。
手順
mysqldサービスを停止します。systemctl stop mysqld.service
# systemctl stop mysqld.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 現在の
/var/lib/mysql/ディレクトリーを削除します。rm -rf /var/lib/mysql/
# rm -rf /var/lib/mysql/Copy to Clipboard Copied! Toggle word wrap Toggle overflow バックアップからデータディレクトリーを復元します。
cp -rp /root/mysqld-backup/data/mysql/ /var/lib/
# cp -rp /root/mysqld-backup/data/mysql/ /var/lib/Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/lib/mysql/ディレクトリーの所有権を正しく設定します。chown -R mysql:mysql /var/lib/mysql/
# chown -R mysql:mysql /var/lib/mysql/Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/lib/mysql/ディレクトリーの SELinux コンテキストを復元します。restorecon -Rv /var/lib/mysql/
# restorecon -Rv /var/lib/mysql/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 現在の設定ファイルを削除します。
rm -rf /etc/my.cnf /etc/my.cnf.d/
# rm -rf /etc/my.cnf /etc/my.cnf.d/Copy to Clipboard Copied! Toggle word wrap Toggle overflow バックアップから設定ファイルを復元します。
cp -rp /root/mysqld-backup/config/my.cnf /root/mysqld-backup/config/my.cnf.d/ /etc/
# cp -rp /root/mysqld-backup/config/my.cnf /root/mysqld-backup/config/my.cnf.d/ /etc/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 設定ファイルの所有権を正しく設定します。
chown -R root:root /etc/my.cnf /etc/my.cnf.d/
# chown -R root:root /etc/my.cnf /etc/my.cnf.d/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 設定ファイルの SELinux コンテキストを復元します。
restorecon -Rv /etc/my.cnf /etc/my.cnf.d/
# restorecon -Rv /etc/my.cnf /etc/my.cnf.d/Copy to Clipboard Copied! Toggle word wrap Toggle overflow mysqldサービスを開始します。systemctl start mysqld.service
# systemctl start mysqld.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
MySQL データベースに接続してデータを照会します。次に例を示します。
mysql -u root -p <database> -e "*SELECT * FROM <table>;"
# mysql -u root -p <database> -e "*SELECT * FROM <table>;"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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.loggtid_mode=ONこのオプションは、サーバー上でグローバルトランザクション識別子 (GTID) を有効にします。
enforce-gtid-consistency=ONサーバーは、GTID を使用して安全にログに記録できるステートメントのみの実行を許可することにより、GTID の整合性を強化します。
オプション:
binlog_do_db=db_name選択したデータベースのみを複製する場合は、このオプションを使用します。選択した複数のデータベースを複製するには、各データベースを個別に指定します。
binlog_do_db=db_name1 binlog_do_db=db_name2 binlog_do_db=db_name3
binlog_do_db=db_name1 binlog_do_db=db_name2 binlog_do_db=db_name3Copy to Clipboard Copied! Toggle word wrap Toggle overflow オプション:
binlog_ignore_db=db_nameこのオプションを使用して、特定のデータベースをレプリケーションから除外します。
mysqldサービスを再起動します。systemctl restart mysqld.service
# systemctl restart mysqld.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
2.8.2. MySQL レプリカサーバーの設定 リンクのコピーリンクがクリップボードにコピーされました!
レプリケーションを成功させるために MySQL レプリカサーバーに必要な設定オプションを設定できます。
前提条件
- レプリカサーバーがインストールされている。
レプリカサーバーに TLS がセットアップ されている。
重要ソース証明書とレプリカ証明書が、同じ認証局によって署名されている必要があります。
手順
[mysqld]セクションの/etc/my.cnf.d/mysql-server.cnfファイルに以下のオプションを含めます。server-id=idid は一意である必要があります。
relay-log=path_to_replica_server_logリレーログは、レプリケーション中に 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このオプションは、レプリカサーバーの起動時に、レプリカサーバーがレプリケーションスレッドを開始しないようにします。
オプション:
binlog_do_db=db_name特定のデータベースのみを複製する場合は、このオプションを使用します。複数のデータベースを複製するには、各データベースを個別に指定します。
binlog_do_db=db_name1 binlog_do_db=db_name2 binlog_do_db=db_name3
binlog_do_db=db_name1 binlog_do_db=db_name2 binlog_do_db=db_name3Copy to Clipboard Copied! Toggle word wrap Toggle overflow オプション:
binlog_ignore_db=db_nameこのオプションを使用して、特定のデータベースをレプリケーションから除外します。
mysqldサービスを再起動します。systemctl restart mysqld.service
# systemctl restart mysqld.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
2.8.3. MySQL ソースサーバーでのレプリケーションユーザーの作成 リンクのコピーリンクがクリップボードにコピーされました!
レプリカサーバーが接続してデータの変更を受信できるように、MySQL ソースサーバー上で適切な権限を持つレプリケーションユーザーを作成する必要があります。
前提条件
- ソースサーバーは、MySQL ソースサーバーの設定 で説明されているように、インストールおよび設定されている。
手順
レプリケーションユーザーを作成します。
mysql> CREATE USER 'replication_user'@'replica_server_hostname' IDENTIFIED WITH mysql_native_password BY 'password';
mysql> CREATE USER 'replication_user'@'replica_server_hostname' IDENTIFIED WITH mysql_native_password BY 'password';Copy to Clipboard Copied! Toggle word wrap Toggle overflow ユーザーにレプリケーションパーミッションを付与します。
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'replica_server_hostname';*
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'replica_server_hostname';*Copy to Clipboard Copied! Toggle word wrap Toggle overflow MySQL データベースの付与テーブルをリロードします。
mysql> FLUSH PRIVILEGES;
mysql> FLUSH PRIVILEGES;Copy to Clipboard Copied! Toggle word wrap Toggle overflow ソースサーバーを読み取り専用状態に設定します。
mysql> SET @@GLOBAL.read_only = ON;
mysql> SET @@GLOBAL.read_only = ON;Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.8.4. MySQL レプリカサーバーをソースサーバーに接続する リンクのコピーリンクがクリップボードにコピーされました!
MySQL レプリカとソースサーバー間の接続を確立するために、ソースサーバーの認証情報を使用してレプリカサーバーを設定し、レプリケーションを開始する必要があります。
前提条件
- ソースサーバーは、MySQL ソースサーバーの設定 で説明されているように、インストールおよび設定されている。
- レプリカサーバーは、MySQL レプリカサーバーの設定 で説明されているように、インストールおよび設定されている。
- レプリケーションユーザーを作成した。MySQL ソースサーバーでのレプリケーションユーザーの作成 を参照してください。
手順
レプリカサーバーを読み取り専用状態に設定します。
mysql> SET @@GLOBAL.read_only = ON;
mysql> SET @@GLOBAL.read_only = ON;Copy to Clipboard Copied! Toggle word wrap Toggle overflow レプリケーションソースを設定します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow MySQL レプリカサーバーでレプリカスレッドを開始します。
mysql> START REPLICA;
mysql> START REPLICA;Copy to Clipboard Copied! Toggle word wrap Toggle overflow ソースサーバーとレプリカサーバーの両方で、読み取り専用状態の設定を解除します。
mysql> SET @@GLOBAL.read_only = OFF;
mysql> SET @@GLOBAL.read_only = OFF;Copy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: デバッグの目的で、レプリカサーバーのステータスを検査します。
mysql> SHOW REPLICA STATUS\G;
mysql> SHOW REPLICA STATUS\G;Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記レプリカサーバーの起動または接続に失敗した場合は、
SHOW MASTER STATUSコマンドの出力に表示されるバイナリーログファイルの位置に続く特定の数のイベントをスキップできます。たとえば、定義された位置から最初のイベントをスキップします。mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;Copy to Clipboard Copied! Toggle word wrap Toggle overflow その後、レプリカサーバーを再度起動してみます。
オプション: レプリカサーバーでレプリカスレッドを停止します。
mysql> STOP REPLICA;
mysql> STOP REPLICA;Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.8.5. MySQL サーバーでのレプリケーションの検証 リンクのコピーリンクがクリップボードにコピーされました!
テストデータベースを作成し、ソースサーバーとレプリカサーバーのレプリケーションステータスを確認することで、MySQL レプリケーションが正しく動作していることを検証できます。
手順
ソースサーバーにサンプルデータベースを作成します。
mysql> CREATE DATABASE test_db_name;
mysql> CREATE DATABASE test_db_name;Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
test_db_nameデータベースが、レプリカサーバーで複製されていることを確認します。 ソースサーバーまたはレプリカサーバーのいずれかで以下のコマンドを実行して、MySQL サーバーのバイナリーログファイルに関するステータス情報を表示します。
mysql> SHOW MASTER STATUS;
mysql> SHOW MASTER STATUS;Copy to Clipboard Copied! Toggle word wrap Toggle overflow ソースで実行されたトランザクションの GTID のセットを示す
Executed_Gtid_Set列は、空であってはなりません。注記レプリカサーバーで
SHOW REPLICA STATUSを使用すると、同じ GTID のセットがExecuted_Gtid_Set行に表示されます。
2.9. MySQL インスタンスを以前の RHEL バージョンから RHEL 10 上の MySQL 8.4 に移行する リンクのコピーリンクがクリップボードにコピーされました!
RHEL 10 では MySQL 8.4 が提供されます。以前の RHEL バージョンで MySQL インスタンスを実行している場合は、新しいホストに RHEL 10 をセットアップし、インスタンスを移行できます。
前提条件
- 新しいホストに RHEL 10 をセットアップした。
- RHEL 8 または RHEL 9 ホスト上の MySQL インスタンスのファイルシステムバックアップを実行した。
手順
mysql8.4-serverパッケージをインストールします。dnf install mysql8.4-server
# dnf install mysql8.4-serverCopy to Clipboard Copied! Toggle word wrap Toggle overflow サービスがすでに実行されている場合は停止します。
systemctl stop mysqld.service
# systemctl stop mysqld.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
以前のホストの
/var/lib/mysql/ディレクトリーの内容を、RHEL 10 ホストの同じ場所にコピーします。 -
以前のホストから
/etc/my.cnf.d/ディレクトリーに設定ファイルをコピーし、ファイルに MySQL 8.4 に有効なオプションのみが含まれていることを確認します。詳細は、アップストリームのドキュメント を参照してください。 SELinux コンテキストを復元します。
restorecon -rv /var/lib/mysql/ restorecon -rv /etc/my.cnf.d/
# restorecon -rv /var/lib/mysql/ # restorecon -rv /etc/my.cnf.d/Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/lib/mysql/とそのサブディレクトリーの正しい所有権を確認します。chown -R mysql:mysql /var/lib/mysql/
# chown -R mysql:mysql /var/lib/mysql/Copy to Clipboard Copied! Toggle word wrap Toggle overflow mysqldサービスを有効にして起動します。systemctl enable --now mysqld.service
# systemctl enable --now mysqld.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow サービスが開始されると、MySQL は内部テーブルを自動的にチェック、修復、更新します。
検証
MySQL サーバーへの接続を確立します。
mysql -u root -p -h <hostname>
# mysql -u root -p -h <hostname>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第3章 PostgreSQL の使用 リンクのコピーリンクがクリップボードにコピーされました!
PostgreSQL サーバーは、SQL 言語に基づいた、堅牢で拡張性の高いオープンソースのデータベースサーバーです。PostgreSQL サーバーは、大規模なデータセットと多数の同時ユーザーを管理できるオブジェクトリレーショナルデータベースシステムを提供します。
PostgreSQL サーバーには、データの整合性の確保、耐障害性のある環境やアプリケーションの構築を行うための機能が含まれます。PostgreSQL サーバーを使用すると、データベースを再コンパイルすることなく、独自のデータ型、カスタム関数、またはさまざまなプログラミング言語のコードでデータベースを拡張できます。
RHEL システムに PostgreSQL をインストールして設定する方法、PostgreSQL データをバックアップする方法、および PostgreSQL の以前のバージョンから移行する方法を説明します。
3.1. PostgreSQL のインストール リンクのコピーリンクがクリップボードにコピーされました!
RHEL 10 では、Application Stream の初期バージョンとして PostgreSQL 16 が提供されます。これは、RPM パッケージとしてインストールできます。追加の PostgreSQL バージョンは、RHEL 10 のマイナーリリースで、ライフサイクルが短い代替バージョンとして提供されます。
設計上、同じモジュールの 1 つのバージョン (ストリーム) のみをインストールでき、RPM パッケージが競合するため、同じホストに複数の PostgreSQL インスタンスをインストールすることはできません。代わりに、コンテナー内でデータベースサーバーサービスを実行することもできます。コンテナーを使用して単一ホスト上で複数の PostgreSQL インスタンスを実行する を参照してください。
手順
PostgreSQL サーバーパッケージをインストールします。
dnf install postgresql-server
# dnf install postgresql-serverCopy to Clipboard Copied! Toggle word wrap Toggle overflow postgresのスーパーユーザーが自動的に作成されます。データベースクラスターを初期化します。
postgresql-setup --initdb
# postgresql-setup --initdbCopy to Clipboard Copied! Toggle word wrap Toggle overflow データをデフォルトの
/var/lib/pgsql/dataディレクトリーに保存します。postgresqlサービスを有効にして起動します。systemctl enable --now postgresql.service
# systemctl enable --now postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.2. コンテナーを使用して単一ホスト上で複数の PostgreSQL インスタンスを実行する リンクのコピーリンクがクリップボードにコピーされました!
パッケージから PostgreSQL をインストールする場合、同じホスト上で実行できるのは 1 つのバージョンのみです。複数のインスタンスを実行するか、異なるバージョンの PostgreSQL を実行するには、サービスをコンテナー内で実行します。
前提条件
-
podmanパッケージがインストールされている。
手順
Red Hat カスタマーポータルアカウントを使用して、
registry.redhat.ioレジストリーに対して認証します。podman login registry.redhat.io
# podman login registry.redhat.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow すでにコンテナーレジストリーにログインしている場合は、このステップをスキップしてください。
使用するコンテナーを起動します。各コンテナーについて、以下を入力します。
podman run -d --name <container_name> -e POSTGRESQL_USER=<user_name> -e POSTGRESQL_PASSWORD=<password> -p <host_port_1>:5432 rhel10/postgresql-16
$ podman run -d --name <container_name> -e POSTGRESQL_USER=<user_name> -e POSTGRESQL_PASSWORD=<password> -p <host_port_1>:5432 rhel10/postgresql-16Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコンテナーイメージを使用する方法の詳細は、Red Hat Ecosystem Catalog を参照してください。
重要2 つのデータベースサーバーのコンテナー名とホストポートが異なっている必要があります。
クライアントがネットワーク上のデータベースサーバーにアクセスできるように、ファイアウォールでホストポートを開きます。
firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,...} firewall-cmd --reload# firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,...} # firewall-cmd --reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
データベースサーバーに接続し、root としてログインします。
psql -u postgres -p -h localhost -P <host_port> --protocol tcp
# psql -u postgres -p -h localhost -P <host_port> --protocol tcpCopy to Clipboard Copied! Toggle word wrap Toggle overflow 実行中のコンテナーに関する情報を表示します。
podman ps
$ podman psCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.3. PostgreSQL ユーザーの作成 リンクのコピーリンクがクリップボードにコピーされました!
特定の権限を持つ PostgreSQL ユーザーを作成して、データベースへのアクセスを管理し、ユーザーの特権を制御することで、セキュアなデータベース管理を実現できます。
PostgreSQL ユーザーは以下のタイプのものです。
-
postgresLinux システムユーザー: PostgreSQL サーバーおよびクライアントアプリケーション (pg_dumpなど) を実行するためにのみ使用します。データベース作成およびユーザー管理などの、PostgreSQL 管理上の対話的な作業にはpostgresシステムユーザーを使用しないでください。 -
データベースのスーパーユーザー: デフォルトの
postgresPostgreSQL スーパーユーザーは、postgresシステムユーザーとは関係ありません。/var/lib/pgsql/data/pg_hba.confファイルでpostgresスーパーユーザーのアクセスを制限できます。それ以外の場合、他のパーミッションの制限はありません。他のデータベースのスーパーユーザーを作成することもできます。 特定のデータベースアクセスパーミッションを持つロール:
- データベースユーザー: デフォルトでログインするパーミッションがあります。
- ユーザーのグループ: グループ全体のパーミッションを管理できるようにします。
ロールはデータベースオブジェクト (テーブルや関数など) を所有でき、SQL コマンドを使用して他のロールにオブジェクト特権を割り当てることができます。
標準のデータベース管理権限には SELECT、INSERT、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 - postgres
# su - postgresCopy to Clipboard Copied! Toggle word wrap Toggle overflow PostgreSQL インタラクティブターミナルを起動します。
psql psql (16.4) Type "help" for help. postgres=#
$ psql psql (16.4) Type "help" for help. postgres=#Copy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: 現在のデータベース接続に関する情報を取得します。
postgres=# \conninfo You are connected to database "postgres" as user "postgres" via socket in "/var/run/postgresql" at port "5432".
postgres=# \conninfo You are connected to database "postgres" as user "postgres" via socket in "/var/run/postgresql" at port "5432".Copy to Clipboard Copied! Toggle word wrap Toggle overflow mydbuserという名前のユーザーを作成し、パスワードを設定して、そのユーザーにCREATEROLEおよびCREATEDBパーミッションを割り当てます。postgres=# CREATE USER mydbuser WITH PASSWORD '<password>' CREATEROLE CREATEDB; CREATE ROLE
postgres=# CREATE USER mydbuser WITH PASSWORD '<password>' CREATEROLE CREATEDB; CREATE ROLECopy to Clipboard Copied! Toggle word wrap Toggle overflow これで、
mydbuserユーザーは、日常的なデータベース管理操作 (データベースの作成とユーザーインデックスの管理) を実行できるようになりました。\qメタコマンドを使用して、インタラクティブターミナルからログアウトします。postgres=# \q
postgres=# \qCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
mydbuserとして PostgreSQL ターミナルにログインし、ホスト名を指定して、初期化中に作成されたデフォルトのpostgresデータベースに接続します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow データベースを作成します。
postgres=> CREATE DATABASE <db_name>;
postgres=> CREATE DATABASE <db_name>;Copy to Clipboard Copied! Toggle word wrap Toggle overflow セッションからログアウトします。
postgres=# \q
postgres=# \qCopy to Clipboard Copied! Toggle word wrap Toggle overflow mydbuserとして新しいデータベースに接続します。psql -U mydbuser -h 127.0.0.1 -d <db_name> Password for user mydbuser: psql (16.4) Type "help" for help. mydatabase=>
# psql -U mydbuser -h 127.0.0.1 -d <db_name> Password for user mydbuser: psql (16.4) Type "help" for help. mydatabase=>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.4. PostgreSQL の設定 リンクのコピーリンクがクリップボードにコピーされました!
データベースクラスターディレクトリー内の設定ファイルを編集して、データベースのパラメーター、認証、およびクライアントアクセスを設定することで、PostgreSQL を設定できます。デフォルトでは、PostgreSQL は /var/lib/pgsql/data/ ディレクトリーを使用します。
-
/var/lib/pgsql/data/postgresql.conf: データベースクラスターのパラメーターを設定するために使用されます。 -
/var/lib/pgsql/data/postgresql.auto.conf:postgresql.confと同様に、基本的な PostgreSQL 設定を格納しています。ただし、このファイルはサーバーの管理下にあります。これは、ALTER SYSTEMクエリーにより編集され、手動で編集することはできません。 -
/var/lib/pgsql/data/pg_ident.conf: ユーザーアイデンティティーを外部認証メカニズムから PostgreSQL ユーザーアイデンティティーにマッピングするために使用されます。 -
/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
log_connections = yes log_destination = 'syslog' search_path = '"$user", public' shared_buffers = 128MB password_encryption = scram-sha-256Copy to Clipboard Copied! Toggle word wrap Toggle overflow /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
# 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-256Copy to Clipboard Copied! Toggle word wrap Toggle overflow postgresqlサービスを再起動して、変更を有効にします。systemctl restart postgresql.service
# systemctl restart postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.5. PostgreSQL サーバーにおける TLS 暗号化の設定 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、PostgreSQL は暗号化されていない接続を使用します。よりセキュアな接続のために、PostgreSQL サーバーで Transport Layer Security (TLS) サポートを有効にし、暗号化された接続を確立するようにクライアントを設定できます。
前提条件
- TLS 秘密鍵を作成済みであり、かつ認証局 (CA) によって PostgreSQL サーバー用のサーバー証明書が発行されている。
- PostgreSQL サーバーがインストールされている。
- データベースクラスターが初期化されている。
- FIPS モードが有効になっている場合、クライアントは Extended Master Secret (EMS) 拡張機能をサポートするか、TLS 1.3 を使用する必要があります。EMS を使用しない TLS 1.2 接続は失敗します。詳細は、Red Hat ナレッジベースソリューション TLS extension "Extended Master Secret" enforced on RHEL 9.2 and later を参照してください。
手順
秘密鍵とサーバー証明書を
/var/lib/pgsql/data/ディレクトリーに保存します。cp server.{key,crt} /var/lib/pgsql/data/# cp server.{key,crt} /var/lib/pgsql/data/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 秘密鍵と証明書の所有権を設定します。
chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}# chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}Copy to Clipboard Copied! Toggle word wrap Toggle overflow PostgreSQL サーバーのみがファイルを読み取れるように、サーバー証明書のパーミッションを設定します。
chmod 0400 /var/lib/pgsql/data/server.key
# chmod 0400 /var/lib/pgsql/data/server.keyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 証明書は、セキュアな接続が確立される前は通信の一部であるため、任意のクライアントは認証なしで証明書を取得できます。したがって、サーバー証明書ファイルに厳密なパーミッションを設定する必要はありません。
/var/lib/pgsql/data/postgresql.confファイルを編集し、次の変更を加えます。scram-sha-256ハッシュアルゴリズムを設定します。password_encryption = scram-sha-256
password_encryption = scram-sha-256Copy to Clipboard Copied! Toggle word wrap Toggle overflow TLS 暗号化を有効にします。
ssl = on
ssl = onCopy to Clipboard Copied! Toggle word wrap Toggle overflow
/var/lib/pgsql/data/pg_hba.confファイルを編集し、TLS 暗号化とscram-sha-256ハッシュアルゴリズムを使用するように認証エントリーを更新します。たとえば、TLS 暗号化を有効にするには、hostエントリーをhostsslに変更し、最後の列にscram-sha-256ハッシュアルゴリズムを設定します。hostssl all all 192.0.2.0/24 scram-sha-256
hostssl all all 192.0.2.0/24 scram-sha-256Copy to Clipboard Copied! Toggle word wrap Toggle overflow postgresqlサービスを再起動します。systemctl restart postgresql.service
# systemctl restart postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
postgresスーパーユーザーを使用して PostgreSQL サーバーに接続し、\conninfoメタコマンドを実行します。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)
# 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)Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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 <db_name> > <dump_file>Copy to Clipboard Copied! Toggle word wrap Toggle overflow pg_dumpが接続するデータベースサーバーを指定するには、以下のコマンドラインオプションを使用します。ホストを定義する
-hオプションデフォルトのホストは、ローカルホストか、
PGHOST環境変数で指定されているものです。ポートを定義する
-pオプションデフォルトのポートは、
PGPORT環境変数またはコンパイル済みデフォルトで示されます。
3.6.3. pg_dump を使用した単一の PostgreSQL データベースの復元 リンクのコピーリンクがクリップボードにコピーされました!
pg_restore ユーティリティーを使用してデータベース構造とデータを再作成することにより、SQL ダンプファイルから PostgreSQL データベースを復元できます。
前提条件
-
postgresスーパーユーザーまたはデータベース管理者特権を持つユーザーとしてログインしている。
手順
新しいデータベースを作成します。
createdb <db_name>
$ createdb <db_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - ダンプされたデータベース内のオブジェクトを所有しているすべてのユーザー、またはそのオブジェクトに対する権限を付与されているすべてのユーザーがすでに存在することを検証します。このようなユーザーが存在しない場合、復元を実行しても、元の所有権と権限でオブジェクトが再作成されません。
psqlユーティリティーを実行して、pg_dumpユーティリティーが作成したテキストファイルのダンプを復元します。psql <db_name> < <dump_file>
$ psql <db_name> < <dump_file>Copy to Clipboard Copied! Toggle word wrap Toggle overflow ここでの
<dump_file>は、pg_dumpコマンドの出力になります。非テキストファイルのダンプを復元するには、代わりにpg_restoreユーティリティーを使用します。pg_restore <non-plain_text_file>
$ pg_restore <non-plain_text_file>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.6.4. pg_dumpall を使用した PostgreSQL サーバー上の全データベースのバックアップ リンクのコピーリンクがクリップボードにコピーされました!
pg_dumpall ユーティリティーを使用して、すべてのデータベースとクラスター全体のデータを 1 つのファイルにエクスポートすることにより、PostgreSQL サーバー上の全データベースのバックアップを作成できます。
前提条件
-
postgresスーパーユーザーまたはデータベース管理者特権を持つユーザーとしてログインしている。
手順
データベースクラスターのすべてのデータベースをダンプし、クラスター全体のデータを保存します。
pg_dumpall > <dump_file>
$ pg_dumpall > <dump_file>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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>
$ psql < <dump_file>Copy to Clipboard Copied! Toggle word wrap Toggle overflow ここでの
<dump_file>は、pg_dumpallコマンドの出力になります。
3.6.6. 復元中の SQL エラーの処理 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、SQL エラーが発生した場合でも psql ユーティリティーは実行を継続します。これは、データベースが部分的にしか復元されない原因となります。データの整合性を確保するために、エラー時に停止するように psql を設定できます。
前提条件
-
postgresスーパーユーザーまたはデータベース管理者特権を持つユーザーとしてログインしている。
手順
ON_ERROR_STOP変数を設定して SQL エラーが発生した場合は、終了ステータス 3 でpsqlを終了します。psql --set ON_ERROR_STOP=on <db_name> < <dump_file>
$ psql --set ON_ERROR_STOP=on <db_name> < <dump_file>Copy to Clipboard Copied! Toggle word wrap Toggle overflow ダンプ全体が単一のトランザクションとして復元されるように指定して、復元が完全に完了するかキャンセルされるようにします。
psqlユーティリティーを使用してテキストファイルのダンプを復元する場合:psql -1
$ psql -1Copy to Clipboard Copied! Toggle word wrap Toggle overflow pg_restoreユーティリティーを使用してテキストファイル以外のダンプを復元する場合:pg_restore -e
$ pg_restore -eCopy to Clipboard Copied! Toggle word wrap Toggle overflow
この方法を使用する場合、小さなエラーでも、すでに何時間も実行されている復元操作がキャンセルされる可能性があることに注意してください。
3.7. 物理コピーを使用した PostgreSQL データのバックアップと復元 リンクのコピーリンクがクリップボードにコピーされました!
PostgreSQL データの物理バックアップには、コンテンツを格納しているファイルとディレクトリーが含まれます。通常、この方法はより高速で、サイズが小さくなります。
3.7.1. PostgreSQL サーバーでのファイルシステムバックアップの実行 リンクのコピーリンクがクリップボードにコピーされました!
ファイルシステムレベルのバックアップは、PostgreSQL インスタンス全体をバックアップする高速な方法です。この方法では、データの整合性を保つために postgresql サービスをシャットダウンする必要があります。
PostgreSQL のファイルシステムレベルのバックアップは、アーキテクチャーと RHEL メジャーバージョンに固有のものです。この方法でバックアップしたデータは、異なるアーキテクチャーまたは RHEL メジャーバージョンで復元することはできません。
手順
postgresqlサービスを停止します。systemctl stop postgresql.service
# systemctl stop postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow バックアップディレクトリーを作成します。次に例を示します。
mkdir -p /root/postgresql-backup/
# mkdir -p /root/postgresql-backup/Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/lib/pgsql/ディレクトリーをバックアップします。cp -rp /var/lib/pgsql/ /root/postgresql-backup/
# cp -rp /var/lib/pgsql/ /root/postgresql-backup/Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/lib/pgsql/には、設定ファイル、データファイル、ログなど、PostgreSQL データベースサーバーの重要なファイルがすべて含まれています。postgresqlサービスを開始します。systemctl start postgresql.service
# systemctl start postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.7.2. PostgreSQL サーバーでのファイルシステムバックアップの復元 リンクのコピーリンクがクリップボードにコピーされました!
PostgreSQL インスタンスが破損した場合は、以前にデータディレクトリーを含むファイルシステムバックアップを実行済みであれば、このバックアップからインスタンスを復元できます。
前提条件
- PostgreSQL サーバーでファイルシステムバックアップを実行した。
ターゲットサーバーが、以下に示すバックアップソースの条件を満たしている必要があります。
- PostgreSQL のバージョンが同じである必要があります。
- システムアーキテクチャーが同じである必要があります。
手順
postgresqlサービスを停止します。systemctl stop postgresql.service
# systemctl stop postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 現在の
/var/lib/pgsql/ディレクトリーを削除します。rm -rf /var/lib/pgsql/
# rm -rf /var/lib/pgsql/Copy to Clipboard Copied! Toggle word wrap Toggle overflow バックアップからデータディレクトリーを復元します。
cp -rp /root/postgresql-backup/pgsql/ /var/lib/
# cp -rp /root/postgresql-backup/pgsql/ /var/lib/Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/lib/pgsql/ディレクトリーの所有権を正しく設定します。chown -R postgres:postgres /var/lib/pgsql/
# chown -R postgres:postgres /var/lib/pgsql/Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/lib/pgsql/ディレクトリーの SELinux コンテキストを復元します。restorecon -Rv /var/lib/pgsql/
# restorecon -Rv /var/lib/pgsql/Copy to Clipboard Copied! Toggle word wrap Toggle overflow postgresqlサービスを開始します。systemctl start postgresql.service
# systemctl start postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
-
postgresユーザーとしてログインします。 データベースに接続します。
psql <database>
$ psql <database>Copy to Clipboard Copied! Toggle word wrap Toggle overflow データベース内のデータにアクセスします。
<database>=# SELECT * FROM <table>;
<database>=# SELECT * FROM <table>;Copy to Clipboard Copied! Toggle word wrap Toggle overflow PostgreSQL サービスから切断します。
<database>=# \q
<database>=# \qCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.8. 継続的アーカイブを使用した PostgreSQL データのバックアップと復元 リンクのコピーリンクがクリップボードにコピーされました!
継続的アーカイブを使用すると、WAL ファイルとベースバックアップを組み合わせることで、ポイントインタイムリカバリーと高可用性に対応した堅牢な PostgreSQL バックアップを作成できます。
PostgreSQL は、データベースのデータファイルに対するすべての変更を、クラスターのデータディレクトリーの pg_wal/ サブディレクトリーにあるログ先行書き込み (WAL) ファイルに記録します。このログは、主にクラッシュからの復元を目的としています。クラッシュが発生した後、最後のチェックポイント以降に作成されたログエントリーを使用して、データベースを整合性の取れた状態に復元できます。
継続的アーカイブ方式は、オンラインバックアップとも呼ばれ、WAL ファイルと、データベースクラスターのコピー (稼働中のサーバーで実行されたベースバックアップ、またはファイルシステムレベルのバックアップ) を組み合わせたものです。
データベースの復元が必要な場合は、データベースクラスターのコピーからデータベースを復元してから、バックアップした WAL ファイルからログをリプレイすることで、システムを現在の状態に戻すことができます。
継続的アーカイブ方式では、少なくとも最後のベースバックアップの開始時刻まで遡る、途切れのない一連の WAL ファイルをすべて保持する必要があります。そのため、ベースバックアップの理想的な頻度は、次の要素に左右されます。
- アーカイブされた WAL ファイルで利用可能なストレージボリューム。
- 復元が必要な場合の、データ復元の最大許容期間。最後のバックアップからの期間が長い場合、システムはより多くの WAL セグメントを再生するため、回復に時間がかかります。
pg_dump および pg_dumpall SQL ダンプは、継続的にアーカイブするバックアップソリューションの一部として使用することができません。SQL ダンプは論理バックアップを生成しますが、WAL 再生で使用する上で十分な情報は含まれていません。
3.8.1. 継続的アーカイブの利点と欠点 リンクのコピーリンクがクリップボードにコピーされました!
継続的アーカイブは、データベースのトランザクションログファイルを継続的に保存することで、データのバックアップ、高可用性、およびポイントインタイムリカバリー (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パラメーターをonに設定します。 archive_command設定パラメーターでシェルコマンドを指定します。cpコマンド、別のコマンド、またはシェルスクリプトを使用できます。以下に例を示します。
archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'Copy to Clipboard Copied! Toggle word wrap Toggle overflow %pパラメーターは、アーカイブするファイルの相対パスに置き換えられ、%fパラメーターはファイル名に置き換えられます。このコマンドは、アーカイブ可能な WAL セグメントを
/mnt/server/archivedir/ディレクトリーにコピーします。%pパラメーターおよび%fパラメーターを置き換えると、実行されたコマンドは以下のようになります。test ! -f /mnt/server/archivedir/00000001000000A900000065 && cp pg_wal/00000001000000A900000065 /mnt/server/archivedir/00000001000000A900000065
test ! -f /mnt/server/archivedir/00000001000000A900000065 && cp pg_wal/00000001000000A900000065 /mnt/server/archivedir/00000001000000A900000065Copy to Clipboard Copied! Toggle word wrap Toggle overflow アーカイブされる新規ファイルごとに同様のコマンドが生成されます。
注記archive コマンドは、完了した WAL セグメントでのみ実行されます。WAL トラフィックをほとんど生成しないサーバーでは、トランザクションの完了とアーカイブストレージへの安全な記録の間にかなりの遅延が生じる可能性があります。アーカイブされていないデータの古さを制限するには、以下を行います。
-
archive_timeoutパラメーターを設定して、サーバーが特定の頻度で新しい WAL セグメントファイルに切り替えるように強制します。 -
pg_switch_walパラメーターを使用して、セグメント切り替えを強制し、トランザクションが終了後すぐにアーカイブされるようにします。
-
-
postgresqlサービスを再起動して、変更を適用します。systemctl restart postgresql.service
# systemctl restart postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow - アーカイブコマンドをテストし、既存のファイルが上書きされないこと、失敗した場合にゼロ以外の終了ステータスが返されることを確認します。
- データを保護するには、セグメントファイルがグループまたはワールド読み取りアクセスを持たないディレクトリーにアーカイブされていることを確認してください。
3.8.3. ベースバックアップの作成 リンクのコピーリンクがクリップボードにコピーされました!
pg_basebackup ユーティリティーを使用すると、バックアップと復元のために、データベースの整合性の取れたスナップショットを取得し、PostgreSQL ベースバックアップを作成できます。
ベースバックアッププロセスは、WAL アーカイブ領域に保存され、ベースバックアップに必要な最初の WAL セグメントファイルにちなんで名付けられたバックアップ履歴ファイルを作成します。
バックアップ履歴ファイルは、開始時間および終了時間、およびバックアップの WAL セグメントが含まれる小さなテキストファイルです。ラベル文字列を使用して関連するダンプファイルを特定した場合は、バックアップ履歴ファイルを使用して復元するダンプファイルを判断できます。
データを確実に復元できるようにするために、複数のバックアップセットを維持することを検討してください。
前提条件
-
postgresスーパーユーザー、データベース管理者特権を持つユーザー、または少なくともREPLICATION権限を持つその他のユーザーとしてログインしている。 - ベースバックアップ中およびベースバックアップ後に生成されたすべての WAL セグメントファイルを保持する必要があります。
手順
pg_basebackupユーティリティーを使用してベースバックアップを実行します。個々のファイル (プレーン形式) としてベースバックアップを作成するには、以下を実行します。
pg_basebackup -D <backup_directory> -Fp
$ pg_basebackup -D <backup_directory> -FpCopy to Clipboard Copied! Toggle word wrap Toggle overflow backup_directory は、任意のバックアップの場所に置き換えます。
テーブルスペースを使用し、サーバーと同じホストでベースバックアップを実行する場合は、
--tablespace-mappingオプションも使用する必要があります。そうしないと、バックアップを同じ場所に書き込もうとすると、バックアップが失敗します。tarアーカイブ (tarおよび圧縮形式) としてベースバックアップを作成するには、以下を実行します。pg_basebackup -D <backup_directory> -Ft -z
$ pg_basebackup -D <backup_directory> -Ft -zCopy to Clipboard Copied! Toggle word wrap Toggle overflow backup_directory は、任意のバックアップの場所に置き換えます。
このようなデータを復元するには、ファイルを正しい場所に手動で抽出する必要があります。
pg_basebackup が接続するデータベースサーバーを指定するには、以下のコマンドラインオプションを使用します。
ホストを定義する
-hオプションデフォルトのホストは、ローカルホストまたは
PGHOST環境変数により指定されたホストです。ポートを定義する
-pオプションデフォルトのポートは、
PGPORT環境変数またはコンパイル済みデフォルトで示されます。
- ベースバックアッププロセスが完了すると、バックアップ履歴ファイルで指定されている、データベースクラスターのコピーとバックアップ中に使用された WAL セグメントファイルを安全にアーカイブします。
- ベースバックアップで使用されている WAL セグメントファイルよりも数値が小さい WAL セグメントを削除します。これらはベースバックアップよりも古く、復元には必要ないためです。
3.8.4. 継続的なアーカイブバックアップを使用したデータベースの復元 リンクのコピーリンクがクリップボードにコピーされました!
ベースバックアップを復元し、アーカイブされた WAL ファイルを適用してポイントインタイムリカバリーを行うことで、PostgreSQL データベースを復元できます。
手順
サーバーを停止します。
systemctl stop postgresql.service
# systemctl stop postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 必要なデータを一時的な場所にコピーします。
必要に応じて、クラスターデータのディレクトリー全体と、すべてのテーブルスペースをコピーします。既存データベースのコピーを 2 つ保持するには、システムに十分な空き領域が必要になることに注意してください。
十分なスペースがない場合は、システムがダウンする前にアーカイブされなかったログが含まれている可能性がある、クラスターの
pg_walディレクトリーの内容を保存します。- クラスターデータディレクトリー、および使用しているテーブルスペースのルートディレクトリー下の既存ファイルおよびサブディレクトリーをすべて削除します。
ベースバックアップからデータベースファイルを復元します。
以下の点を確認してください。
-
ファイルは、正しい所有権 (
rootではなくデータベースシステムのユーザー) で復元されます。 - ファイルは、正しいパーミッションで復元されます。
-
pg_tblspc/サブディレクトリーのシンボリックリンクが正しく復元されます。
-
ファイルは、正しい所有権 (
pg_wal/サブディレクトリーにあるファイルをすべて削除します。このファイルは、ベースバックアップから作成されるため、非推奨になりました。
pg_wal/をアーカイブしていない場合は、適切な権限で再作成します。-
ステップ 2 で保存したアーカイブされていない WAL セグメントファイルを
pg_wal/にコピーします。 クラスターデータディレクトリーの
recovery.confリカバリーコマンドファイルを作成し、restore_command設定パラメーターでシェルコマンドを指定します。cpコマンド、別のコマンド、またはシェルスクリプトを使用できます。以下に例を示します。restore_command = 'cp /mnt/server/archivedir/%f "%p"'
restore_command = 'cp /mnt/server/archivedir/%f "%p"'Copy to Clipboard Copied! Toggle word wrap Toggle overflow サーバーを起動します。
systemctl start postgresql.service
# systemctl start postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow サーバーは復元モードに入り、必要なアーカイブ済み WAL ファイルの読み込みを開始します。
外部エラーにより復元が終了した場合は、サーバーを再起動するとリカバリーが続行されます。復元プロセスが完了すると、サーバーは
recovery.confの名前をrecovery.doneに変更します。これにより、サーバーが通常のデータベース操作を開始した後に誤って復元モードに戻ることが防止されます。データベースのコンテンツを確認して、データベースが必要な状態に復元されたことを検証します。
データベースが必要な状態に復元されていない場合は、手順 1 に戻ります。データベースが必要な状態に復元された場合は、
pg_hba.confファイル内のクライアント認証設定を復元して、ユーザーが接続できるようにします。
3.9. PostgreSQL データベースをあるサーバーから別のサーバーに直接転送する リンクのコピーリンクがクリップボードにコピーされました!
pg_dump および psql ユーティリティーを使用して PostgreSQL データベースをバックアップし、別の PostgreSQL サーバー上で直接復元できます。この方法を使用すると、中間ファイルなしで 1 つのステップでデータベースを転送できます。
前提条件
-
postgresユーザーとしてログインしている。
手順
ソースサーバーからターゲットサーバーにデータベースを転送します。
pg_dump -h <source_server> <db_name> | psql -h <destination_server> <db_name>
$ pg_dump -h <source_server> <db_name> | psql -h <destination_server> <db_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.10. PostgreSQL インスタンスを以前の RHEL バージョンから RHEL 10 上の PostgreSQL に移行する リンクのコピーリンクがクリップボードにコピーされました!
すでに RHEL 9 上で PostgreSQL を運用しており、RHEL 10 を実行するホストにデータベースソフトウェアを移動する場合は、データベースを移行できます。
次の移行方法を使用できます。
- バックアップと復元によるアップグレード: この方法は時間がかかる場合もありますが、ほとんどのシナリオで機能します。
-
pg_upgradeユーティリティーを使用した高速アップグレード - この方法はより高速ですが、PostgreSQL 13 から 16 への移行で、ハードウェアアーキテクチャーが同じままである場合にのみ機能します。
PostgreSQL の移行前に、必ずソースホスト上の /var/lib/pgsql/data/ ディレクトリーをバックアップしてください。
3.10.1. バックアップとリストア方式を使用して RHEL 10 上の PostgreSQL に移行する リンクのコピーリンクがクリップボードにコピーされました!
バックアップと復元の方法を使用して、PostgreSQL の RHEL 8 または RHEL 9 バージョンから、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 "pg_dumpall > /var/lib/pgsql/pgdump_file.sql"Copy to Clipboard Copied! Toggle word wrap Toggle overflow エクスポートされたファイルを確認します。
su - postgres -c 'less "/var/lib/pgsql/pgdump_file.sql"'
# su - postgres -c 'less "/var/lib/pgsql/pgdump_file.sql"'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 前の手順で作成したデータベースダンプと 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/# 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/Copy to Clipboard Copied! Toggle word wrap Toggle overflow
RHEL 10 ホストの場合:
postgresql-serverパッケージをインストールします。dnf install postgresql-server
# dnf install postgresql-serverCopy to Clipboard Copied! Toggle word wrap Toggle overflow /var/lib/pgsql/data/ディレクトリーを初期化します。postgresql-setup --initdb
# postgresql-setup --initdbCopy to Clipboard Copied! Toggle word wrap Toggle overflow コピーした設定ファイルを
/var/lib/pgsql/data/ディレクトリーに移動します。mv /tmp/pg_hba.conf \ /tmp/pg_ident.conf \ /tmp/postgresql.conf \ /var/lib/pgsql/data/# mv /tmp/pg_hba.conf \ /tmp/pg_ident.conf \ /tmp/postgresql.conf \ /var/lib/pgsql/data/Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/lib/pgsql/data/ directory内のコンテンツの正しい所有権を確認します。chown -R postgres:postgres /var/lib/pgsql/data/
# chown -R postgres:postgres /var/lib/pgsql/data/Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/lib/pgsql/data/の SELinux コンテキストを復元します。restorecon -Rv /var/lib/pgsql/data/
# restorecon -Rv /var/lib/pgsql/data/Copy to Clipboard Copied! Toggle word wrap Toggle overflow postgresqlサービスを有効にして起動します。systemctl enable --now postgresql.service
# systemctl enable --now postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow postgresユーザーとしてデータをインポートします。su - postgres -c 'psql -f /tmp/pgdump_file.sql postgres'
# su - postgres -c 'psql -f /tmp/pgdump_file.sql postgres'Copy to Clipboard Copied! Toggle word wrap Toggle overflow - データベースを検証し、PostgreSQL サーバーを使用するアプリケーションが期待どおりに動作することを確認します。
3.10.2. pg_update を使用して、PostgreSQL 13 を RHEL の以前のバージョンから RHEL 10 上の PostgreSQL 16 へ移行する リンクのコピーリンクがクリップボードにコピーされました!
PostgreSQL 13 インスタンスを以前の RHEL バージョンから RHEL 10 上の PostgreSQL 16 に移行する場合は、高速アップグレード方式を使用できます。この方法では、/var/lib/pgsql/data/ ディレクトリーの内容を RHEL 10 ホストにコピーし、pg_update ユーティリティーによってデータベースが変換されます。
この方法は、既存の PostgreSQL インスタンスがバージョン 13 で、ソースホストと宛先ホストのハードウェアアーキテクチャーが同じである場合にのみ機能します。それ以外の場合は、バックアップと復元の方法 を使用します。
前提条件
- 既存のデータベースサーバーが PostgreSQL 13 を使用している。
- 現在のサーバーと将来のサーバーのハードウェアアーキテクチャーが同じである。
RHEL 10 ホストには、
/var/lib/pgsql/ディレクトリーを保持するディスク上に十分な空き領域がある。たとえば、移行する PostgreSQL サーバー上のディレクトリーのサイズが 10 GiB の場合、移行中に RHEL 10 ホストに少なくとも 20 GiB の空きディスク領域が必要です。
-
両方のホストのロケール設定は同じです。これを確認するには、両方のホストで
echo $LANGコマンドの出力を比較します。
手順
移行する既存の PostgreSQL インスタンスがあるホストで、次の手順を実行します。
postgresqlサービスを停止します。systemctl stop postgresql.service
# systemctl stop postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow /var/lib/pgsql/ディレクトリーに移動し、dataサブディレクトリーをバックアップします。cd /var/lib/pgsql/ tar -zcf ~/pgdata.bak.tar.gz data/
# cd /var/lib/pgsql/ # tar -zcf ~/pgdata.bak.tar.gz data/Copy to Clipboard Copied! Toggle word wrap Toggle overflow ~/pgdata.bak.tar.gzアーカイブを RHEL 10 ホストにコピーします。以下に例を示します。scp ~/pgdata.bak.tar.gz <user>@<rhel_10_host>:/tmp/
# scp ~/pgdata.bak.tar.gz <user>@<rhel_10_host>:/tmp/Copy to Clipboard Copied! Toggle word wrap Toggle overflow
RHEL 10 ホストの場合:
必要なパッケージをインストールします。
dnf install postgresql-server postgresql-upgrade
# dnf install postgresql-server postgresql-upgradeCopy to Clipboard Copied! Toggle word wrap Toggle overflow postgresql-upgradeパッケージは、移行中に必要な PostgreSQL 13 サーバーを提供します。-
サードパーティーの PostgreSQL サーバーモジュールを使用する場合は、
postgresql-develおよびpostgresql-upgrade-develの両方のパッケージに対してビルドし、インストールします。 postgresqlサービスが停止していることを確認します。systemctl stop postgresql.service
# systemctl stop postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow /var/lib/pgsql/ディレクトリーに移動し、以前のホストからバックアップされたデータディレクトリーを抽出します。cd /var/lib/pgsql/ tar -zxf /tmp/pgdata.bak.tar.gz
# cd /var/lib/pgsql/ # tar -zxf /tmp/pgdata.bak.tar.gzCopy to Clipboard Copied! Toggle word wrap Toggle overflow オプション:
/tmp/pgdata.bak.tar.gzアーカイブを削除します。rm /tmp/pgdata.bak.tar.gz
# rm /tmp/pgdata.bak.tar.gzCopy to Clipboard Copied! Toggle word wrap Toggle overflow アップグレードプロセスを実行します。
postgresql-setup --upgrade
# postgresql-setup --upgradeCopy to Clipboard Copied! Toggle word wrap Toggle overflow postgresql-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
# systemctl enable --now postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow すべてのデータベースをクリーンアップして分析します。
su postgres -c 'vacuumdb --all --analyze-in-stages'
# su postgres -c 'vacuumdb --all --analyze-in-stages'Copy to Clipboard Copied! Toggle word wrap Toggle overflow - データベースを検証し、PostgreSQL サーバーを使用するアプリケーションが期待どおりに動作することを確認します。
オプション: 移行前のデータベースと設定ファイルが含まれている
/var/lib/pgsql/data-old/ディレクトリーを削除します。rm -r /var/lib/pgsql/data-old/
# rm -r /var/lib/pgsql/data-old/Copy to Clipboard Copied! Toggle word wrap Toggle overflow オプション:
postgresql-upgradeパッケージを削除します。dnf remove postgresql-upgrade
# dnf remove postgresql-upgradeCopy to Clipboard Copied! Toggle word wrap Toggle overflow