データベースのメンテナンス・リカバリ

# はじめに
今回は、データベースのメンテナンスとリカバリについて記載します。

使用環境については前回の記事のものを流用します。

https://qiita.com/Yz6i1NrsEMtuL0f/items/f0eb997dea5714824fc8

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [メンテナンス](#メンテナンス)
1. [リカバリ](#リカバリ)
1. [参考文献](#参考文献)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# メンテナンス
## 事前準備
1. 前回作成した、「example」のデータベースに「user」テーブルを作成して1レコード挿入します。
```bash
mysql> USE example;
mysql> CREATE TABLE user(
    -> id int,
    -> username varchar(255));
mysql> INSERT INTO `user` VALUES (1,'testuser');
mysql> SELECT * FROM user;
```
結果
```bash
+------+----------+
| id   | username |
+------+----------+
|    1 | testuser |
+------+----------+
```

## dumpファイル作成
1. 上記テーブルのdumpファイルを作成します。今回は、rootユーザーの権限で「example」データベースのdumpファイルを作成します。
オプションで様々なものを指定できますが、今回は特につけずデータベースの構造とデータともにdumpファイルとして吐き出すようにします。

```bash
sh-4.4# mysqldump -u root -p example > example_database.sql
Enter password:
```
エラーが特に出なければ成功です。
2. 念の為コマンドを実行した階層のファイル一覧をみて、「example_database.sql」ができているか確認します
```bash
sh-4.4# ls -l
```
結果
```bash
-rw-r--r--   1 root root 1908 Dec 11 12:43 example_database.sql
```
dumpファイルが作成されてることが確認できました。

※dumpファイルの中身は下記のようになっています
よく見ると、CREATE TABLEや INSERT構文があることが確認できます。
```bash
-- MySQL dump 10.13  Distrib 8.0.31, for Linux (x86_64)
--
-- Host: localhost    Database: example
-- ------------------------------------------------------
-- Server version⇢   8.0.31

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `user`
--

DROP TABLE IF EXISTS `user`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `user` (
  `id` int DEFAULT NULL,
  `username` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
↩
--
-- Dumping data for table `user`
--
↩
LOCK TABLES `user` WRITE;
/*!40000 ALTER TABLE `user` DISABLE KEYS */;
INSERT INTO `user` VALUES (1,'testuser');
/*!40000 ALTER TABLE `user` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2022-12-11  0:51:52
```
仮にdumpファイル作成時に--no-dataのオプションをつけるとINSERTの構文がdumpファイルから消えて構造のみファイルとして吐き出すようになります.
```dump
-- MySQL dump 10.13  Distrib 8.0.31, for Linux (x86_64)
--
-- Host: localhost    Database: example
-- ------------------------------------------------------
-- Server version⇢   8.0.31

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `user`
--

DROP TABLE IF EXISTS `user`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `user` (
  `id` int DEFAULT NULL,
  `username` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2022-12-11  0:54:46
```



<a id="#Chapter2"></a>
# リカバリ
## 事前準備　
1.rootユーザーでログインして、「user」テーブルの削除を削除します
```bash
mysql> USE example;
mysql> DROP TABLE user;
```
結果
```bash
Query OK, 0 rows affected (0.03 sec)
```
2.削除されていることを確認します。
```bash
mysql> SHOW TABLES;
```
結果
```bash
Empty set (0.01 sec)
```
 「user」テーブルが削除されてデータベースが空になったことを確認できたのでdumpファイルを使用してリカバリしていきます。

## リカバリ
1.メンテナンスで作成したdumpファイルを使用しリカバリします。
「example」のデータベースを「example_database.sql」を使用してリカバリします。
```bash
sh-4.4# mysql -u root -p example < example_database.sql
Enter password: 
```
こちらもエラーが出なければ成功です。
2.「user」テーブルと中身のデータが復旧しているかを確認します。rootでログインしてテーブル一覧を確認します
```bash
mysql> USE example;
mysql> SHOW TABLES;
```
結果
```bash
+-------------------+
| Tables_in_example |
+-------------------+
| user              |
+-------------------+
1 row in set (0.00 sec)
```
「user」テーブルが作成されていることを確認できました。

3.次に「user」テーブルにデータが入っているかを確認します。
```bash
SELECT * FROM user;
```
結果
```bash
+------+----------+
| id   | username |
+------+----------+
|    1 | testuser |
+------+----------+
```
データも復元されていることが確認できました。


<a id="#reference"></a>
# 参考文献
https://dev.mysql.com/doc/refman/8.0/ja/mysqldump.html

https://www.sejuku.net/blog/82770