🖥
mysqldump コマンド & mysqlコマンドでデータベースをバックアップ・復元する ( そもそもmysqldumpとは? )
バックアップのコマンド例
例: 全てのデータベースをバックアップする場合
mysqldump -u root -p --all-databases > db.dump
mysqldumpコマンドは現在のデータベースの状態を、SQLコマンドとして標準出力する。
(SQLコマンドが出力されるところがツボだ! バックアップ用の特殊形式のデータとかではないのだ)
ファイルへの記録
上のコマンド例では、それをシェルのリダイレクト ( >
) で、ファイルとして記録してバックアップにしている。ファイル名やファイルの場所は何でも良い。
リダイレクト ( >
) をしないと、単に標準出力にSQLコマンドが吐き出されるので、見てみると良いだろう。
復元のコマンド例
mysql -u root -p < db.dump
これは先程のバックアップファイルをリダイレクト ( <
) で読んで、mysqlコマンドとして実行しているだけだ。
復元の場合はmysqldumpコマンドではないことに注意。
なぜならmysqldumpで作ったファイルは「SQLコマンドの羅列」なので、SQLコマンドを実行することが復元になるからだ。
なぜデータベースが復元できるのか?
mysqldumpで出力されるSQLの例を見てみよう。
テーブルを削除してから、元のスキーマ通りに再度テーブル作成をするSQLコマンドが出力されているのが分かる。
さらにその後に、INSERTで元のデータを追加している行も分かるだろう。
こうやってSQLコマンドをうまく使って、データ復元ができるわけだ。(スマートな仕組み!)
...
DROP TABLE IF EXISTS `posts`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `posts` (
`id` bigint NOT NULL AUTO_INCREMENT,
`content` varchar(255) DEFAULT NULL,
`avatar` varchar(255) DEFAULT NULL,
`created_at` datetime(6) NOT NULL,
`updated_at` datetime(6) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `posts`
--
LOCK TABLES `posts` WRITE;
/*!40000 ALTER TABLE `posts` DISABLE KEYS */;
INSERT INTO `posts` VALUES (1,NULL,NULL,'2022-07-14 22:44:00.105766','2022-07-14 22:44:00.105766'),(2,NULL,NULL,'2022-07-14 22:44:01.466996','2022-07-14 22:44:01.466996'),(3,'AAA',NULL,'2022-07-14 22:44:07.754683','2022-07-14 22:44:07.754683'),(4,'AAA',NULL,'2022-07-14 22:44:08.422140','2022-07-14 22:44:08.422140'),(5,'AAA',NULL,'2022-07-14 22:44:08.854483','2022-07-14 22:44:08.854483');
/*!40000 ALTER TABLE `posts` ENABLE KEYS */;
UNLOCK TABLES;
...
上の例は一部だが、全文を見るとスキーマデータの復元も含めて色々やってくれているのが分かると思う。
ちなみにコメント行にはもちろん動作には影響がない。
参考
チャットメンバー募集
何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。
公開日時
2022-07-15
Discussion