背景
- DBサーバの空き容量を確保するために、サイズが大きく不要なDBテーブルのdropは必要となってくる
- 例えば、数年分のデータの移行が終了した後、データの削除等
- DBテーブルのサイズが大きいため、単純にDROPしたら、IOが詰まる。
- 上記問題を解決するために、下記手順に従い削除作業をするとつまらない
二つのパターン
- パターン1:まったく同じの空テーブルの用意が必要
- データの中身が不要だが、アクセスするモジュールが存在する限り、用意したほうがいいと思われる。
#MySQLに入り、該当テーブルの定義を調べる$ /usr/local/mysql/bin/mysqlmysql> SHOW CREATE TABLE comp_event.t_hoge \G;*************************** 1. row ***************************Table: t_hogeCreate Table: CREATE TABLE `t_hoge` (`id` int(11) NOT NULL auto_increment,`value` int(11) default NULL,PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=latin11 row in set (0.00 sec)
#同じの空テーブルを定義mysql> Create Table: CREATE TABLE `t_hoge_blank` (-> `id` int(11) NOT NULL auto_increment,-> `value` int(11) default NULL,-> PRIMARY KEY (`id`)-> ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
ステップ2:テーブルをSWAP(master)
#MySQLに入り、テーブルを入れ替える(※アトミック性を保つように)$ /usr/local/mysql/bin/mysqlmysql> RENAME TABLE t_hoge TO t_hoge_bk, t_hoge_blank TO t_hoge;
ステップ3:hardlinkを作成(master/slave)
master/slave両方実施
InnoDBテーブル
#innodb_data_home_dirを確認$ cat /etc/my.cnf |grep innodb_data_home_dirinnodb_data_home_dir = /home/mysql
#frmファイルとibdファイルを確認$ sudo ls -l <innodb_data_home_dir>/comp_event/ |grep t_hoge_bk-rw-rw---- 1 mysql mysql 8911 Sep 7 14:06 t_hoge_bk.frm-rw-rw---- 1 mysql mysql 180224 Sep 7 14:13 t_hoge_bk.ibd
#ibdファイルのhardlinkを作成$ ln <innodb_data_home_dir>/comp_event/t_hoge_bk.ibd /tmp/t_hoge_hl
#hardlinkを確認$ ls -l <innodb_data_home_dir>/comp_event/t_hoge_bk.ibd && ls -l /tmp/t_hoge_hl
MyISAMテーブル
#data_dirを確認$ cat /etc/my.cnf |grep datadirdata_dir = /home/mysql
#frmファイルとMYI・MYDファイルを確認$ sudo ls -l <data_dir>/comp_event/ |grep t_hoge_bk-rw-rw---- 1 mysql mysql 8911 Sep 7 14:06 t_hoge_bk.frm-rw-rw---- 1 mysql mysql 8024 Sep 7 14:13 t_hoge_bk.MYI-rw-rw---- 1 mysql mysql 180224849 Sep 7 14:13 t_hoge_bk.MYD
#ibdファイルのhardlinkを作成$ ln <data_dir>/comp_event/t_hoge_bk.ibd /tmp/t_hoge_hl
#hardlinkを確認$ ls -l <data_dir>/comp_event/t_hoge_bk.ibd && ls -l /tmp/t_hoge_hl
ステップ4:テーブルのDROP(master)
#MySQLに入り、該当テーブルをDROP$ /usr/local/mysql/bin/mysqlmysql> DROP TABLE IF EXISTS comp_event.t_hoge_bk;
#データファイルを確認$ sudo ls -l <data_dir or innodb_data_home_dir="">/comp_event/ |grep t_hoge_bk#何もないことを確認
ステップ5:データファイルのionice削除(master/slave)
master/slave両方実施
#MySQLに入り、該当テーブルをDROP
$ ionice -c3 rm /tmp/t_hoge_hl</data_dir></data_dir></data_dir></data_dir></innodb_data_home_dir></innodb_data_home_dir></innodb_data_home_dir>
・パターン2の対応(空テーブルの用意が不要)
event1クラスターのcomp_eventデータベースのt_hogeというテーブルを例とする。
ステップ1:hardlinkの作成(master/slave)
master/slave両方実施
InnoDBテーブル
#innodb_data_home_dirを確認$ cat /etc/my.cnf |grep innodb_data_home_dirinnodb_data_home_dir = /home/mysql
#frmファイルとibdファイルを確認$ sudo ls -l <innodb_data_home_dir>/comp_event/ |grep t_hoge-rw-rw---- 1 mysql mysql 8911 Sep 7 14:06 t_hoge.frm-rw-rw---- 1 mysql mysql 180224 Sep 7 14:13 t_hoge.ibd
#ibdファイルのhardlinkを作成$ ln <innodb_data_home_dir>/comp_event/t_hoge.ibd /tmp/t_hoge_hl
#hardlinkを確認$ ls -l <innodb_data_home_dir>/comp_event/t_hoge.ibd && ls -l /tmp/t_hoge_hl
MyISAMテーブル
#innodb_data_home_dirを確認$ cat /etc/my.cnf |grep datadirdata_dir = /home/mysql
#frmファイルとibdファイルを確認$ sudo ls -l <data_dir>/comp_event/ |grep t_hoge-rw-rw---- 1 mysql mysql 8911 Sep 7 14:06 t_hoge.frm-rw-rw---- 1 mysql mysql 8024 Sep 7 14:13 t_hoge.MYI-rw-rw---- 1 mysql mysql 180224849 Sep 7 14:13 t_hoge.MYD
#ibdファイルのhardlinkを作成$ ln <data_dir>/comp_event/t_hoge.MYD /tmp/t_hoge_hl
#hardlinkを確認$ ls -l <data_dir>/comp_event/t_hoge.MYD && ls -l /tmp/t_hoge_hl
ステップ2:テーブルのDROP(master)
#MySQLに入り、該当テーブルをDROP$ /usr/local/mysql/bin/mysqlmysql> DROP TABLE IF EXISTS comp_event.t_hoge;
#データファイルを確認$ sudo ls -l <data_dir or innodb_data_home_dir="">/comp_event/ |grep t_hoge
#何もないことを確認
ステップ3:データファイルのionice削除(master/slave)
master/slave両方実施
不要なアラートを減らすため、該当サーバの監視を一時的に外す。
#MySQLに入り、該当テーブルをDROP$ ionice -c3 rm /tmp/t_hoge_hl</data_dir></data_dir></data_dir></data_dir></innodb_data_home_dir></innodb_data_home_dir></innodb_data_home_dir>
コメント