Centos 7 MySQLデータベースのバックアップとリカバリを実現


概要
MySQLデータベースのバックアップは論理バックアップと物理バックアップに分けられ、論理バックアップツールは主にmysqldumpであり、物理バックアップツールは主にxtrabackupであり、2つのバックアップ方式にはそれぞれメリットとデメリットがある.
バックアップツール
mysqldump
xtrabackup
メリット
ホット・バックアップとインクリメンタル・バックアップをサポートし、ディスク容量が小さい
ホット・バックアップとインクリメンタル・バックアップをサポートし、業務影響が小さく、ダウンタイムが短い.
欠点
業務影響が大きく、ダウンタイムが長い
必要なディスク容量が大きい
使用シーン1)データ量が多く、業務への影響が少ない場合、バックアップデータを保存するのに十分なスペースがある場合はxtrabackup 2を使用)データ量が少なく、ディスク容量も多くない場合はmysqldump 3を使用)ダウンタイムの要求が短い場合はxtrabackupを使用してバックアップする
前期準備
Centos 7仮想マシンを2台用意し、IPアドレスとhostnameを構成し、システム時間を同期し、ファイアウォールとselinuxを閉じ、IPアドレスとhostnameマッピングを構成する
hostname
ip
master
192.168.29.132
bak
192.168.29.138
MySQLデータベースのインストール注意:このマシンにインストールされているMySQLバージョンは8.0.17です.
#    mysql yum 
[root@master ~]# yum install mysql mysql-server -y
[root@bak ~]# yum install mysql mysql-server -y

masterノードデータベースの作成とデータの追加
mysql> create database test_db;
mysql> use test_db;
mysql> create table test(id int primary key);
mysql> insert into test values(1);
mysql> insert into test values(2);
mysql> insert into test values(3);
mysql> insert into test values(4);
mysql> insert into test values(5);
mysql> insert into test values(6);
mysql> insert into test values(7);

MySQL独自のツール
マスターバックアップデータ
[root@master ~]# mysqldump -uroot -p test_db > /tmp/a.sql

# sql     bak     
[root@master ~]# scp /tmp/a.sql  [email protected]:/tmp/

bakノードリカバリデータ
mysql> create database test_db;
mysql> use test_db;
mysql> source /tmp/a.sql

#      
mysql> select * from test;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
|  7 |
+----+
7 rows in set (0.00 sec)

xtrabackupツール
インストール
[root@master ~]# yum install epel -y
[root@master ~]# yum install xtrabackup -y

フル・バックアップ
マスターによるフルバックアップ
[root@master ~]# xtrabackup --backup --user='root' --password='your_password'  --target-dir=/backup/full

#   bak  
[root@master ~]# scp -r /backup/full/ [email protected]:/tmp/

bakによるバックアップ・リカバリ
#    datadir    
[root@bak ~]# rm -rf /var/lib/mysql/*
#    
[root@bak ~]# xtrabackup --copy-back  --target-dir=/tmp/full/ --datadir=/var/lib/mysql/
#  datadir  
[root@bak ~]# chown -R mysql.mysql /var/lib/mysql
#  mysql  
[root@bak ~]# systemctl restart mysqld

バックアップ・リカバリ結果の検証
mysql> select * from test_db.test;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
|  7 |
+----+
7 rows in set (0.03 sec)

インクリメンタルバックアップ
適切なデータの追加
mysql> insert into test values(8);
mysql> insert into test values(9);

インクリメンタルバックアップ
[root@master ~]# xtrabackup --backup --user='root' --password='your_password' --target-dir=/backup/inc1/  --incremental-basedir=/backup/full/

フル・バックアップとインクリメンタル・バックアップのデータ・サイズの比較
[root@master ~]# du -h /backup/full
231M    full
[root@master ~]# du -h /backup/inc1/
14M /backup/inc1/

バックアップのリストア
#     
[root@master ~]# scp -r /backup/inc1/ [email protected]:/tmp/
#  datadir
[root@bak ~]# rm -rf /var/lib/mysql/*

#        
[root@bak ~]# xtrabackup --prepare --apply-log-only --target-dir=/tmp/full/
#      
[root@bak ~]# xtrabackup --prepare --target-dir=/tmp/full/ --incremental-dir=/tmp/inc1/
#    
[root@bak ~]# xtrabackup --copy-back  --target-dir=/tmp/full/ --datadir=/var/lib/mysql/
#    
[root@bak ~]# chown -R mysql.mysql /var/lib/mysql
#    
[root@bak ~]# systemctl restart mysqld

テスト検証
mysql> select * from test_db.test;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
|  7 |
|  8 |
|  9 |
+----+
9 rows in set (0.00 sec)