お金をかけずにサーバーの勉強をしよう

MySQL障害復旧 (MySQL Shellによる論理リストア編)

2024年5月8日

メニューへ戻る

バックアップは戻せてこそ華!

MySQLバックアップ(MySQL Shellによる論理バックアップ編)」で DBのバックアップができましたので、これを使って MySQLの障害復旧をしてみます。

先の論理バックアップで取得したファイルはこれらのものになっています。

subro@UbuntuServer2404-2:~$ ls -l mysqlbackup
合計 52
-rw-r----- 1 subro subro  372  5月  7 19:20 @.done.json
-rw-r----- 1 subro subro  877  5月  7 19:20 @.json
-rw-r----- 1 subro subro  237  5月  7 19:20 @.post.sql
-rw-r----- 1 subro subro  237  5月  7 19:20 @.sql
-rw-r----- 1 subro subro 2599  5月  7 19:20 @.users.sql
-rw-r----- 1 subro subro  315  5月  7 19:20 subrotest.json
-rw-r----- 1 subro subro  578  5月  7 19:20 subrotest.sql
-rw-r----- 1 subro subro  578  5月  7 19:20 subrotest@subrotesttable.json
-rw-r----- 1 subro subro  652  5月  7 19:20 subrotest@subrotesttable.sql
-rw-r----- 1 subro subro   16  5月  7 19:20 subrotest@subrotesttable@0.tsv.zst
-rw-r----- 1 subro subro    8  5月  7 19:20 subrotest@subrotesttable@0.tsv.zst.idx
-rw-r----- 1 subro subro    9  5月  7 19:20 subrotest@subrotesttable@@1.tsv.zst
-rw-r----- 1 subro subro    8  5月  7 19:20 subrotest@subrotesttable@@1.tsv.zst.idx

MySQLから一旦 [subrotest]データベースを削除して、このバックアップから復活させてみます。

では削除から。

せっかくですからこれも MySQL Shellでやりましょうか。

subro@UbuntuServer2404-2:~$ mysqlsh -h localhost -u root -p
Please provide the password for 'root@localhost':MySQLの[root]ユーザーのパスワードを入れる
ave password for 'root@localhost'? [Y]es/[N]o/Ne[v]er (default No): N  ← パスワードは覚えさせませんでした。

MySQL Shell 8.4.0

Copyright (c) 2016, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.

Type '\help' or '\?' for help; '\quit' to exit.
Creating a session to 'root@localhost'
Fetching global names for auto-completion... Press ^C to stop.
Your MySQL connection id is 9 (X protocol)
Server version: 8.4.0 MySQL Community Server - GPL
No default schema selected; type \use  to set one.

 MySQL  localhost:33060+ ssl  SQL > drop database subrotest;
Query OK, 1 row affected (0.0493 sec)

 MySQL  localhost:33060+ ssl  SQL > show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.0010 sec)

[subrotest]データベースが無くなりましたんで、引き続きリカバリをします。

 MySQL  localhost:33060+ ssl  SQL > SET GLOBAL local_infile=on;  ← ローカルファイルを読むのにこのグローバル変数を[ON]にしておく必要があるようです。
Query OK, 0 rows affected (0.0004 sec)

 MySQL  localhost:33060+ ssl  SQL > \py

 MySQL  localhost:33060+ ssl  Py > util.load_dump('mysqlbackup')  ← ['mysqlbackup']で[./mysqlbackup/@.json]ファイルを読むようです。
Loading DDL and Data from 'mysqlbackup' using 4 threads.
Opening dump...
Target is MySQL 8.4.0. Dump was produced from MySQL 8.4.0
Scanning metadata - done
Checking for pre-existing objects...
Executing common preamble SQL
Executing DDL - done
Executing view DDL - done
Starting data load
Executing common postamble SQL
100% (7 bytes / 7 bytes), 0.00 B/s (0.00 rows/s), 1 / 1 tables done
Recreating indexes - done
2 chunks (1 rows, 7 bytes) for 1 tables in 1 schemas were loaded in 0 sec (avg throughput 7.00 B/s, 1.00 row/s)
2 DDL files were executed in 0 sec.
Data load duration: 0 sec
Total duration: 0 sec
0 warnings were reported during the load.

リカバリできてそうですね。

[subrotest]データベースができているか見てみます。

 MySQL  localhost:33060+ ssl  Py > \sql

 MySQL  localhost:33060+ ssl  SQL > show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| subrotest          |
| sys                |
+--------------------+
5 rows in set (0.0008 sec)

ありました。

[subrotesttable]テーブルがあるか見てみます。

 MySQL  localhost:33060+ ssl  SQL > use subrotest;

 MySQL  localhost:33060+ ssl  subrotest  SQL > select * from subrotesttable;
+--------+
| name   |
+--------+
| Tanaka |
+--------+
1 row in set (0.0007 sec)

テーブルも戻っていますね。

MySQL Shellから出ます。

 MySQL  localhost:33060+ ssl  subrotest  SQL > \quit
 Bye!

終わりました。


==========
とりあえず戻すことはできましたが「インスタンスバックアップからその一部であるデータベースだけを戻すのはこれで良いのかな?」って疑問は残りましたね。

load_dump関数の使い方はマニュアルにしっかり買いてあって、別のインスタンスに持っていったり、1つのテーブルだけ単品で戻したりとかできそうですが、まだまだお勉強が必要だなって想いました。

MySQL Shellの使用に慣れてくると、SQL実行と Python関数の実行を交互にやるのもそんなに苦ではない感じもしました。

MySQL Shellがどうのというより、こなれた新機能が PythonとJavaScriptで提供されて、MySQL Shellを使わざるを得ないんじゃないの?選択肢はないんじゃない?って印象もあります。

2024年5月になってもインターネットには「MySQL Shellをやってみた」系のブログポストも少なく、ノウハウが積み上がっていくのはこれからなのかな〜と思います。
(だけどお勉強は待った無しの感じ)


Amazonや楽天で書籍を探してみてはいるんですが、MySQL Shell単体のってないですね。
今の所 Ver.8.4のオフィシャルドキュメントは英語のしかないし、それが結構難解だしで、結構大変ですわ、コレ。