MariaDB upgradeで既存データを守る移行設計|binlogとGTIDの引き継ぎ手順

運営:リナックスマスター.JP(代表 宮崎智広)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Linuxtips > データーベース管理 > MariaDB upgradeで既存データを守る移行設計|binlogとGTIDの引き継ぎ手順
「MariaDBをバージョンアップしたらレプリカが止まった」
「アップグレード後にbinlogの位置が把握できなくなり、ポイントインタイムリカバリができなくなった」

こうした事故の共通点は、binlogとGTIDの状態を確認しないまま作業を進めたことにあります。MariaDBのアップグレード手順自体はそれほど難しくありませんが、binlogとGTIDをどう引き継ぐかを理解していなければ、データ整合性を損なうリスクが生じます。

この記事では、Rocky Linux 9系/Ubuntu 24.04 LTSを想定環境として、mariadb upgradeの実施手順と、binlog・GTIDを安全に引き継ぐ移行設計を解説します。マイナーバージョンアップ(例: 10.11.7 ~ 10.11.9)からメジャーバージョンアップ(例: 10.11 LTS → 11.4 LTS)、レプリカを持つ環境での段取りまでをカバーします。

この記事のポイント

・アップグレード前に gtid_current_pos の値を必ず記録する
・マイナーはパッケージ更新 + mariadb-upgrade コマンドで完結
・メジャーはリポジトリ切替・設定移行・GTID引き継ぎの3段構え
・レプリカ環境ではレプリカ → ソースの順に更新する


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

MariaDB upgradeで何が変わるのか|マイナーとメジャーの違い

MariaDBのバージョン番号は「メジャー.マイナー.パッチ」の3桁で表されます(例: 10.11.9)。アップグレードの難易度はこの桁によって大きく異なります。

・パッチバージョンアップ(例: 10.11.7 → 10.11.9): バグ修正・セキュリティパッチが中心。パッケージ更新だけで完結し、mariadb-upgradeの実行は不要なことが多い。
・マイナーバージョンアップ(例: 10.6 → 10.11): 機能追加あり。システムテーブルの変更が生じることがあるため、mariadb-upgradeを必ず実行する。
・メジャーバージョンアップ(例: 10.11 → 11.4): 設定ファイルの互換性確認・非推奨オプションの対処が必要。my.cnfの移行も行う。

いずれのケースでも共通して重要なのがbinlogとGTIDの扱いです。これらを適切に管理することで、アップグレード後もレプリケーションの継続性やポイントインタイムリカバリ(PITR)を維持できます。

binlogとGTIDの仕組みをおさらいする

アップグレードで引き継ぐべき2つの状態を整理します。

binlog(バイナリログ)とは
MariaDBがすべてのデータ変更操作を記録するログファイルです。/var/lib/mysql/ 配下に mysqld-bin.000001 のような形式でシーケンシャルに保存されます。
・レプリケーションのイベント転送に使用される
・mysqldumpと組み合わせてPITRを実現する
・log_bin = /var/log/mariadb/mysql-bin のようにmy.cnfで有効化する

GTID(Global Transaction ID)とは
MariaDBのGTIDはトランザクションを一意に識別する番号で、「ドメインID-サーバーID-シーケンス番号」(例: 0-1-1042)の形式を取ります。MySQL系のGTIDとは書式が異なります。
・gtid_current_pos: そのサーバーで最後にコミットされたGTID
・gtid_binlog_pos: binlogに書き込まれた最後のGTID
・gtid_slave_pos: レプリカとして受信した最後のGTID

アップグレード時にこれらの値をバックアップファイルと一緒に記録しておくことで、再起動後・再構成後に確実に引き継げます。

アップグレード前に確認すべきこと

1. 現在のバージョンとbinlog・GTID設定を確認する

作業前に現状のスナップショットを取ります。

# バージョン確認 mariadb --version # binlogが有効かどうかの確認 mariadb -e "SHOW VARIABLES LIKE 'log_bin%';" # 現在のbinlogファイルとポジション確認 mariadb -e "SHOW MASTER STATUS\G" # GTIDの確認(有効化している場合) mariadb -e "SHOW GLOBAL VARIABLES LIKE 'gtid%';"

出力例(環境により異なります):

# SHOW MASTER STATUS の出力例 *************************** 1. row *************************** File: mysql-bin.001042 Position: 395147 Binlog_Do_DB: Binlog_Ignore_DB: # gtid_current_pos の出力例 Variable_name: gtid_current_pos Value: 0-1-8841

これらの値はテキストファイルに控えておきます。GTIDが 0-1-8841 であれば、アップグレード後に同じ値が確認できることがゴールです。

2. innodb_fast_shutdown=0 でクリーンシャットダウンを準備する

MariaDBをアップグレード前に停止する際、InnoDBがダーティページを完全にフラッシュした状態(clean shutdown)にしておくと、スキーマ変換が確実に行われます。

# 実行中のサーバーに接続してフラッシュ設定を変更 mariadb -e "SET GLOBAL innodb_fast_shutdown = 0;" # 停止(設定変更後すぐに実施する) sudo systemctl stop mariadb

innodb_fast_shutdown = 0(スロー・シャットダウン)はデフォルトの 1 より時間がかかりますが、全データをディスクに書き出すため、旧バージョンの一時ファイルが新バージョンの起動を妨げるリスクが減ります。

3. フルバックアップとGTIDポジションを記録する

アップグレードは常に「復旧できる状態」から始めます。

# GTIDポジション付き論理バックアップ(mariadb-dump / mysqldump) # --master-data=2 はbinlogファイル名・ポジションをコメントとして埋め込む mariadb-dump \ --all-databases \ --single-transaction \ --master-data=2 \ --gtid \ -u root -p \ > /backup/pre-upgrade-$(date +%Y%m%d).sql # バックアップファイルの冒頭でGTID情報を確認 head -30 /backup/pre-upgrade-$(date +%Y%m%d).sql

--gtid オプションを付けると、ダンプファイルの冒頭に SET GLOBAL gtid_slave_pos='0-1-8841'; のようなGTID復元用コメントが埋め込まれます。メジャーアップグレードで一度アンインストールが必要な場合も、この値からGTIDポジションを復元できます。

マイナーバージョンアップ(例: 10.11.7 → 10.11.9)の手順

1. パッケージをアップデートする

同一メジャー系列内の場合は、リポジトリを変更せずそのままパッケージを更新します。

Ubuntu 24.04 LTS(APT)の場合:

sudo apt update sudo apt install mariadb-server

Rocky Linux 9 / RHEL 9(DNF)の場合:

sudo dnf update MariaDB-server

2. mariadb-upgrade を実行してシステムテーブルを更新する

パッケージ更新後にMariaDBを起動し、mariadb-upgrade(旧名: mysql_upgrade)を実行します。

sudo systemctl start mariadb sudo mariadb-upgrade -u root -p

出力例(環境により異なります):

MariaDB upgrade detected Phase 1/7: Checking and upgrading mysql database Processing databases mysql mysql.column_stats OK mysql.columns_priv OK ... Phase 7/7: Running 'FLUSH PRIVILEGES' OK

mariadb-upgrade は mysql.user テーブルや information_schema の内部構造を最新仕様に合わせます。エラーが出た場合は /var/log/mariadb/mariadb.log を確認してください。

3. binlog・GTIDの継続を確認する

再起動後、binlogの連続性とGTIDの値を確認します。

mariadb -e "SHOW MASTER STATUS\G" mariadb -e "SHOW GLOBAL VARIABLES LIKE 'gtid_current_pos';"

出力例(環境により異なります):

# binlogファイルは連続している(001042 → 001043 に進む) File: mysql-bin.001043 Position: 112 # GTIDはアップグレード前のシーケンス番号から継続 Variable_name: gtid_current_pos Value: 0-1-8841

GTIDのシーケンス番号がアップグレード前と同じ値であればGTIDが正常に引き継がれています。新しいbinlogファイルに切り替わっていても、シーケンス番号は継続しているため問題ありません。

メジャーバージョンアップ(例: 10.11 LTS → 11.4 LTS)の手順

メジャーアップグレードでは、リポジトリの変更とmy.cnfの設定見直しが必要です。

1. GTIDポジションを記録して論理バックアップを取得する

前述「アップグレード前に確認すべきこと」で行った手順を改めて実施します。特にGTIDの値は gtid_current_pos と gtid_slave_pos の両方を記録します。

# GTIDポジションを記録する mariadb -e "SHOW GLOBAL VARIABLES LIKE 'gtid_current_pos';" # ソース側 mariadb -e "SHOW GLOBAL VARIABLES LIKE 'gtid_slave_pos';" # レプリカ側(レプリカの場合) # フルバックアップ(--gtid付き) mariadb-dump \ --all-databases \ --single-transaction \ --master-data=2 \ --gtid \ -u root -p \ > /backup/pre-major-upgrade-$(date +%Y%m%d).sql # InnoDB クリーンシャットダウン mariadb -e "SET GLOBAL innodb_fast_shutdown = 0;" sudo systemctl stop mariadb

2. リポジトリを切り替えて新バージョンをインストールする

MariaDB公式のセットアップスクリプトを使うと、APT・DNFともにリポジトリを一括で切り替えられます。

Ubuntu 24.04 LTS(APT)の場合:

# リポジトリを 11.4 LTS に切り替え curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup \ | sudo bash -s -- --mariadb-server-version="mariadb-11.4" # インデックスを更新してインストール sudo apt update sudo apt install mariadb-server

Rocky Linux 9 / RHEL 9(DNF)の場合:

# 旧バージョンの MariaDB パッケージを削除 sudo dnf remove MariaDB-server MariaDB-client MariaDB-common # リポジトリを 11.4 LTS に切り替え curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup \ | sudo bash -s -- --mariadb-server-version="mariadb-11.4" # 新バージョンをインストール sudo dnf install MariaDB-server MariaDB-client

my.cnf の移行について:
インストール後、/etc/mysql/my.cnf(Ubuntu)または /etc/my.cnf(Rocky Linux)を開き、10.11系で使用していたオプションが11.4でも有効かどうか確認します。特に以下の点に注意してください。
・log_bin・server_id・binlog_format の設定はそのまま引き継いでよい
・gtid_strict_mode は11.4でも有効(変更なし)
・query_cache_* 系オプションは10.x系で廃止済みのため削除する
・plugin-load-add 等、バージョン依存のプラグイン行はリリースノートで要確認

3. mariadb-upgrade でシステムテーブルを更新する

sudo systemctl start mariadb sudo mariadb-upgrade -u root -p

MariaDB 11系でも mariadb-upgrade の役割は同じです。mysql_upgrade コマンドは11.x以降で非推奨となっているため、mariadb-upgrade を使います。

4. GTIDを引き継いで再起動確認する

# GTIDポジションの確認 mariadb -e "SHOW GLOBAL VARIABLES LIKE 'gtid_current_pos';" # バージョン確認 mariadb -e "SELECT VERSION();" # テーブルアクセス確認(代表的なテーブルを1つ選ぶ) mariadb -e "SELECT COUNT(*) FROM mysql.user;"

アップグレード前に記録した gtid_current_pos の値と照合します。MariaDBはシャットダウン時のGTIDポジションを mysql.gtid_slave_pos テーブルに永続化しているため、パッケージ更新・再インストールをしても同じデータディレクトリを使い続ける限りGTIDは自動的に引き継がれます。

レプリカを持つ環境でのアップグレード戦略

ソース(旧称マスター)とレプリカが存在する構成では、アップグレードの順序が重要です。

推奨する順序: レプリカ先行アップグレード
・手順1: レプリカをアップグレードする(ソースは稼働継続)
・手順2: レプリカが新バージョンで正常にレプリケーションを受信できるか確認する
・手順3: ソースをアップグレードする
・手順4: ソース・レプリカ両方のGTIDポジションを照合する

MariaDBはマイナーバージョン間でbinlogの後方互換性を保つ設計になっているため、新バージョンのレプリカが旧バージョンのソースからイベントを受信することは通常問題ありません。逆(新ソース → 旧レプリカ)は非推奨です。

レプリカでのGTID引き継ぎ確認コマンド:

# レプリカサーバーでレプリケーション状態を確認 mariadb -e "SHOW REPLICA STATUS\G" # または旧コマンド(10.5以前) # mariadb -e "SHOW SLAVE STATUS\G" # GTIDポジションの確認 mariadb -e "SHOW GLOBAL VARIABLES LIKE 'gtid_slave_pos';"

出力例(環境により異なります):

# SHOW REPLICA STATUS の抜粋 Using_Gtid: Slave_Pos Gtid_IO_Pos: 0-1-8842 Gtid_Slave_Pos: 0-1-8842 Seconds_Behind_Master: 0

Seconds_Behind_Master: 0 かつ Gtid_IO_Pos と Gtid_Slave_Pos が一致していれば、レプリカはソースに追いついており、GTIDが正常に引き継がれています。

トラブルシュート

「Table 'mysql.gtid_slave_pos' doesn't exist」が出た

mariadb-upgrade が未実行、または途中で失敗した場合に発生します。

# mariadb-upgrade を再実行する(--forceで強制上書き) sudo mariadb-upgrade --force -u root -p

--force オプションを付けると、アップグレード済みフラグを無視して強制的に再実行します。

「Unknown system variable 'gtid_current_pos'」が出た

GTIDが有効化されていないときに出るエラーです。my.cnfの [mysqld] セクションに以下を追加して再起動します。

[mysqld] gtid_strict_mode = ON log_bin = /var/log/mariadb/mysql-bin log_slave_updates = ON

GTIDを途中から有効にする場合は、既存のレプリケーション設定を一度リセットする必要があるため、事前にメンテナンスウィンドウを設けて実施してください。

アップグレード後にレプリカがつながらない

エラーメッセージを SHOW REPLICA STATUS\G の Last_IO_Error フィールドで確認します。典型的なケースとして次の2つがあります。
・GTIDポジションのギャップ: ソース側で PURGE BINARY LOGS によってレプリカが必要とするbinlogが削除されていた場合。バックアップから再同期が必要。
・server_id の重複: ソースとレプリカの server_id が同じになっている場合。my.cnfで値を変えて再起動する。

binlogとGTIDを使ったLinuxサーバー上のデータベース運用については、Linuxサーバー構築セミナーでも実務の設計思想から体系的に扱っています。

本記事のまとめ

場面 実施内容 確認コマンド
アップグレード前(全共通) GTIDポジション記録・フルバックアップ取得・innodb_fast_shutdown=0設定 SHOW GLOBAL VARIABLES LIKE 'gtid_current_pos';
マイナーバージョンアップ パッケージ更新 → mariadb-upgrade 実行 sudo mariadb-upgrade -u root -p
メジャーバージョンアップ リポジトリ切替 → パッケージ更新 → my.cnf確認 → mariadb-upgrade mariadb -e "SELECT VERSION();"
アップグレード後(GTID確認) gtid_current_pos がアップグレード前の値と一致しているか照合 SHOW GLOBAL VARIABLES LIKE 'gtid_current_pos';
レプリカ環境 レプリカ先行でアップグレード → SHOW REPLICA STATUS でGTID照合 SHOW REPLICA STATUS\G
トラブル時 mariadb-upgrade --force で再実行・server_id重複を確認 SHOW VARIABLES LIKE 'server_id';

mariadb upgradeは「パッケージを入れ替えてmariadb-upgradeを走らせるだけ」と思われがちですが、binlogとGTIDの状態管理を一つひとつ確認することで、アップグレード後のデータ整合性とレプリケーションの継続性が保証されます。メジャーアップグレードの前には必ず論理バックアップとGTIDポジションの記録を残すことを習慣にしてください。

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、
データベース運用・バックアップ設計・レプリケーション管理など、実務直結のLinuxスキルをハンズオンで習得できる2日間のセミナーを開催しています。
>> Linux Master Pro Seminar の詳細・申込はこちら

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録

運営

リナックスマスター.JP(代表 宮崎智広)

株式会社イーネットマーキュリーが運営するLinux教育サイトです。代表の宮崎智広は現役のLinuxサーバー管理者として20年以上の実務経験を持ち、累計3,100名以上のエンジニアを指導してきました。実践型のLinuxセミナーや無料マニュアルの配布を通じてLinux人材の育成に取り組んでいます。