はじめに
MySQL8.0.17 新機能紹介:Redo ログのアーカイブについて – スマートスタイル技術ブログ
ただし、現時点でこの機能に対応しているのは MySQL Enterprise Backup のみであるため、Percona XtraBackup や MariaDB Enterprise Backup ではまだ使用することができない点には注意してください。
既に弊社ブログでMySQL8.0.17の新機能、REDOログのアーカイブについては紹介したところではありますが、Percona XtraBackupが対応しましたので、そちらの方を紹介する記事になります。また、Percona XtraBackup 8.0.34-29で追加された–-redo-log-arch-dir
オプションについても紹介させていただきます。
以下、Percona XtraBackup公式ドキュメントを参考にしています。
InnoDB redo log archiving – Percona XtraBackup
二種類の方法が提示されていますので、それぞれ検証してみます。
- MySQLでアーカイブディレクトリを設定する場合
- MySQLでアーカイブディレクトリを設定しない場合(8.0.34-29以降)
検証環境
※執筆時点で最新の安定版リリースを使用しています。
1 2 3 4 5 6 7 |
$ cat /etc/oracle-release Oracle Linux Server release 9.3 $ mysql --version mysql Ver 8.0.36 for Linux on x86_64 (MySQL Community Server - GPL) $ xtrabackup --version ... xtrabackup version 8.0.35-30 based on MySQL server 8.0.35 Linux (x86_64) (revision id: 6beb4b49) |
事前準備
Percona XtraBackupのインストール
Perconaの Software Downloadsサイト より、ダウンロード後、インストールします。
1 2 |
$ wget https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.35-30/binary/redhat/9/x86_64/percona-xtrabackup-80-8.0.35-30.1.el9.x86_64.rpm $ dnf install -y percona-xtrabackup-80-8.0.35-30.1.el9.x86_64.rpm |
バックアップ先ディレクトリ作成
バックアップ先ディレクトリを作成します。
1 2 |
$ mkdir -p /data/backups $ chown mysql:mysql /data/backups |
バックアップ用ユーザ作成
バックアップ用ユーザを作成し、必要な権限付与をしていきます。
権限付与は以下公式ドキュメントを参考にしています。
Connection and privileges needed – Percona XtraBackup
※–-redo-log-arch-dir
オプションを使用する場合、かつ innodb_redo_log_archive_dirs
が設定されていない場合にSUPER
権限またはSYSTEM_VARIABLES_ADMIN
権限が必要です。詳細は後述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
mysql> CREATE USER 'xtrabackup'@'localhost' IDENTIFIED BY 'MyNewPass4!'; Query OK, 0 rows affected (0.02 sec) mysql> GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'xtrabackup'@'localhost'; Query OK, 0 rows affected (0.02 sec) mysql> GRANT SELECT ON performance_schema.log_status TO 'xtrabackup'@'localhost'; Query OK, 0 rows affected (0.01 sec) mysql> GRANT SELECT ON performance_schema.keyring_component_status TO 'xtrabackup'@'localhost'; Query OK, 0 rows affected (0.01 sec) mysql> GRANT SELECT ON performance_schema.replication_group_members TO 'xtrabackup'@'localhost'; Query OK, 0 rows affected (0.02 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.01 sec) |
INNODB_REDO_LOG_ARCHIVE
権限を付与します。
1 2 |
mysql> GRANT INNODB_REDO_LOG_ARCHIVE ON *.* TO 'xtrabackup'@'localhost'; Query OK, 0 rows affected (0.01 sec) |
※ちなみに、INNODB_REDO_LOG_ARCHIVE
権限がないとバックアップ実行時に以下のエラーになります。
1 |
2024-04-18T16:54:56.981259+09:00 0 [ERROR] [MY-011825] [Xtrabackup] failed to fetch query result select innodb_redo_log_archive_start('label1', '1713426896978') : Access denied; you need (at least one of) the INNODB_REDO_LOG_ARCHIVE privilege(s) for this operation |
アーカイブディレクトリ作成
REDOログ用のアーカイブディレクトリを作成します。
1 2 3 4 5 |
$ mkdir -p /var/lib/mysql-redo-archive $ chown mysql:mysql /var/lib/mysql-redo-archive/ $ chmod 700 /var/lib/mysql-redo-archive/ $ ls -ld /var/lib/mysql-redo-archive/ drwx------ 2 mysql mysql 4096 Apr 19 12:26 /var/lib/mysql-redo-archive/ |
※事前に作成しない場合、Percona XtraBackupでバックアップ実行時に自動的に作成してくれますが、mysqlユーザにアクセス権限がない場所(/var/lib等)を親ディレクトリに指定していると以下のエラーになります。そのため事前に作成しておくのが好ましいです。
1 2 3 4 |
2024-04-19T12:23:15.913898+09:00 0 [Note] [MY-011825] [Xtrabackup] xtrabackup redo_log_arch_dir is set to backup1:/var/lib/mysql-redo-archive xtrabackup: Can't create directory '/var/lib/mysql-redo-archive' (OS errno 13 - Permission denied) 2024-04-19T12:23:15.917203+09:00 0 [ERROR] [MY-011825] [Xtrabackup] failed to fetch query result select innodb_redo_log_archive_start('', '1713496995914') : Label '' not found in server variable 'innodb_redo_log_archive_dirs' 2024-04-19T12:23:15.917426+09:00 0 [Note] [MY-011825] [Xtrabackup] Redo Log Archiving is not used. |
※datadirの中にアーカイブディレクトリを作成してしまうと以下のエラーになりました。
Percona XtraBackupはdatadir自体をバックアップするので、中にあると不都合らしいです。
1 |
2024-04-18T17:05:13.387862+09:00 0 [ERROR] [MY-011825] [Xtrabackup] failed to fetch query result select innodb_redo_log_archive_start('label1', '1713427513385') : Redo log archive directory '/var/lib/mysql/redo-archive/1713427513385' is in, under, or over server directory 'datadir' - '/var/lib/mysql/' |
1.MySQLでアーカイブディレクトリを設定する場合
MySQLシステム変数の設定
MySQLのinnodb_redo_log_archive_dirs
システム変数を設定します。
The innodb_redo_log_archive_dirs global variable contains labeled directories. The format is label:directory-path.
mysql> SET PERSIST innodb_redo_log_archive_dirs=’backup1:/var/lib/mysql-redo-archive/’;innodb_redo_log_archive_dirs グローバル変数には、ラベル付きディレクトリが含まれています。 形式はラベル:ディレクトリパスです。
※ラベルには任意の名前を指定します。指定しないこともできますが最初の:(コロン)は必要です。例:':/var/lib/mysql-redo-archive'
The label is an arbitrary identifier for the archive directory. It can be any string of characters, with the exception of colons (:), which are not permitted. An empty label is also permitted, but the colon (:) is still required in this case.
ラベルは、アーカイブ ディレクトリの任意の識別子です。 許可されないコロン (:) を除き、任意の文字列を使用できます。 空のラベルも許可されますが、この場合もコロン (:) が必要です。
1 2 3 4 5 6 7 8 9 10 |
mysql> SET GLOBAL innodb_redo_log_archive_dirs='backup1:/var/lib/mysql-redo-archive'; Query OK, 0 rows affected (0.01 sec) mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_redo_log_ar%'; +------------------------------+-------------------------------------+ | Variable_name | Value | +------------------------------+-------------------------------------+ | innodb_redo_log_archive_dirs | backup1:/var/lib/mysql-redo-archive | +------------------------------+-------------------------------------+ 1 row in set (0.04 sec) |
※ディレクトリ名の指定について、公式ドキュメント通りにbackup1:/var/lib/mysql-redo-archive/
のように末尾にスラッシュを入れても一応エラーにはなりませんが、ログを見るとスラッシュが二重になっています。
1 |
2024-04-19T12:32:37.239378+09:00 0 [Note] [MY-011825] [Xtrabackup] Waiting for archive file '/var/lib/mysql-redo-archive//1713497557192/archive.640767e5-d12a-11ee-8fe9-0242ac110002.000001.log' |
バックアップ実行
バックアップはmysqld
プロセス実行OSユーザ(デフォルトはmysql)で実行します。
※公式ドキュメントでは–-redo-log-arch-dir
オプションを使用した場合しか書かれていませんが、MySQLシステム変数を使用した場合もこの制限を受けます。
redo-log-arch-dir (…) To use this option, you must run Percona XtraBackup as the same owner as mysqld.
redo-log-arch-dir (…) このオプションを使用するには、mysqld と同じ所有者として Percona XtraBackup を実行する必要があります。
※rootユーザ等で実行すると以下のエラーになります。
1 |
2024-04-22T17:46:59.101907+09:00 0 [ERROR] [MY-011825] [Xtrabackup] failed to fetch query result select innodb_redo_log_archive_start('backup1', '1713775619099') : Cannot create redo log archive file '/var/lib/mysql-redo-archive/1713775619099/archive.640767e5-d12a-11ee-8fe9-0242ac110002.000001.log' (OS errno: 13 - Permission denied) |
suコマンド等でmysqlユーザにログインして、
バックアップを実行します。
1 2 3 4 5 6 7 |
$ su - mysql $ xtrabackup \ > --backup \ > --target-dir=/data/backups/ \ > --user=xtrabackup \ > --password='MyNewPass4!' \ > 2> /tmp/b0-with-redo-archiving-as-mysql-os-user.log |
以下のようなログが出ていればアーカイブ機能が使用できています。
尚、ログ内に書かれている一時ディレクトリと一時ファイル1713498738935/archive.640767e5-d12a-11ee-8fe9-0242ac110002.000001.log
については、すぐに削除される仕様ですので、lsコマンド等で確認できませんでした。
1 2 3 4 5 6 7 |
$ less /tmp/b0-with-redo-archiving-as-mysql-os-user.log ... 2024-04-19T12:52:18.935419+09:00 0 [Note] [MY-011825] [Xtrabackup] xtrabackup redo_log_arch_dir is set to backup1:/var/lib/mysql-redo-archive 2024-04-19T12:52:18.958481+09:00 0 [Note] [MY-011825] [Xtrabackup] Waiting for archive file '/var/lib/mysql-redo-archive/1713498738935/archive.640767e5-d12a-11ee-8fe9-0242ac110002.000001.log' $ ls -l /var/lib/mysql-redo-archive/ total 0 |
2.MySQLでアーカイブディレクトリを設定しない場合
MySQLのinnodb_redo_log_archive_dirs
システム変数を設定せずに、Percona XtraBackup 8.0.34-29から追加されたオプションである--redo-log-arch-dir
を使用してみます。
Percona XtraBackup 8.0.34-29 added the redo-log-arch-dir option. If the archiving directory is not configured in MySQL, Percona XtraBackup creates a temporary directory for the archive file.
Percona XtraBackup 8.0.34-29 では、redo-log-arch-dirオプションが追加されました。 MySQL でアーカイブ ディレクトリが構成されていない場合、Percona XtraBackup はアーカイブ ファイル用の一時ディレクトリを作成します。
MySQL側に変数は設定されていません。
1 2 3 4 5 6 7 |
mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_redo_log_ar%'; +------------------------------+-------+ | Variable_name | Value | +------------------------------+-------+ | innodb_redo_log_archive_dirs | | +------------------------------+-------+ 1 row in set (0.00 sec) |
–-redo-log-arch-dir
オプションについて
–-redo-log-arch-dir
オプションを使用する場合、内部的にSET文を実行する仕様のため、バックアップ用ユーザにSUPER
権限またはSYSTEM_VARIABLES_ADMIN
権限が必要です。
1 2 |
mysql> GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO 'xtrabackup'@'localhost'; Query OK, 0 rows affected (0.01 sec) |
--redo-log-arch-dir
オプションには、'backup1:/var/lib/mysql-redo-archive'
のようにinnodb_redo_log_archive_dirs
システム変数と同様の形式で設定します。バックアップ実行時に内部的にSET文が実行される仕様のためです。
※正しい形式で指定しなかった場合、以下のエラーになります。
1 |
2024-04-24T01:13:26.237367-00:00 0 [ERROR] [MY-011825] [Xtrabackup] failed to execute query 'SET GLOBAL innodb_redo_log_archive_dirs ="/var/lib/mysql-redo-archive"' : 1231 (42000) Variable 'innodb_redo_log_archive_dirs' can't be set to the value of '/var/lib/mysql-redo-archive' |
バックアップ実行
バックアップはmysqld
プロセス実行OSユーザ(デフォルトはmysql)で実行します。
suコマンド等でmysqlユーザにログインして、
バックアップを実行します。
1 2 3 4 5 6 7 8 |
$ su - mysql $ xtrabackup \ > --backup \ > --target-dir=/data/backups/ \ > --user=xtrabackup \ > --password='MyNewPass4!' \ > --redo-log-arch-dir='backup1:/var/lib/mysql-redo-archive' \ > 2> /tmp/b1-with-redo-archiving-as-mysql-os-user.log |
以下のようなログが出ていればアーカイブ機能が使用できています。
1 2 3 4 5 6 |
$ less /tmp/b1-with-redo-archiving-as-mysql-os-user.log ... 2024-04-19T13:07:59.150209+09:00 0 [Note] [MY-011825] [Xtrabackup] Setting up Redo Log Archiving to backup1:/var/lib/mysql-redo-archive 2024-04-19T13:07:59.153679+09:00 0 [Note] [MY-011825] [Xtrabackup] xtrabackup redo_log_arch_dir is set to backup1:/var/lib/mysql-redo-archive ... 2024-04-19T13:07:59.255663+09:00 0 [Note] [MY-011825] [Xtrabackup] Waiting for archive file '/var/lib/mysql-redo-archive/1713499679153/archive.640767e5-d12a-11ee-8fe9-0242ac110002.000001.log' |
バックアップ取得後もMySQL側に変数は設定されていません。
1 2 3 4 5 6 7 |
mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_redo_log_ar%'; +------------------------------+-------+ | Variable_name | Value | +------------------------------+-------+ | innodb_redo_log_archive_dirs | | +------------------------------+-------+ 1 row in set (0.00 sec) |
補足
MySQLとPercona XtraBackupの両方で設定した場合どうなるか?
以下、公式ドキュメントにも文言がありますが、MySQL側で構成されていないときのみPercona XtraBackup側のオプションが有効となります。
If the archiving directory is not configured in MySQL, Percona XtraBackup creates a temporary directory for the archive file.
MySQL でアーカイブ ディレクトリが構成されていない場合、Percona XtraBackup はアーカイブ ファイル用の一時ディレクトリを作成します。
そのため、MySQLのinnodb_redo_log_archive_dirs
システム変数が優先されて、Percona XtraBackupの--redo-log-arch-dir
オプションは無視されます。
公式ドキュメントについて
公式ドキュメントに以下のようなSELECT文が書かれており、バックアップ取得前に手動実行するコマンドなのか?と勘違いしそうですが、Percona XtraBackupでバックアップ実行時に内部的に実行されるコマンドなので、基本的に手動実行する意味はありません。
InnoDB redo log archiving – Percona XtraBackup
1 |
mysql> SELECT innodb_redo_log_archive_start('backup1','backup1'); |
また、手動実行の詳細については、弊社ブログ(MySQL8.0.17 新機能紹介:Redo ログのアーカイブについて – スマートスタイル技術ブログ)内で紹介していますので興味がある方は是非読んでみてください。
まとめ
REDOログのアーカイブ機能を使用することで、バックアップ実行中のMySQL サーバーのアクティビティ(REDOログの大量生成や、REDOログのI/O遅延等)を気にする必要がなくなります。
また、Percona XtraBackup 8.0.34-29で追加された–-redo-log-arch-dir
オプションを使用すればMySQLのシステム変数を設定することなく気軽にアーカイブ機能を使用することができます。
是非導入を検討してみてください。