今日はなにの日。

気になったこと勉強になったことのメモ。

今日は、データベースを誤って削除してみたの日。

目次

とある日

このツイートのハッシュダグ”IT”のほかのツイート見てたら、

以下のツイートを見つけた。

見た瞬間やばいなと思いつつ、これやっても戻せるよね・・・?

そういえば、DROPしたもの戻したことないな。

ってことで、やってみよ。

実行環境

下準備

削除されるデータベース作成

まずは、削除するデータベースを作成します。

mysql> create database hoge;
Query OK, 1 row affected (0.15 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| hoge               |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

作成完了。

削除用テーブル作成

一応、適当なテーブルも作成します。

mysql> use hoge;
Database changed
mysql> create table test(id char(0));
Query OK, 0 rows affected (0.09 sec)

mysql> show tables; +----------------+ | Tables_in_hoge | +----------------+ | test | +----------------+ 1 row in set (0.01 sec)

削除用テストデータ作成

テストデータ挿入

mysql> insert into test values('');
Query OK, 1 row affected (0.88 sec)

mysql> select * from test; +------+ | id | +------+ | | +------+ 1 row in set (0.00 sec)

データ削除

データベースを削除する前にさきほど、挿入した適当なデータを消してもとに戻す。

データ削除は何回かやったことあるので簡単。

削除フェーズ

mysql> delete from test;
Query OK, 1 row affected (0.03 sec)

mysql> select * from test; Empty set (0.00 sec)

戻すフェーズ(?)

rollbackで戻そうとしたら、autocommitが有効になっててさきほどのDELETE文がcommitされていた・・・。

どうにかもどしたいと色々と調べてみたら、データベースのバックアップもとってないしバイナリログも取得していないことに気づいた。

ということで、バックアップの取得とバイナリログ自動取得の設定に変更する。

寄り道

バックアップ取得

データを削除するなら、バックアップはしっかり取りましょう。

今後の教訓として、生きていきたいと思います。

[test@localhost ~]$ mysqldump -uroot -p -hlocalhost -B hoge > test

[test@localhost ~]$ ls -l total 12480 -rw-rw-r--. 1 test test 18332 Nov 14 2019 index.html -rwxrwxr-x. 1 test test 70 Apr 10 00:15 mysqlpass -rw-r--r--. 1 root root 9731680 May 23 2019 phpMyAdmin-4.4.15.10-all-languages.tar.gz -rw-rw-r--. 1 test test 1980 Aug 6 01:34 test -rw-rw-r--. 1 test test 1262 Jul 28 2019 world.sql -rw-rw-r--. 1 test test 16 Jul 28 2019 world.sql.zip

バイナリログ取得

[test@localhost ~]$sudo vi /etc/my.cnf

my.cnfの設定ファイルに下記の項目を追加する。

log_bin = 0
autocommit = 0

  • log_bin

記述するだけで、バイナリログが取得される。

  • autocommit

自動コミットモード (autocommit)の切り替えを行う設定

これを、OFFにしたいので0に設定する。

ログ確認

取得されたログを確認する。

defaultでは下記のディレクトリにある。

保存場所の指定できるらしいが今回は割愛します。

[test@localhost ~]$ cd /var/lib/mysql
[test@localhost mysql]$ sudo ls -l
total 177720
-rw-r-----. 1 mysql mysql      178 Aug  6 00:45 0.000001
-rw-r-----. 1 mysql mysql      155 Aug  6 00:45 0.000002
 

データベースを誤って削除する

削除するのはすごく簡単。

さきほど、バックアップもとったので安心して削除できます。

mysql> drop database hoge;
Query OK, 1 row affected (0.50 sec)

mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | lcd | | mysql | | performance_schema | | sys | | tatujin | | test | +--------------------+ 7 rows in set (0.00 sec)

無事になくなりました。

リストア作業

[test@localhost ~]$ mysql -u root -p hoge < test
Enter password:
ERROR 1049 (42000): Unknown database 'hoge'
[test@localhost ~]$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.18 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database hoge2 -> ; Query OK, 1 row affected (0.03 sec)

mysql> exit Bye [test@localhost ~]$ mysql -u root -p hoge2 < test Enter password: [test@localhost ~]$ mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 13 Server version: 8.0.18 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases; +--------------------+ | Database | +--------------------+ | hoge | | hoge2 | | information_schema | | lcd | | mysql | | performance_schema | | sys | | tatujin | | test | +--------------------+ 9 rows in set (0.00 sec)

mysql> use hoge Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A

Database changed mysql> show tables; +----------------+ | Tables_in_hoge | +----------------+ | test | +----------------+ 1 row in set (0.00 sec)

mysql> select * from test; Empty set (0.00 sec)

mysql -u root -p hoge < testこの一行でデータベースを削除する前に戻せるはずだったのだが、hogeがないとエラーが出た。

まぁ、だろうな。どうしようと思い。

適当なデータベースを指定すればいいかと思い。

create database hoge2でデータベースを作成。

すると、問題なく実行できた。

そして、データベースの確認テーブルの確認をして問題なく戻っていることが確認できた。

知識不足を実感した。

もっと、色々と触ってみないと。

MySQLのリストア作業を行ったが、ほかのDBMSではやり方が違ったりするのでOracleでも試したみたい。

最初のツイート見る限りバックアップ取得してないと戻せないですね。

バックアップとログの収集は忘れず設定しましょう。

趣味で構築してたMySQLを使用してたのでそこらへんの設定が甘かった。

MySQLの初期設定でしておくといいこととかも今度調べてみたい。