今日は、データベースを誤って削除してみたの日。
目次
とある日
このツイートのハッシュダグ”IT”のほかのツイート見てたら、
以下のツイートを見つけた。
#ITちびまる子ちゃん
— チェンジニア@社畜ウサギ (@syauichi) 2020年6月10日
えぇー!drop databaseしちゃったの?バックアップも残ってないの? pic.twitter.com/L9RVBiD8mn
見た瞬間やばいなと思いつつ、これやっても戻せるよね・・・?
そういえば、DROPしたもの戻したことないな。
ってことで、やってみよ。
実行環境
- Oracle VM VirtualBox 6.0
- OS CentOS7
- DBMS MySQL8.0
下準備
削除されるデータベース作成
まずは、削除するデータベースを作成します。
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 - GPLCopyright (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の初期設定でしておくといいこととかも今度調べてみたい。